个人爬虫练习代码,一点点总结上传。
可以找到加密参数发送请求前的位置,从而根据debugger位置,打断点找到加密入口。具体的加密在一点点进行中。
也可以根据这个不破解加密的具体方法。
1、通过 js hook
到 XMLHttpRequest
的请求,
2、判断请求中是否有加密参数
3、取消请求
4、将获取到的加密参数以及 cookie
返回到爬虫程序。返回通过谷歌插件的形式。
5、就可以实现抓取了
还有一种思路是自己执行 XMLHttpRequest
发送请求,并执行拦截和取消。这种思路的话生成加密参数的速度应该是最快的。不过我不太清楚这种自己制造自己拦截具体是怎么操作的。如果有知道的,可以指点一下。谢谢!
增加抓取数据的处理逻辑,并将抓取的数据保存到 mongodb
数据库中。增加验证码手动处理。
需要修改优化的部分:
- 将详情处理与列表的处理分开,详情做多线程或者异步协程抓取。
- 增加
redis
处理,实现分布式增加去重抓取 - 增加代理
ip
池
加密的参数具体破解还在一步步解析中
这个真的简单。而且网上到处都有。
在大佬 @zhaoboy9692 代码上做了简单的修改
使用 python
重新实现了一下,代码比较简单,由于没有代理ip,没有进行多线程也没有异步还是挺慢的,而且会有频率限制。所以建议可以上代理ip,这样会非常快。也没有保存相关的 code
,我只需要名字,所以就只保存了名字。使用 MySQL
保存。
这个数据太多了,又用 scrapy-redis
重新实现了一遍。我只是单机跑,速度其实还不是很快。可以多部署几台去抓就快多了。五级的数据是在是多,四级的话会少很多。
AreaSpider 文件夹下的 area 文件夹。执行 main.py
就可以了。然后再 redis
中 push
一条起始数据就 OK 了。
需要注意的问题就是一个电脑抓的太频繁就会出现一个频率太快,会禁止你的请求,可以等几秒后。还有一个就是会出现 sojson.v5
的 js,其实这个还原之后你会发现就是生成了 cookie
中的一个参数。可以选择破解 sojson.v5
也可以直接复制 cookie
控制一下请求的频率就可以。
保存的数据预览
id | pid | name | level |
---|---|---|---|
1 | 0 | 中国 | 0 |
2 | 1 | 北京市 | 1 |
3 | 1 | 天津市 | 1 |
4 | 1 | 河北省 | 1 |
5 | 1 | 山西省 | 1 |
... | ... | ... | ... |
33 | 2 | 市辖区 | 2 |
34 | 33 | 东城区 | 3 |
35 | 34 | 东华门街道 | 4 |
36 | 35 | 多福巷社区居委会 | 5 |
... | ... | ... | ... |
大家可以直接下载 sql
文件。也可以直接修改代码重新自己抓取一份。sql 文件在 AreaSpider 目录下。总共数据有将近70万的数据。我对第五级的数据进行了处理,原本都是居委会等等,把居委会。。删除后保存的。
area_spider.sql
文件大小 56.9MB
如果账号够多,可以通过并发提高抓取速度,同时10个账号并发,账号触发请求频繁的风控时,更换账号。 qcc 请求频繁会直接返回一个 混淆 js, 这个 js 会生成一个新的 cookie的值,更新到cookie中。
qcc_ob_js/qcc_cookie_parse_16.js
已经做了处理,使用 AST做的处理,参考蔡老板的文章,该文件可以直接在 node环境下运行,使用 express 做服务。需要安装相关的库。
访问方式 :http://127.0.0.1:3000/?arg1={arg1}
登陆就是个阿里的滑动,晚点放个 demo。特别简单,百度就有。
这些百度一下都能搜到,改个 $cdc , 加个 webdriver, 再加上处理轨迹就 OK 了,目前没有发现大的问题。轨迹必须加。在一个 selenium 打开的浏览器中,打开第二个标签页,可能会导致滑动失败。每次打开页面不关闭浏览器进行第二次登陆,可能也会导致失败。
demo可以直接运行。
接口中有参数 _signature
参数
直接全局搜索这个参数,会在一个 index-*.js
中搜索到, 虽然 captcha.js
中也有,不过没用
在文件中找到该字符串位置,打断点,调试。
继续下一步,调试会跳转到 acrawler.js
文件中.
acrawler.js
文件
下一步直接将 js 文件拿出来, 执行。
1、简化 js
, 删除一些没有用的东西
参数后改为空列表即可
2、node
中 window
为 global
定义
var window = global;
继续执行,缺啥补啥(调试打印 Z[S]
,就可以知道缺啥了 )
window.location = params.location;
window.navigator = params.navigator;
然后就可以出来短的了
- 有个问题加了下面的代码就会报错
window.byted_acrawler && window.byted_acrawler.init({
aid: 24,
dfp: !0
});
注释掉就可以,不知道啥原因。
长的 _signature
需要加 cookie
,把 cookie
放进去就 ok 了。放在主要加密函数的后面,放在前面没用。不生效
结果:
测试一下
请求 api/pc/feed
接口时,需要在前面加上 toutiao
进行加密。
直接请求详情,不携带 cookie
, 会响应 cookie __ac_nonce
通过 __ac_nonce
生成 __ac_signature
直接调用上面的方法即可
function f2(__ac_nonce){
ac_signature = window.byted_acrawler.sign("", __ac_nonce);
return ac_signature
}
现在加 cookie
生成出来的变短了,不是原来那个长长的了
按照原来的跑会出来这么个错误
原来整个代码还是可以用的,并且是可以抓取到数据到,就是需要频繁的更换 ip
关注我的公众号获取更新后的源码 Python爬虫scrapy
如果对你有用,欢迎 star