使用mitmproxy绕过
Mitmproxy是一组工具,可为HTTP/1、HTTP/2和WebSocket提供交互式的、具有SSL/TLS功能的拦截代理,其功能包括:能够完成拦截并动态修改HTTP、HTTPS的请求和响应,保存完整的HTTP对话,并进行转发和分析,转发HTTP会话客户端,转发以前录制的服务器的HTTP响应,反向代理模式将流量转发到指定服务器,使用Python对HTTP流量进行脚本化更改等功能
使用Mitmproxy工具绕过cookie反爬策略,实现对“XX直聘”网站数据抓取
该反爬虫使用js验证用户环境是否正常,检测用户环境是否为自动化框架,访问该网站需要验证cookie字段,当通过selenium自动化框架访问“ XX直聘”网站时,会对cookie生成阶段置毒,造成cookie验证错误,所以需要对爬虫进行伪装,这里通过伪造Request Header来模拟浏览器发出请求,通过此方式能够正常获得“XX直聘”网站岗位详细信息数据,能够有效防止爬虫被拦截。
经过测试发现每个cookie可以使用五次,使用五次后需要更新cookie,每次cookie失效时通过浏览器访问URL,从数据包中捕获数据。这里使用Mitmproxy代理工具捕获数据包,从数据包中获取请求头。
Mitmproxy代理工具提供以下常用的API:
- http.HTTPFlow #实例 flow。
- flow.request.headers #获取所有头信息,包含Host、User-Agent、Content-type等字段。
- flow.request.url #完整的请求地址,包含域名及请求参数,但是不包含放在body里面的请求参数。
- flow.request.pretty_url #同flow.request.url目前没看出什么差别。
- flow.request.host #域名。
- flow.request.method #请求方式。POST、GET等。
以上均为获取request信息的一些常用方法,对于response,同理
- flow.response.status_code #状态码
- flow.response.text#返回内容,已解码
- flow.response.content #返回内容,二进制
- flow.response.setText()#修改返回内容,不需要转码
本例需要使用flow.request.host,flow.request.url,flow.request.headers三个函数。
编写addons.py脚本如下:
def requestheaders(self, flow: mitmproxy.http.HTTPFlow)
if flow.request.host !='www.xxxx.com':
return
if "position" not in flow.request.url:
return
s = bytes(flow.request.headers)
with open('header.txt','wb')as f:
f.write(s)
f.close()
执行脚本:mitmdump -s addons.py。
需要以管理员权限运行脚本,否则脚本无法正常运行。还需要安装证书,否则无法获取HTTPS数据包内容。
设置系统代理为127.0.0.1:8080,这样通过浏览器访问时,脚本将在后台处理发送的数据包。
该脚本捕获request.host为“www.xxxx.com”,并且URL中含有“position”字段的数据包,捕获数据包后,存储在本地的“header.txt”文件中。
当cookie失效时,进行更新cookie操作,通过浏览器访问URL,后台脚本获取cookie存储到本地,程序从本地文件中得到新的cookie,进行替换。执行以下代码:
os.system(f'"C:\Google\Chrome\Application\chrome.exe" {url}')
url 为XX直聘岗位地址。