Python爬虫(一)——使用mitmproxy拦截数据包

一、反爬机制

在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等抓包工具进行抓包,抓包工具的使用就不赘述了
Charles查看请求url
这里会看到新闻页面的链接,并且在右边的Overview可以看到该请求的详细信息,如下图
完整信息分析
这里需要我们分析一下url,最好能提取出与其他url没有重合的字符串,以便在mitmproxy脚本中进行准确的拦截。

3. mitmproxy脚本编写

   # -*- coding: utf-8 -*-

import mitmproxy.http

class Counter:
    def __init__(self):
        self.num = 0
	#设置上游代理
    def request(self, flow: mitmproxy.http.HTTPFlow):
         if flow.request.method == "CONNECT":
             return
         if flow.live:
             proxy = ('http://121.228.53.238', '9990')
             print(flow.request.host)
             flow.live.change_upstream_proxy_server(proxy)

    def response(self, flow: mitmproxy.http.HTTPFlow):
        # 拦截包的信息
        if 'https://mbd.baidu.com/newspage/data/landingpage' in flow.request.url:
            print(flow.response.text)
            self.num = self.num + 1
            ctx.log.info("We've seen %d flows" % self.num)

addons = [
    Counter()
]

在上面代码的request中可以设置上游代理,这是为了解决封ip的情况,这里以静态的ip地址作为例子,如果需要动态的ip,可以自己进行搭建或者购买动态代理,我使用的是 阿布云。另外,上游代理也可以在命令行中直接进行设置。

阿布云在mitmproxy中的接入命令:

mitmweb --mode=upstream:http://http-dyn.abuyun.com: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编辑器,使用命令操作并查看每一个包的信息
    mitmproxy
    包信息
  • mitmweb
    会在本机上启动一个web服务,以便在浏览器查看包信息,相比于命令行界面操作更加简单,命令行则输出脚本运行信息
    mitmweb命令行输出信息
    web端包信息
  • mitmdump

mitmdump启动的方式结合了mitmweb打印出的脚本信息和mitmproxy方式启动的包信息,在命令行中查看可能会很难找目标信息,但不需要去进一步的去操作。
mitmdump

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值