裁判文书网2019年9月份最新爬虫

文书网在9月份终于更新了,上去看了一下,无比的流畅。秉持着一颗探索,天真的童心看看文书网这次更新有啥突破和进展,一言不合直接打开开发者工具,仔细寻找了一番,看到了一个可疑的连接,定睛一看,wc,参数这么多,加入参数,最后的返回值内竟然没有自己想要的文本内容,到底怎么弄!!!,可能很多小伙伴看到这里就开始怀疑自己了,这是啥玩意嘛,弄得这么复杂,还能不能愉快的玩耍了!在这里插入图片描述
可是没办法嘛,我们要紧跟时代的步伐,慢慢来。经过一两个小时,调试js,终于拨开云雾,海阔天空。下面我们一一来分析这些参数。
1、pageid 其实这个参数我们可以猜想,可能是根据页数,通过某个加密函数进行加密,可是当我进行调试的时候,发现在改变页数的同时,他是不发生改变的。所以上面猜想失败。我全局搜索了一下pageid,出现很多,其中一个函数他尤其的亮眼,是他,是他,就是他,人群中最亮的仔。
pageid
其实观察源码发现,他是传入一个数,循环32次,每次输出一个16进制的数组成,没有什么难度。
2、s8 表示案件类型,05代表的是国家赔偿与司法救助案件,这些在wenshulist1.js这个js内全都有标注,可以自己去看(可以自己修改)
3、sortFields表示按照法院层级降序排列(可以自己修改)
4、ciphertext 这个参数其实也很好找,全局搜索
ciphertext
可以简单看下逻辑,前面几行都比较简单,重点是在 var enc这边,这边用到了一个DES3加密,也是这次更新可能唯一的难点,传入三个参数加密后,再经过strTobinary函数处理,就能得到该参数,DES3加密的函数在下方:
在这里插入图片描述
大约稍微那么一丢丢能看得懂,其实看不懂也没关系,python执行js就好了。
5、pagenum 当前的页数
6、querycondition 将之前那个转成字典再转化成列表就好了
7、cfg 固定参数
8、__RequestVerificationToken 唯一标致,也是一次获取后,后面也可以不发生改变,全局搜索下,是由这边生成的

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;
            }

以上所有参数都基本上有逻辑能够写出来了,但是得到这些参数成功请求后,网站的作者还设置了一道坎,就是他会返回两个值,一个result,一个secretkey(还真是秘密钥匙),将这两个参数再进行一次DES3解码就能得到json数据了。其实整体看下来,没有以前难,甚至还有那么一丢丢小简单,下面就贴下代码,大家参考就好。

# coding=utf-8
import requests
import time
import execjs
import base64
import json
from pprint import pprint
from Cryptodome.Cipher import DES3
from Cryptodome.Util.Padding import unpad, pad
"""
2019年9月份文书网spider更新,简单看了下文书网更新过后的加密方式,整体比以前简单不少,
总结起来大概就是ciphertext这个参数是变化的,其他的基本上不会改变,传入data获取数据后,会有一个
DES3解密,其他的好像没什么难点(有可能没遇到坑),就大概写个逻辑脚本,需要完善
"""

# ----------------------------------自定义函数-------------------------------------------

# 获取ciphertext参数
def get_cipher():
    with open ("c:\\Users\\包子xia\\Desktop\\file\\cipher.js",encoding='utf-8') as f:
        js = f.read()
    ctx =execjs.compile(js)
    cipher = ctx.call("cipher")
    return cipher

# 获取DES解密后的返回值
def get_result(result,secretKey,date):
    des3 = DES3.new(key=secretKey.encode(), mode=DES3.MODE_CBC, iv=date.encode())
    decrypted_data = des3.decrypt(base64.b64decode(result))
    plain_text = unpad(decrypted_data, DES3.block_size).decode()
    return plain_text

# 获取__RequestVerificationToken参数
def get_token():
    js = """ 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;
            }
    """
    ctx = execjs.compile(js)
    result = ctx.call("random", "24")
    return result

# 获取pageid
def get_pageid():
    js = """function happy() {
                    var guid = "";
                    for (var i = 1; i <= 32; i++) {
                        var n = Math.floor(Math.random() * 16.0).toString(16);
                        guid += n;
                        // if ((i == 8) || (i == 12) || (i == 16) || (i == 20)) guid +=
                        // "-";
                    }
                    return guid;
                }"""
    ctx = execjs.compile(js)
    pageid = ctx.call("happy")
    return pageid

#-------------------------------自定义函数结束-----------------------------------------


class wenshu(object):
    def __init__(self):
        self.session = requests.Session()
        self.headers = {
            "Cookie":"SESSION=f25ce583-7609-43ba-bb12-a0f3cdb15515",
            "Host":"wenshu.court.gov.cn",
            "Origin":"http://wenshu.court.gov.cn",
            "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
        }

    def get_docid(self):
        """文书列表页"""
        url = "http://wenshu.court.gov.cn/website/parse/rest.q4w"
        data = {
            "s8": "04",
            "pageId": "%s" % get_pageid(),
            "sortFields": "s50:desc",  # 按照法院层级降序排列
            "ciphertext": "%s" % get_cipher(),
            "pageNum": "1",
            "pageSize": "5",
            "queryCondition": '[{"key":"s8","value":"04"}]',  # 这边可以自定义选择,04表示行政案件
            "cfg": "com.lawyee.judge.dc.parse.dto.SearchDataDsoDTO@queryDoc",
            "__RequestVerificationToken": "%s" % get_token()
        }
        response = self.session.post(url, data=data,headers=self.headers)
        json_value = json.loads(response.text)
        secretKey = json_value["secretKey"]
        result = json_value["result"]
        data = json.loads(get_result(result, secretKey, time.strftime("%Y%m%d")))
        for key in data["queryResult"]["resultList"]:
            rowkey = key["rowkey"]
            self.detail_page(rowkey)

    def detail_page(self,docid):
        """文书详情页"""
        url = "http://wenshu.court.gov.cn/website/parse/rest.q4w"
        data = {
            "docId": "%s" % docid,
            "ciphertext": get_cipher(),
            "cfg": "com.lawyee.judge.dc.parse.dto.SearchDataDsoDTO@docInfoSearch",
            "__RequestVerificationToken": "%s" % get_token(),
        }

        response = self.session.post(url, data=data,headers=self.headers)
        json_value = json.loads(response.text)
        secretKey = json_value["secretKey"]
        result = json_value["result"]
        data = json.loads(get_result(result, secretKey, time.strftime("%Y%m%d")))
        pprint(data)


if __name__ == '__main__':
    demo = wenshu()
    demo.get_docid()

结果
上面有一个js文件,我是用pyexecjs执行的,就不贴出来。本项目也是自己出于兴趣,想解析下看看。也是希望大家对网站手下留情,速度慢一点,温柔一点,这样对大家都好。

在此声明,如需转载,请标注来源。本文章也是记录自己的技术实践,绝无破坏网站运行的想法,如若被他人用于商业用途,与本人无关。同时欢迎访问个人博客主页… …

function getKey(cookie) { // var cookie = getCookie('vjkl5'); var arrFun = [makeKey_0, makeKey_1, makeKey_2, makeKey_3, makeKey_4, makeKey_5, makeKey_6, makeKey_7, makeKey_8, makeKey_9, makeKey_10, makeKey_11, makeKey_12, makeKey_13, makeKey_14, makeKey_15, makeKey_16, makeKey_17, makeKey_18, makeKey_19, makeKey_20, makeKey_21, makeKey_22, makeKey_23, makeKey_24, makeKey_25, makeKey_26, makeKey_27, makeKey_28, makeKey_29, makeKey_30, makeKey_31, makeKey_32, makeKey_33, makeKey_34, makeKey_35, makeKey_36, makeKey_37, makeKey_38, makeKey_39, makeKey_40, makeKey_41, makeKey_42, makeKey_43, makeKey_44, makeKey_45, makeKey_46, makeKey_47, makeKey_48, makeKey_49, makeKey_50, makeKey_51, makeKey_52, makeKey_53, makeKey_54, makeKey_55, makeKey_56, makeKey_57, makeKey_58, makeKey_59, makeKey_60, makeKey_61, makeKey_62, makeKey_63, makeKey_64, makeKey_65, makeKey_66, makeKey_67, makeKey_68, makeKey_69, makeKey_70, makeKey_71, makeKey_72, makeKey_73, makeKey_74, makeKey_75, makeKey_76, makeKey_77, makeKey_78, makeKey_79, makeKey_80, makeKey_81, makeKey_82, makeKey_83, makeKey_84, makeKey_85, makeKey_86, makeKey_87, makeKey_88, makeKey_89, makeKey_90, makeKey_91, makeKey_92, makeKey_93, makeKey_94, makeKey_95, makeKey_96, makeKey_97, makeKey_98, makeKey_99, makeKey_100, makeKey_101, makeKey_102, makeKey_103, makeKey_104, makeKey_105, makeKey_106, makeKey_107, makeKey_108, makeKey_109, makeKey_110, makeKey_111, makeKey_112, makeKey_113, makeKey_114, makeKey_115, makeKey_116, makeKey_117, makeKey_118, makeKey_119, makeKey_120, makeKey_121, makeKey_122, makeKey_123, makeKey_124, makeKey_125, makeKey_126, makeKey_127, makeKey_128, makeKey_129, makeKey_130, makeKey_131, makeKey_132, makeKey_133, makeKey_134, makeKey_135, makeKey_136, makeKey_137, makeKey_138, makeKey_139, makeKey_140, makeKey_141, makeKey_142, makeKey_143, makeKey_144, makeKey_145, makeKey_146, makeKey_147, makeKey_148, makeKey_149, makeKey_150, makeKey_151, makeKey_152, makeKey_153, makeKey_154, makeKey_155, makeKey_156, makeKey_157, makeKey_158, makeKey_159, makeKey_160, makeKey_161, makeKey_162, makeKey_163, makeKey_164, makeKey_165, makeKey_166, makeKey_167, makeKey_168, makeKey_169, makeKey_170, makeKey_171, makeKey_172, makeKey_173, makeKey_174, makeKey_175, makeKey_176, makeKey_177, makeKey_178, makeKey_179, makeKey_180, makeKey_181, makeKey_182, makeKey_183, makeKey_184, makeKey_185, makeKey_186, makeKey_187, makeKey_188, makeKey_189, makeKey_190, makeKey_191, makeKey_192, makeKey_193, makeKey_194, makeKey_195, makeKey_196, makeKey_197, makeKey_198, makeKey_199, makeKey_200, makeKey_201, makeKey_202, makeKey_203, makeKey_204, makeKey_205, makeKey_206, makeKey_207, makeKey_208, makeKey_209, makeKey_210, makeKey_211, makeKey_212, makeKey_213, makeKey_214, makeKey_215, makeKey_216, makeKey_217, makeKey_218, makeKey_219, makeKey_220, makeKey_221, makeKey_222, makeKey_223, makeKey_224, makeKey_225, makeKey_226, makeKey_227, makeKey_228, makeKey_229, makeKey_230, makeKey_231, makeKey_232, makeKey_233, makeKey_234, makeKey_235, makeKey_236, makeKey_237, makeKey_238, makeKey_239, makeKey_240, makeKey_241, makeKey_242, makeKey_243, makeKey_244, makeKey_245, makeKey_246, makeKey_247, makeKey_248, makeKey_249, makeKey_250, makeKey_251, makeKey_252, makeKey_253, makeKey_254, makeKey_255, makeKey_256, makeKey_257, makeKey_258, makeKey_259, makeKey_260, makeKey_261, makeKey_262, makeKey_263, makeKey_264, makeKey_265, makeKey_266, makeKey_267, makeKey_268, makeKey_269, makeKey_270, makeKey_271, makeKey_272, makeKey_273, makeKey_274, makeKey_275, makeKey_276, makeKey_277, makeKey_278, makeKey_279, makeKey_280, makeKey_281, makeKey_282, makeKey_283, makeKey_284, makeKey_285, makeKey_286, makeKey_287, makeKey_288, makeKey_289, makeKey_290, makeKey_291, makeKey_292, makeKey_293, makeKey_294, makeKey_295, makeKey_296, makeKey_297, makeKey_298, makeKey_299, makeKey_300, makeKey_301, makeKey_302, makeKey_303, makeKey_304, makeKey_305, makeKey_306, makeKey_307, makeKey_308, makeKey_309, makeKey_310, makeKey_311, makeKey_312, makeKey_313, makeKey_314, makeKey_315, makeKey_316, makeKey_317, makeKey_318, makeKey_319, makeKey_320, makeKey_321, makeKey_322, makeKey_323, makeKey_324, makeKey_325, makeKey_326, makeKey_327, makeKey_328, makeKey_329, makeKey_330, makeKey_331, makeKey_332, makeKey_333, makeKey_334, makeKey_335, makeKey_336, makeKey_337, makeKey_338, makeKey_339, makeKey_340, makeKey_341, makeKey_342, makeKey_343, makeKey_344, makeKey_345, makeKey_346, makeKey_347, makeKey_348, makeKey_349, makeKey_350, makeKey_351, makeKey_352, makeKey_353, makeKey_354, makeKey_355, makeKey_356, makeKey_357, makeKey_358, makeKey_359, makeKey_360, makeKey_361, makeKey_362, makeKey_363, makeKey_364, makeKey_365, makeKey_366, makeKey_367, makeKey_368, makeKey_369, makeKey_370, makeKey_371, makeKey_372, makeKey_373, makeKey_374, makeKey_375, makeKey_376, makeKey_377, makeKey_378, makeKey_379, makeKey_380, makeKey_381, makeKey_382, makeKey_383, makeKey_384, makeKey_385, makeKey_386, makeKey_387, makeKey_388, makeKey_389, makeKey_390, makeKey_391, makeKey_392, makeKey_393, makeKey_394, makeKey_395, makeKey_396, makeKey_397, makeKey_398, makeKey_399]; var funIndex = strToLong(cookie) % arrFun.length; var fun = arrFun[funIndex]; var result = fun(cookie); return result } function Navi(id) { var unzipid = unzip(id); var realid = com.str.Decrypt(unzipid); return realid }
评论 118
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值