数乐盈软件专家

裁判文书网数据采集

双色球软件下载

彩票软件下载_手机软件下载

先上代码为敬

#!/usr/bin/env python# -*- coding:utf-8 -*-# 裁判文书网爬虫(requests版)import requestsimport execjsfrom selenium import webdriverfrom time import sleepimport randomclass wenshu:    def __init__(self):        self.headers = {            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '                          'Chrome/89.0.4389.128 Safari/537.36 ',            'Host': 'wenshu.court.gov.cn',            'Origin': 'https://wenshu.court.gov.cn',            'sec-ch-ua': 'Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99',            'Referer': 'https://wenshu.court.gov.cn/website/wenshu/181217BMTKHNT2W0/index.html?pageId=27cc21'                       '6a1f2f1f52fb1f145752d59ee2&s21=%E7%BB%8F%E6%B5%8E%E7%8A%AF%E7%BD%AA',            'Accept': '*/*',            'Accept-Encoding': 'gzip, deflate, br',            'Accept-Language': 'zh-CN,zh;q=0.9',            'Connection': 'keep-alive',            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',            'Cookie': ''        }        self.url = 'https://wenshu.court.gov.cn/website/parse/rest.q4w'        self.request = requests.session()        # 初始化execjs        node = execjs.get()        # 加载需要执行的js文件        self.ctx = node.compile(open('decrypt_content.js', encoding='utf-8').read())        chrome_options = webdriver.ChromeOptions()        # 让浏览器不显示自动化测试        chrome_options.add_argument('disable-infobars')        self.chrome = webdriver.Chrome(executable_path='../../driver/chromedriver.exe', options=chrome_options)    def send_login(self):        # 模拟登陆获取到登陆的Cookie        self.chrome.get(url='https://wenshu.court.gov.cn/website/wenshu/181010CARHS5BS3C/index.html?open=login')        self.chrome.implicitly_wait(10)        # 最大化浏览器        self.chrome.maximize_window()        # 因为登录框在iframe框中,需要先切换到iframe中        self.chrome.switch_to.frame('contentIframe')        self.chrome.find_element_by_xpath('//*[@id="root"]/div/form/div[1]/div[1]/div/div/div/input').send_keys('username')        self.chrome.find_element_by_xpath('//*[@id="root"]/div/form/div[1]/div[2]/div/div/div/input').send_keys('password')        sleep(random.randint(1, 5))        self.chrome.find_element_by_xpath('//*[@id="root"]/div/form/div[3]/span').click()        sleep(5)        xpath_search_base = '//div[@class="header"]/div[@class="item_table"]//div[@class="search-con clearfix"]/div[1]'        self.chrome.find_element_by_xpath(xpath_search_base + '/div[2]/input').send_keys('经济犯罪')        sleep(random.randint(1, 5))        self.chrome.find_element_by_xpath(xpath_search_base + '/div[3]').click()        sleep(random.randint(1, 5))        self.chrome.refresh()        self.chrome.implicitly_wait(10)        return self.chrome.get_cookies()    def send_request(self, ws_params):        return self.request.post(url=self.url, headers=self.headers, data=ws_params).json()    def decrypt_response(self, ws_content):        # 解密数据接口返回的加密内容        # 解密的key        secret_key = ws_content['secretKey']        # 加密的数据内容        result = ws_content['result']        # 需要执行的方法名,第一个参数加密内容,第二个参数key        func_name = 'DES3.decrypt("{0}", "{1}")'.format(result, secret_key)        # 获取解密后的数据内容        # 此处在windows下执行有报编码错误问题,需要将源码下的subprocess.py文件里的encoding改成utf-8        return self.ctx.eval(func_name)if __name__ == '__main__':    wenshu = wenshu()    # 获取登陆后的Cookie    cookies = wenshu.send_login()    # 将cookie转换为字符串    json_cookie = ''    for cookie in cookies:        name = cookie['name']        value = cookie['value']        json_cookie += name+'='+value+'; '    # 退出selenium浏览器自动化    # wenshu.chrome.quit()    print(json_cookie)    wenshu.headers['Cookie'] = json_cookie    # 通过加载js生成ciphertext参数    ciphertext = wenshu.ctx.eval("cipher()")    # 通过加载js生成__RequestVerificationToken参数    verification_token = wenshu.ctx.eval("random(24)")    params = {        'pageId': '2f48cc03c6e38865bcbdaf2e81a09f7d',        's21': '经济犯罪',        'sortFields': 's50:desc',        'ciphertext': ciphertext,        'pageNum': '1',        'queryCondition': '[{"key":"s21","value":"经济犯罪"}]',        'cfg': 'com.lawyee.judge.dc.parse.dto.SearchDataDsoDTO@queryDoc',        '__RequestVerificationToken': verification_token    }    # 发送请求获取返回结果    response = wenshu.send_request(params)    print(response)    # 获取解密后的内容    content = wenshu.decrypt_response(response)    print(content)

编程语言

? python

引用模块

裁判文书网数据采集

裁判文书网自从去年更新之后,所有内容页都需要登陆后才能访问,这里采用的爬虫语言是Python,采用requet请求方式爬取数据内容,共引用requests, execjs两个模块,这里以“经济犯罪”文书为例子

破解思路以及过程

打开裁判文书网,首先因为所有模块都要登录才能查看,所以这里先登录一下,然后在搜索框中输入“经济犯罪”点击搜索

image-20210425170056562

这种数据列表类型的网站,当然是先从异步请求开始分析,可以看到总共发送了三个路径一样的异步请求,一个一个先点开看看里面长啥样

第一个请求result里面只有userName,应该是身份校验相关的请求,排除了

裁判文书网数据采集

第二个请求非常可疑,result里面虽然是乱码,但是居然有99kb,正常的加密过后的其他内容都不可能有这么大,所有result里面的乱码极有可能就是加密后的秘文数据。

裁判文书网数据采集

第三个请求内容应该是标题或者候选项信息等,排除。

裁判文书网数据采集

三个异步请求看下来,第二个异步请求疑似度最高,那么就选择第二个异步请求作为突破点开始分析,既然传过来的是密文,那解密文件肯定能在响应里面找到,一般这种解密密文操作,都是属于js的工作,先把js都来看一下

裁判文书网数据采集

这么多js请求,一般就是慢慢排查呗,果不其然,在website.js中,找到了玄妙之处

裁判文书网数据采集

当看到这个DES3的时候,基本上可以会心一笑了,这个变量命名我爱了。特别是对应还有encrypt和decrypt这两个函数,我只觉得内心一暖。des3对称秘钥加密,把这段js搞下来单独跑应该是OK的

果断开始拿起我的js调试工具,我这里用的是发条js,各位自己用的什么js调试工具都可以,我的作法比较粗暴,整体copy。

此处加载会出现一个缺少formateDate函数,很简单,也在这段js文件里面,不过是在闭包函数里面,拿出来单独做一个函数就可以了,在这里用发条JS去调试的时候,内容太大了导致发条JS调试工具崩溃了,这里只好手写代码调试。

        # 初始化execjs        node = execjs.get()        # 加载需要执行的js文件        self.ctx = node.compile(open('decrypt_content.js', encoding='utf-8').read())    def decrypt_response(self, ws_content):        # 解密数据接口返回的加密内容        # 解密的key        secret_key = ws_content['secretKey']        # 加密的数据内容        result = ws_content['result']        # 需要执行的方法名,第一个参数加密内容,第二个参数key        func_name = 'DES3.decrypt("{0}", "{1}")'.format(result, secret_key)        # 获取解密后的数据内容        # 此处在windows下执行有报编码错误问题,需要将源码下的subprocess.py文件里的encoding改成utf-8        return self.ctx.eval(func_name)

很简单,通过数据接口取到数据后,拿到内容和秘钥,直接用execjs去执行,就会得到如下结果

裁判文书网数据采集

哇喔,拿到数据,OK了

这个时候当我们回头再去访问接口的时候,接口会报一个“没有权限访问的问题”,通过对比请求参数,可以发现是ciphertext,__RequestVerificationToken这两个参数的问题,接下来就是解决这两个参数了

裁判文书网数据采集

ciphertext参数是通过如下js生成的,直接代码调用cipher()方法就可以了

function cipher() {    var date = new Date();    var timestamp = date.getTime().toString();    var salt = random(24);    var year = date.getFullYear().toString();    var month = (date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth()).toString();    var day = (date.getDate() < 10 ? "0" + date.getDate() : date.getDate()).toString();    var iv = year + month + day;    var enc = DES3.encrypt(timestamp, salt, iv).toString();    var str = salt + iv + enc;    var ciphertext = strTobinary(str);    return ciphertext;}function strTobinary(str) {    var result = [];    var list = str.split("");    for (var i = 0; i < list.length; i++) {        if (i != 0) {            result.push(" ");        }        var item = list[i];        var binaryStr = item.charCodeAt().toString(2);        result.push(binaryStr);    }    ;    return result.join("");}

__RequestVerificationToken参数是通过一个random函数生成的,以下是js,代码直接调用random(24)就可以了

function random(size) {    var str = "",        arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];    for (var i = 0; i < size; i++) {        str += arr[Math.round(Math.random() * (arr.length - 1))];    }    return str;}

相关推荐

热门标签

本周排行榜app

网友评论:

2022,中国加油

返回首页 | 设为首页 | 加入收藏夹 | 软件下载 |


数乐盈软件 www.sly123888.com 彩软件下载站