一、反爬机制
在app的爬虫当中,会遇到如下情况,处理起来十分棘手:
1. 我们想直接调用某接口的方式获得数据
2. api中存在某个headers中的一个或多个字段被加密,或者请求体中参数被加密
3. 加密参数不能通过简单的方式破解,也就不能调用接口获取数据包
4. 该接口限制了请求速度(指在某个时间段调用一定次数后,出现账号封禁,ip封禁)
针对以上列出的反爬机制,下面分享一下我的解决办法
二、mitmproxy配置及拦包脚本编写
1. 环境准备
以下是我的环境,windows的环境操作大致相同
- OS: macOS Mojave10.14.5
- Mitmproxy: 4.0.4
- Python: 3.6.4
- OpenSSL: OpenSSL 1.0.2n
需要注意的是Python版本的要求在3.6版本及以上
2. 分析拦截的目标url
以百度的新闻页为例,查找该页面请求地址
使用Charles或者fiddler等抓包工具进行抓包,抓包工具的使用就不赘述了
这里会看到新闻页面的链接,并且在右边的Overview可以看到该请求的详细信息,如下图
这里需要我们分析一下url,最好能提取出与其他url没有重合的字符串,以便在mitmproxy脚本中进行准确的拦截。
3. mitmproxy脚本编写
# -*- coding: utf-8 -*-
import
class Counter:
def __init__(self):
= 0
#设置上游代理
def request(self, flow: ):
if == "CONNECT":
return
if :
proxy = ('http://121.228.53.238', '9990')
print()
.change_upstream_proxy_server(proxy)
def response(self, flow: ):
# 拦截包的信息
if '/newspage/data/landingpage' in :
print()
= + 1
("We've seen %d flows" % )
addons = [
Counter()
]
在上面代码的request中可以设置上游代理,这是为了解决封ip的情况,这里以静态的ip地址作为例子,如果需要动态的ip,可以自己进行搭建或者购买动态代理,我使用的是 阿布云。另外,上游代理也可以在命令行中直接进行设置。
阿布云在mitmproxy中的接入命令:
mitmweb --mode=upstream::9020 --upstream-auth=H01234567890123D:0123456789012345 -s your_script.py
如果代理服务器不需要认证,就只需要设置–mode参数,例如:
mitmweb --mode=upstream:http://121.228.53.238:9020 -s your_script.py
在linux系统上,搭建mitmproxy代理服务器,客户端发起请求会出现被屏蔽的情况,需要加上参数 --set block_global=false
,mitmproxy的默认端口号是8080,修改默认端口加上参数-p 9090
,参数-s your_script.py
是加载运行脚本文件
三、查看拦截的效果
启动mitmproxy一共有三种方式
- mitmproxy
类似于vim编辑器,使用命令操作并查看每一个包的信息 - mitmweb
会在本机上启动一个web服务,以便在浏览器查看包信息,相比于命令行界面操作更加简单,命令行则输出脚本运行信息 - mitmdump
mitmdump启动的方式结合了mitmweb打印出的脚本信息和mitmproxy方式启动的包信息,在命令行中查看可能会很难找目标信息,但不需要去进一步的去操作。