mitmproxy爬APP数据

mitmproxy是一个支持SSL的HTTP中间人代理工具,它允许你检查HTTP和HTTPS流量并支持直接改写请求。它位于客户端和Server端之间,它可以获取客户端的Request,然后修改再发送给Server端;Server端得到Request之后再发出相应的Response,又会被mitmproxy拦截,如果你想修改response,便可修改后再发给客户端。

pip install mitmproxy

打开cmd-> ipconfig 查看ip

设置端口

mitmweb -b ip地址 -p 3333  默认的端口是8080

然后设置手机wlan代理

手机端wlan ->当前连的网络 ihttp proxy->manual设置ipport




我们可以看到url, header, params的信息

response = requests.get(url=url, headers=headers)

返回json格式的字符串

result = json.loads(response.text)

result['info']['list']是我们要的数据



以上是首页的信息,每一个任务还有“查看详情页”,可以用相同的办法抓取详情页里的详细信息。

上图中的key 里的task_id 是每一个任务的id,根据这个id我们可以进入每个详情页面。
def get_details(task_id):
    headers = {
            'Host': '...',
            'version':	'300050000',
            'x-cli-ver': '3.5.0',
            'timestamp': '1490255088114',
            'channel':	'AppStore',
            'Accept':	'*/*',
            'x-cli-ch': 'AppStore',
            'Proxy-Connection': 'keep-alive',
            'Accept-Language':	'en-CN;q=1, zh-Hans-CN;q=0.9',
            'Accept-Encoding':	'gzip, deflate',
            'x-cli-model':	'iPhone 6s',
            'x-cli-os': 'iOS10.1.1',
            'sessionid' : '......',
            'User-Agent': 'YNDriver/3.5.0 (iPhone; iOS 10.1.1; Scale/2.00)',
            'Connection': 'keep-alive',
            'x-cli-imei': '1A09A2B6-4D5B-4AF2-BC93-B76DAD8B8B3E'}
    url = 'http://.....detail_v2'

    params = {
            'coord_sys': '2',
            'recomm_key': '3692B31DBBE3932CF988CAB666FDF5AB',
            #'sign': 'c2ce1baceeb32d25d86e5de32d486b4f',
            'task_id': task_id}

    response = requests.get(url=url, params=params, headers=headers)

    result = json.loads(response.text)
    return result['info']['detail_infomation']

知道了如何获取数据,我们可以开始爬数据了
from time import sleep

while 1:
    try:
        result_list = get_response()
    except:
        sleep(200)
        continue

为了避免访问不成功程序停止运行,我们可以加入try except,若访问失败,则自动休息200s后再继续尝试访问

为了存储数据,以及避免放入重复的数据,我们手写一个查重和存放数据的对象Processing
import pymongo


class Processing(object):
    def __init__(self):
        self.client = pymongo.MongoClient('192.xxx.x.xxx')     # 创建一个连接
        self.client['test'].authenticate('username', 'password')       # 登陆信息
        self.db = self.client['dbname']                           # 创建数据库
        self.collection = self.db['collection_name']                   # 创建collection类似表

    def find_exist(self, task_id):
        find_result = self.collection.find_one({'task_id': task_id})
        return find_result

    def insert(self, task):
        self.collection.insert_one(task)                        # 插入数据

创建一个Processing实例
while 1:
    try:
        result_list = get_response()
    except:
        sleep(200)
        continue
    dump_data = Processing()
    for task in result_list:
        task_id = task['task_id']
        if dump_data.find_exist(task_id=task_id):
            break                                           # 如果task_id存在,则直接等下一次刷新
        else:
            try:
                details = get_details(task_id)               # 如果订单结束报价,就get不到什么了。。。
                task['quote'] = get_quote(details)
                task['vehicle'] = get_vehicle(details)
            except:
                task['vehicle'] = 'over time'
                task['quote'] = 'over time'
            task['capture_time'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
            dump_data.insert(task)
            print(task_id)
    sleep(200)                                                # 休息200秒再爬

  
  
  • 安装CA证书(https抓包用) 在手机或pc机上打开浏览器访问 mitm.it 这个地址,选择你当前平台的图标,点击安装
  • mitmproxy的操作 链接列表
按键说明
q退出(相当于返回键,可一级一级返回)
d删除当前(黄色箭头)指向的链接
D恢复刚才删除的请求
G跳到最新一个请求
g跳到第一个请求
C清空控制台(C是大写)
i可输入需要拦截的文件或者域名(逗号需要用\来做转译,栗子:feezu.cn)
a放行请求
A放行所有请求
?查看界面帮助信息
^ v上下箭头移动光标
enter查看光标所在列的内容
tab分别查看 Request 和 Response 的详细信息
/搜索body里的内容
esc退出编辑
e进入编辑模式

 
 



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值