V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zbl430
V2EX  ›  Python

中国裁判文书网 爬虫求助

  •  
  •   zbl430 · 2017-06-23 09:34:31 +08:00 · 9670 次点击
    这是一个创建于 2711 天前的主题,其中的信息可能已经有所发展或是发生改变。

    http://wenshu.court.gov.cn/

    裁判文书网最近更新了反爬策略,然后一直没有搞懂,希望大神可以帮忙

    url = "http://wenshu.court.gov.cn/List/TreeContent"
    data = {
        'Param': '上传日期:2017-06-21 TO 2017-06-22,案件类型:赔偿案件'
    }
    re = requests.post(url, data=data, headers=headers, timeout=60)
    

    这样已经得不到数据了,即使加了 headers

    求大神帮忙!!!

    45 条回复    2018-08-08 16:32:14 +08:00
    samray
        1
    samray  
       2017-06-23 10:26:36 +08:00
    首先,你的浏览器要能访问你要爬取的网站的 url .但是似乎  http://wenshu.court.gov.cn/List/TreeContent  浏览器是打不开的.
    eoo
        2
    eoo  
       2017-06-23 10:44:33 +08:00 via Android
    页面已经挂了。
    lzhr
        3
    lzhr  
       2017-06-23 13:12:40 +08:00
    404
    Chingim
        4
    Chingim  
       2017-06-23 13:33:47 +08:00 via Android
    有时候 bug 就是那么简单,但是发现之前你已经被搞得吐血。

    发自吐血的某某
    lzhr
        5
    lzhr  
       2017-06-23 13:42:45 +08:00
    zbl430
        6
    zbl430  
    OP
       2017-06-23 17:22:42 +08:00
    @samray 这个是 post 接口,不好意思,忘说明了
    zbl430
        7
    zbl430  
    OP
       2017-06-23 17:24:01 +08:00
    @Chingim 看来大神有解决方案了,已经被虐很久了,求指教
    zbl430
        8
    zbl430  
    OP
       2017-06-23 17:24:29 +08:00
    @lzhr 然而用代码就不行
    samray
        9
    samray  
       2017-06-23 17:39:24 +08:00
    @zbl430 试试加上 cookie
    Chingim
        10
    Chingim  
       2017-06-23 19:34:26 +08:00
    @zbl430 没有啊, 我以为 bug 就是 404
    libraor
        11
    libraor  
       2017-06-26 20:07:43 +08:00
    同道中人啊,友情支持下
    tangzipeng
        12
    tangzipeng  
       2017-06-29 18:05:49 +08:00
    友情帮顶一下,我也卡在这个网站上了,主要是 Cookie 是加密处理的,然后 js 还是混淆的~ 应该是个叫瑞数信息的公司搞的产品,很多网站在用……
    simapple
        13
    simapple  
       2017-08-30 16:48:38 +08:00
    这个网站 很有意思,每一次请求翻页都要过一次验证码,加密一次密钥,带密钥访问下一个页面,你自己查看每次 http 请求的细节,就能方便的搞定了
    McooLewis
        14
    McooLewis  
       2017-08-30 20:58:42 +08:00
    @simapple 哥们你好,请问你知道他这个验证码是怎么生成的吗,我查看了半天,不知道这个验证码是怎么生成的,谢谢.
    simapple
        15
    simapple  
       2017-08-31 08:29:22 +08:00
    @McooLewis 验证码图片是后台生成的
    Mrkon
        16
    Mrkon  
       2017-11-27 18:19:32 +08:00
    解决问题主要在于表单中的 vl5x 参数与 guid 参数
    其中通过 post guid 参数到 http://wenshu.court.gov.cn/ValiCode/GetCode 得到 number,在其出现 500 时
    参数 number 为'number': 'wens'

    对于 guid 参数可以通过:
    import random
    def guid():
    return hex(int((random.random() + 1) * 0x10000))[3:]

    对于 vl5x 参数可以通过:
    链接: http://wenshu.court.gov.cn/List/List?最后的两个函数
    var _fxxx = function (p, a, c, k, e, d).....
    function getKey().....
    其中 getKey()返回的就是 vl5x
    运行 js 代码可以通过 python 的 PyV8 模块,附教程链接: http://blog.csdn.net/hanshileiai/article/details/51628173

    但是:因为本人 js 不太会,其中 vl5x 参数是通过什么改变的,转化为 python 的代码是怎样的,希望大神能不吝赐教。
    fox2moon
        17
    fox2moon  
       2017-12-08 10:24:14 +08:00
    @Mrkon 你好 想知道你关于 vl5x 参数 你有解决办法吗?
    我运行后 报错 ReferenceError: "getCookie" is not defined in <eval>#26:4<eval> at line number 1
    p, a, c, k, e, d 是代表的什么?
    期待你的回复
    Mrkon
        18
    Mrkon  
       2017-12-08 14:31:12 +08:00
    @fox2moon 不好意思,js 因为最近太忙没有看过,所有还是不太懂,但是你的错误我估计出现在要导入 cookie 参数,
    而其中最值得的参数是 vjkl5=0ac4559fffd034030166188f40d6a9ae4c37436f;这样的,希望能帮到你。在找到解决办法后希望给我个回复,共勉。
    zbl430
        19
    zbl430  
    OP
       2017-12-08 17:08:51 +08:00   ❤️ 1
    vjkl5 这个参数变换不建议使用 python 来写,非常多,就用 pyv8 吧


    vjkl5=0ac4559fffd034030166188f40d6a9ae4c37436f
    getKey 这个函数实际就是将 0ac4559fffd034030166188f40d6a9ae4c37436f ->> 1514b83137a527bcbfbf590d

    只能说这么多了
    Mrkon
        20
    Mrkon  
       2017-12-12 10:48:54 +08:00
    @zbl430 谢谢,能否问一下,如果作为一个资深爬虫工程师,一般需要对 js 掌握到什么程度啊
    zbl430
        21
    zbl430  
    OP
       2017-12-12 11:25:34 +08:00
    @Mrkon 个人觉得,能把你需要的 js 转成 python 写的就行了,没必要特意去学,很多技术都是现学现搞,日后加深
    Hombin
        22
    Hombin  
       2017-12-12 16:20:32 +08:00
    @Mrkon list 页面的 js 中都没有看到 getkey()函数,请问是在哪里可以找出这个函数的定义?
    Mrkon
        23
    Mrkon  
       2017-12-12 17:45:54 +08:00
    @zbl430 恩,谢谢,已关注,以后多交流啊
    Mrkon
        24
    Mrkon  
       2017-12-12 17:59:03 +08:00   ❤️ 1
    @Hombin 首先网站是: http://wenshu.court.gov.cn/List/List? 后面常常会跟一堆参数
    其次在最后。。。我不会发截图,函数在最后两段,还特地给你标注了”//函数(两段必须的)“ ,找定义要善于 firebug
    vs412237401
        25
    vs412237401  
       2018-01-24 14:15:30 +08:00
    这个数据的爬取没有什么难度的,请看 openlaw.cn
    zbl430
        26
    zbl430  
    OP
       2018-01-25 09:35:38 +08:00
    @vs412237401 它网站的数据还没我的多呢...
    wenziyue
        27
    wenziyue  
       2018-03-22 14:08:34 +08:00
    @zbl430 大佬你好,我现在正在做这个网站的爬虫,现在它页面源码里获取 vjkl5 的 getkey 函数貌似被混淆了,现在没法获取 vjkl5 的值了,搞得我现在焦头烂额,不知道该怎么做了,请问大佬有什么好的解决办法么?希望能回复啊,多谢多谢
    wenziyue
        28
    wenziyue  
       2018-03-22 16:12:12 +08:00
    @Mrkon 大佬你好,我现在正在做这个网站的爬虫,现在它页面源码里获取 vjkl5 的 getkey 函数貌似被混淆了,现在没法获取 vjkl5 的值了,搞得我现在焦头烂额,不知道该怎么做了,请问大佬有什么好的解决办法么?希望能回复啊,多谢多谢
    zbl430
        29
    zbl430  
    OP
       2018-03-22 19:15:58 +08:00 via Android
    @wenziyue 那就运行这段函数啊,用 py 去运行 js,你百度应该有方法
    wenziyue
        30
    wenziyue  
       2018-03-23 17:03:46 +08:00
    @zbl430
    function getKey() {
    var aaaafun = function (p, a, c, k, e, d) { e = function (c) { return (c < a ? "" : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)) }; if (!''.replace(/^/, String)) { while (c--) d[e(c)] = k[c] || e(c); k = [function (e) { return d[e] } ]; e = function () { return '\\w+' }; c = 1; }; while (c--) if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]); return p; }
    eval(aaaafun('7 8(2,4,3){5 6=3.9(\'|\');a(5 1=0;1<4;1++){2=2.f(e b(\'\\\\{\'+1+\'\\\\}\',\'c\'),6[1])}d 2}', 16, 16, '|i|str|strReplace|count|var|arrReplace|function|de|split|for|RegExp|g|return|new|replace'.split('|'), 0, {}))
    eval(de("{15}un{12}tion {4}str) {v{10}r long = 0;{15}or (v{10}r i = 0; i < str.l{14}ngth; i++) {long += {9}(i) << (i % 16));}r{14}turn long;}{15}un{12}tion {0}(str) {v{10}r long = 0;{15}or (v{10}r i = 0; i < str.l{14}ngth; i++) {long += {9}(i) << (i % 16)) + i;}r{14}turn long;}{15}un{12}tion {0}2(str,st{14}p) {v{10}r long = 0;{15}or (v{10}r i = 0; i < str.l{14}ngth; i++) {long += {9}(i) << (i % 16)) + (i * st{14}p);}r{14}turn long;}{15}un{12}tion {0}3(str, st{14}p) {v{10}r long = 0;{15}or (v{10}r i = 0; i < str.l{14}ngth; i++) {long += {9}(i) << (i % 16)) + (i + st{14}p - str.{12}h{10}rCo{13}{14}At(i));}r{14}turn long;}{8}0(str) {v{10}r str = str.{3}5, 5 * 5) + str.{3}(5 + 1) * (5 + 1), 3);v{10}r {10} = str.{3}5) + str.{3}-4);v{10}r {11} = str.{3}4) + {10}.{3}-6);r{14}turn {2}).{3}4, 24);}{8}1(str) "strToLongEn|strToLong(str.substr|hex_md5(str|substr(|strToLong(|hex_md5(|base.encode(|new Base64();|function makeKey_|(str.charCodeAt|a|b|c|d|e|f"))

    多谢回复啊,他现在网页源码里这个 js 函数都是这样的一堆东西,我只贴了一部分,代码是混淆过的,这种东西没法运行的吧。。。
    OxhydrylLithium
        31
    OxhydrylLithium  
       2018-04-03 16:35:08 +08:00   ❤️ 1
    @wenziyue 是的, 这个是 packed 包装过的。特征字符串是"eval"开头。把 var aaaafun 的定义替换到第一个 eval 之后的 aaaafun。在执行一次解密,依此类推。 给你一个可以用来解密的网站: http://matthewfl.com/unPacker.html
    wenziyue
        32
    wenziyue  
       2018-04-08 19:38:09 +08:00   ❤️ 1
    @OxhydrylLithium 太感谢了!已经解密出来了,多谢多谢!
    zc15238092914
        33
    zc15238092914  
       2018-04-09 14:06:24 +08:00
    @wenziyue getKey()怎么解出来的,是用 pyv8 吗?用 python 执行这个 js 函数时,一直报错
    zbl430
        34
    zbl430  
    OP
       2018-04-09 14:13:48 +08:00
    @zc15238092914 #33 f12 用浏览器的 console
    wenziyue
        35
    wenziyue  
       2018-04-09 19:48:21 +08:00
    @zc15238092914 我是用楼上大神给的网站把混淆过的 js 代码还原了,然后用 pyv8 执行还原的 js 得到了 vl5x,我不清楚用 pyv8 执行混淆的 js 能不能得到结果,但是现在几个参数都有了,向 http://wenshu.court.gov.cn/List/ListContent 发 post 请求返回的结果为空。。。头疼
    wenziyue
        36
    wenziyue  
       2018-04-09 19:51:33 +08:00
    @zbl430 大神,我现在用 pyv8 执行 js 能获得 vl5x 了,几个参数现在都有了,但是向 /List/ListContent 发 post 请求返回的结果为空,按理说它应该返回一个 json 啊,是需要加 cookie 吗?
    wenziyue
        37
    wenziyue  
       2018-04-09 19:52:34 +08:00
    @OxhydrylLithium 大神你好,我用你的方法获得了 vl5x,几个参数现在都有了,但是向 /List/ListContent 发 post 请求返回的结果为空,按理说它应该返回一个 json 啊,是需要加 cookie 吗?
    zbl430
        38
    zbl430  
    OP
       2018-04-10 09:30:39 +08:00
    @wenziyue #36 那你的 vl5x 和浏览器算出的做对比,看看是不是一样, 比如 vjkl5=cf370b569dff2cad90014e18a63dba0705ba2384, 算出的 vl5x 是 57210fbd1e1b17173950aa8b
    wenziyue
        39
    wenziyue  
       2018-04-10 09:48:22 +08:00
    @zbl430 这个我对比过了,完全一样,参数应该没问题,但是不清楚为什么返回的数据为空,加了 cookie 和 referer 也依然没用,项目本来说的今天要上线,现在还没做出来,已经快疯了,大神我能加你个 Q 问你一下吗
    zc15238092914
        40
    zc15238092914  
       2018-04-10 09:50:54 +08:00
    @wenziyue 我也用那个网站处理了 js,但是执行,一直报 SyntaxError: Unexpected token ILLEGAL ( @ 29 : 22 ) -> eval(aaaafun('7 8(2,4,3) ,有解决方案吗?或者加个微信 zhangchenchen123123,交流下
    wenziyue
        41
    wenziyue  
       2018-04-10 09:56:32 +08:00
    @zc15238092914 好的,我加你吧
    zc15238092914
        42
    zc15238092914  
       2018-04-10 09:57:14 +08:00
    @wenziyue 好的 微信 zhangchenchen123123 qq:1104595182
    v5python
        43
    v5python  
       2018-04-14 15:52:39 +08:00
    @wenziyue 我的也基本解决,大量跑出裁判文书数据呢,现在想弄下它的 app。app 有研究过?大佬。加下我的 qq 吧:390982209。
    OxhydrylLithium
        44
    OxhydrylLithium  
       2018-04-16 10:45:17 +08:00
    @wenziyue 抱歉最近很忙没什么时间看,刚看到你的回复。分析了一下流量发现首先发送的 guid 和 number 必须配对 然后每次都要有上一次有效的 vjkl5 cookie。你看看是不是这方面的问题,除了参数生成过程难发现以外其他的看起来难度很小。
    yanmo00
        45
    yanmo00  
       2018-08-08 16:32:14 +08:00
    @wenziyue 你好,请问下 getKey()的 js 怎么解析的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2763 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:29 · PVG 16:29 · LAX 00:29 · JFK 03:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.