niuniuJQKKK / zhihu_crawler

本程序支持关键词搜索、热榜、用户信息、回答、专栏文章、评论等信息的抓取
26 stars 9 forks source link

知乎反爬似乎已经升级 #4

Open Joenothing-lst opened 2 years ago

Joenothing-lst commented 2 years ago

headers参数x-zse-93似乎已经由101_3_2.0升级为101_3_3.0

Joenothing-lst commented 2 years ago

我这里的测试情况是101_3_2.0相关的解密代码已经不能用了

niuniuJQKKK commented 2 years ago

headers参数x-zse-93似乎已经由101_3_2.0升级为101_3_3.0

这个加密方式应该还是一样的,只是参数变了吧。之前也都有升级

Joenothing-lst commented 2 years ago

我测试是返回请求有风险,阻止了本次请求

zhouyuchong commented 2 years ago

@niuniuJQKKK 你好,我拿到了加密的js文件,但是复制替换项目中的js代码后会报错

execjs._exceptions.ProgramError: TypeError: __g._encrypt is not a function

好像您项目中的这个encrypt.js采取了一些处理,可以麻烦您分享一下吗。 这是zhihu最新的加密js文件

niuniuJQKKK commented 2 years ago

@zhouyuchong 你可以看看加密参数是否正确。目前该项目,在我的环境是能正常采集的

niuniuJQKKK commented 2 years ago

@zhouyuchong page_iterators.py 第一个函数有一个写死的参数。你看看是否是这里的问题

niuniuJQKKK commented 2 years ago

@Joenothing-lst page_iterators.py 第一个函数有一个写死的参数。你看看是否是这里的问题

john-Ly commented 2 years ago

同样101_3_2.0已经无法使用 3.0版本的加密js文件摘出来也不能用

  1. 2.0js加密的密文是固定的 3.0 每调用一次加密就变化一次(这个原理不了解。。。)
  2. 在浏览器控制台 找到比如 answer的fetch api 点击 浏览器返回的json结果也是error 不像以前是可以返回data数据的json
botissue commented 2 years ago

2.0签名后是44位,3.0签名是68位。分享一下3.0可运行的js: encrypt.js.zip

调用方法:

ctx1.call('D', fmd5)

但是可能还存在其他需要修改的地方,目前只能报错:

{'error': {'message': '请求参数异常,请升级客户端后重试', 'code': 10003}}

john-Ly commented 2 years ago

@botissue 3.0js代码一致 我是按照2.0改的 没啥问题 同样响应有错误 之前2.0加密能用 就没管 但是那个时候知乎的前端ajax请求就已经用3.0了

botissue commented 2 years ago

对,就是前几天突然不能用了,那时候3.0已经上线了一段时间。现在网页上的API是这种形式:

https://api.zhihu.com/questions/477754936/feeds?count=5&cursor=50ec0b63022b8ff0972fc6a8cd701fa5&order=votenum&session_id=1654319147986710793&show_detail=1&count=10

估计以前的API就是个蜜罐,浪费大家的时间。最好研究现在的API,相关讨论:

https://github.com/srx-2000/spider_collection/issues/32

niuniuJQKKK commented 2 years ago

@zhouyuchong js没有特殊处理啊。这个爬虫我构建好之后,就丢给组员去维护了。加密如有升级,替换最新的js加密就好了

zhouyuchong commented 2 years ago

@niuniuJQKKK @john-Ly 最新的js加密似乎能检测出是否人为操作。同样的加密函数,用js编译器自动执行和手动执行得到的密文,前者会被识别,后者能够通过。我前段时间折腾半天没办法最后写了个自动控制脚本模仿人类点击。因为我确实对js研究不深。仅提供一下我这边遇到的问题和思路。

niuniuJQKKK commented 2 years ago

@zhouyuchong 问题解决了吗?我这个是为了贴合公司业务写的。写的有点糙,还存有不少坑

zhouyuchong commented 2 years ago

@niuniuJQKKK 我当时也是帮朋友爬数据,当时用我前面的方法暂时拿到足够的数据就没有继续研究了。:grin:

niuniuJQKKK commented 2 years ago

@zhouyuchong 我这目前还没看到反馈相关问题,也没去管,就这样吧。能使起来就行

MakiiYShi commented 11 months ago

最新的js加密似乎能检测出是否人为操作。同样的加密函数,用js编译器自动执行和手动执行得到的密文,前者会被识别,后者能够通过。我前段时间折腾半天没办法最后写了个自动控制脚本模仿人类点击。因为我确实对js研究不深。仅提供一下我这边遇到的问题和思路。

@zhouyuchong 冒昧请问方便分享自动控制脚本的源码吗,现在做这个也遇到同样问题,谢谢🙏

zhouyuchong commented 11 months ago

@MakiiYShi 太久了代码找不到了,大概思路就是, windows有个库可以控制鼠标点击事件,用selenium打开后确定点击事件就行了