User-Agent识别
修改请求头信息里的User-Agent
请求头信息识别
比如说referer, content-type,请求方法(POST, GET)
构造相应的请求头信息。比如说referer,我们在提取URL的时候,要把URL所在页面的URL也存储起来,并放到request.headers。
异步加载
我们需要分析页面的网络请求,从中找出和我们想要的数据相关的请求,并分析它的请求头信息、参数、cookie,然后根据这些信息构造我们的请求。通常来说都是ajax请求,也有图片请求,比如图片的lazy load,通过js在页面加载后修改图片的src属性。一般都会有其他的自定义属性存在,比如说"_src"。总之,可以找到一些ID或者链接。注意观察相关dom节点树上的特殊属性。
请求参数加密
一般是在前端通过一定的计算,构造出一个哈希值。需要分析前端的代码,找出具体计算的代码逻辑,并用python再实现。如果前端的代码经过混淆,并且代码量十分巨大,可以使用selenium或者splash等引擎去请求。但是,如果爬取的数据需求量比较大,我们还是要通过直接调用对方接口的形式去获取数据。
请求结果加密
json数据里面加密
比如携程酒店房型列表接口,用它自己的js解密,或者分析它的js前端逻辑,用python代码实现出来。
CSS加密
比如大众点评,通过CSS样式去代替某个字符。我们需要同时爬取CSS文件,并且分析CSS文件内的样式,最后定位到svg文件,并分析提取svg内的内容,完成替换。
字体加密
比如猫眼电影。每次随机返回一个字体文件,并且字符也是随机的。需要每次下载对应的字体文件,并解析字体文件和字符之间的对应关系。
Cookie限制
登录、session限制,比如新片场,拿到登录以后的cookie,然后set到头信息里面,这样请求的时候就相当于登录了。
IP频率限制
需要准备大量的IP代理,获得IP代理的方式有:
- 自己搭建代理服务器(tinyproxy, squid+动态拨号,DDNS)
- 付费购买
- 爬取公开网络上代理(可用性比较低)
控制爬取频率,保持不被封的情况下的最合适的并发数量。
验证码
- 尝试可否绕过前端验证,直接请求具体的接口,以绕开验证码.
- 可以用图片识别库去识别某些比较简单的验证码
- 接入云打码平台
- 用机器学习训练验证码的图片库,然后识别