Fiddler工具的使用
1. Fiddler抓包工具简介
什么是fiddler:
它是一个http协议调试代理工具 ,记录并检查你的电脑和互联网之间的通讯。
官网链接:https://www.telerik.com/fiddler
fiddler的优点:
- 使用简单;
- 支持众多的http调试任务;
- 支持大多数的浏览器;
- 支持phone、pad等移动设备。
2. Fiddler的安装与配置
2.1 fiddler的安装
安装包可在官网下载,安装过程也非常简单。
为方便使用,可将可执行文件发送到桌面快捷方式:
想要使用fiddler工具爬取网页端数据时,还需在浏览器安装SwitchyOmega插件。
SwitchyOmega插件的安装方法与之前安装的xpath插件一样。
首先进入浏览器扩展程序界面,确认打开开发者模式,点击加载已解压的扩展程序,选择插件解压后的文件夹即可。
笔者把fiddler和SwitchyOmega插件的安装包上传到百度网盘,有需要的可以下载。
fiddler抓包工具链接:https://pan.baidu.com/s/1OTn_NPa79mGi-hnsPYa9HA
提取码:ff1g
2.1 fiddler的配置
打开fidder,进入如下图所示的界面:
点击HTTPS,首次勾选后出现警告弹窗,选择信任并安装相应的证书,总之就是选yes即可:
点击Connections,设置端口(不要和别的端口重名):
遇到安全警告,还是选信任、yes之类的选项。fiddler的配置大致就是这样。
现在,对SwitchyOmega插件进行配置,创建一个新情景模式:
按照下图进行相应的配置。配置结束后点击左侧的应用选项:
至此,网页端fiddler抓包工具的配置就完成了。
3. Fiddler配置移动端
查看本机的IP,笔者这里介绍两种方法。
第一种,在终端中输入如下命令:ipconfig
第二种,打开网络和Internet设置,有线连接点击以太网,WiFi就点击WLAN,点击管理已知网络,总之很简单的步骤:
启动模拟器后,点击上方菜单的模拟器配置(不是手机应用设置),预设型号默认就行,这里需要注意的是打开网络桥接模式,提示要安装驱动,点击安装即可,会自动下载并安装驱动:
手机WiFi连接的设置,这里的代理服务器主机名用刚刚查询的网络IP,端口号需与fiddler一致:
在配置移动端时,需在fiddler的Options–>HTTPS里做如下修改,以确保移动端能正常使用fiddler:
配置好WiFi后,打开手机浏览器APP,输入网址:本机IP:端口,如下:
此过程,网络可能不稳定,需要多试几次,成功时弹出如下界面,证书名称就写fiddler就行:
安装成功后会弹出如下的提示吐司:
至此,移动端fiddler的配置就算完成了。
4. 利用Fiddler工具爬取移动端数据
4.1 利用fiddler寻找数据接口
案例需求:获取菜谱分类 --> 热门分类中 --> 家常菜下9个菜谱的名字和对应ID,点击每个菜进入相应的详情页,将排列的前20个数据对应的作者、名字爬取下来。
菜谱分类界面的数据接口,在fiddler中寻找,先看地址中没有特殊的关键字,有疑似选项后可进一步查看软件右下方的response中有没有想要的数据。这一步要看经验,笔者暂时也没有好方法能迅速定位到所需数据:
将菜谱分类页面的响应复制粘贴到json.cn,得到如下结果:
继续寻找有关每个菜谱详情页数据的接口:
向当前页面发起请求所携带的数据中包含的中文是十六进制的,这里可以使用fiddler内部的工具进行转换,点击右上角菜单栏的Textwizard:
将相关的响应放到json在线转换网站中进行解析:
4.2 代码编写
import requests
import json
def handel_request(url, data):
headers = {
# "Cookie": " duid=67891190", cookie不要保留,容易过期
"client": "4",
"version": "6979.2",
"device": "MI 6",
"sdk": "22,5.1.1",
"channel": "huawei",
"resolution": "1920*1080",
"display-resolution": "1920*1080",
"dpi": "2.0",
# "pseudo-id": " 70f71aa256180ea0",
"brand": "Xiaomi",
"scale": "2.0",
"timezone": "28800",
"language": "zh",
"cns": "3",
"carrier": "CHINA+MOBILE",
# "imsi": " 460078023407157",
"User-Agent": "Mozilla/5.0 (Linux; Android 5.1.1; MI 6 Build/NMF26X) AppleWebKit/537.36 ("
"KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36",
"act-code": "1616685886",
"act-timestamp": "1616685854",
"uuid": "4574e06e-82d6-4018-b654-c68212c07ec6",
"battery-level": "0.52",
"battery-state": "2",
"terms-accepted": "1",
"newbie": "1",
"reach": "1",
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8",
"Accept-Encoding": "gzip, deflate",
"Connection": "Keep-Alive",
"session-info": "kQlIQjIM8MjiP8IAUttdbmvGYzhs6fZhEUtBDKheeKishGYKMRciiPNrdgnynrwVwS87yMNPpFAWR/2huvF76V/8G5M0qRQFbinEKPf8AjgWeqkcrPPA8QlIljAiluwF",
"Host": "api.douguo.net",
# "Content-Length": " 132"
}
response = requests.post(url=url, headers=headers, data=data)
return response
def handle_douguo():
url = 'https://api.douguo.net/recipe/flatcatalogs'
data = {
'client': '4',
# '_session': '1616939405407863254010802345',
# 'v': '1616685048',
'_vs': '2305'
}
response = handel_request(url=url, data=data)
# 将json格式字符串的响应转化为python字典
index_response_dict = json.loads(response.text)
# print(response.text)
# 找到家常菜分类,结果是一个列表,存放菜的名字和ID
home_cooking_list = index_response_dict['result']['cs'][0]['cs'][0]['cs']
for cooking_menu in home_cooking_list:
menu_name = cooking_menu['name']
menu_id = cooking_menu['id']
print('Current Menu:{}, ID:{}'.format(menu_name, menu_id))
# 对于每一个菜谱,进入详情页后,继续爬取想要的数据
detal_post_data = {
"client": "4",
# "_session": "1537295931652863254010448503",
"keyword": menu_name,
"order": "3",
"_vs": "400",
}
handle_menu_detal(detal_post_data)
def handle_menu_detal(data):
# 即便是不同菜单的详情页,发起请求的url也是一样的,只是需携带的数据不同
url = 'http://api.douguo.net/recipe/v2/search/0/20'
# 获取响应
response = handel_request(url=url, data=data)
index_response_dict = json.loads(response.text)
# 提取关键数据
detal_data_list = index_response_dict['result']['list']
for detal_data in detal_data_list:
author = detal_data['r']['an']
tips = detal_data['r']['tips']
print('Author: ', author)
print('tips: ', tips)
handle_douguo()
运行结果: