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 ->当前连的网络 i:http proxy->manual设置ip和port |
我们可以看到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 | 进入编辑模式 |