1、什么是fiddler
Fiddler是⼀个http协议调试代理⼯具,它能够记录并检查所有电脑和互联网之间的http、https、stp等通讯,它⽀持IE、Chrome、FireFox等等浏览器,可以在phone、pad等移动设备进⾏连接不仅可以做web端也可以做移动端的数据抓取
缺点:
①他只支持http、https、stp等通讯协议的数据其他的协议不支持
②无法请求响应超过2G的数据
2、fiddler简介
2.1fiddler的安装
fiddler的下载:下载链接
双击安装包,安装很简单跟qq一样,安装完毕后自己找到安装目录创建快捷方式(他不会自动再桌面上生成快捷方式)
2.2fiddler的基本设置
2.2.1fiddler应用程序的配置
和我选择一样的即可
2.2.2fiddler服务器代理的配置
新建完毕点击创建其余按照默认选项不用动
点击switchyomega选择刚设置的情景
2.3fiddler的介绍
①界面简介
②会话列表的简介
会话列表图标简介
③常规操作
在fiddler里面一共有2种流模式缓存模式(刷新完加载)、流模式(边刷新边加载)
如何设置断点
1 图形界面(拦截所有请求)
2 命令行设置断点可指定url①bpu + url② bpafter+url
清除断点①bpu ②bpa
2.4fiddler的配置(抓取app的数据前的步骤)
①配置模拟器:我以夜神模拟器为例
打开模拟器,点击设置点击属性设置选择开启桥接模式,点击安装驱动(为了获取当前环境网络中的ip地址),之后选择保存设置,点击重启模拟器
②修改模拟器中的手机设置
点击修改网络之后,选择高级选择代理选择手动,然后将本机的ip地址输入(电脑的内网ip,win系统在DOS中输入ipconfig就可以查看到),将fiddler的端口号输入,点击保存
③配置fiddler,选择tools中的options点击https选择from remote client让他只抓取远程客户端的数据包,避免分析数据包的时候太过凌乱
④在模拟器中安装证书
忘了截过程图,直接给证书命名点击安装就好了,他让设置密码就设置密码就行,直到出现如下图片就成功安装证书了
2.5使用fiddler抓取豆果美食app的数据
需求:要抓取豆果美食中的菜谱分类中的热门中的红烧肉中的做过最多次数的红烧肉的数据抓取(代码提供完整的,主要是数据包分析的过程一通百通,如果你学会了帮我点个赞谢谢)
①打开豆果美食app,它的数据包都会以douguo.net的形式返回所以只需要找对应域名,找到后会自动标黄,在黄标中查找我们想要的数据
②定位到想要的数据点击解码去除乱码,将json结果通过json.cn转化为可看懂字符串查找想要的数据信息(想爬什么数据就要通过这种方法区分析api)在右侧区域查看request以及response头文件,相当于浏览器的开发者工具,就是通过这些头文件来编写代码的
③找到数据包后在pycharm中编写代码获得数据(注释我写在代码中)
'''
request的所有数据
POST http://api.douguo.net/recipe/flatcatalogs HTTP/1.1 post请求方式,只需要url即可
client: 4
version: 6922.2
device: MI 6
sdk: 22,5.1.1
imei: 863254010240033
channel: zhuzhan
mac: F0:03:8C:C2:AD:3F
resolution: 1280*720
dpi: 1.5
android-id: f0038cc2ad3f4318
pseudo-id: cc2ad3f4318f0038
brand: Xiaomi
scale: 1.5
timezone: 28800
language: zh
cns: 0
carrier: CHINA+MOBILE
imsi: 460072400314019
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
reach: 1
newbie: 1
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Cookie: duid=66254911
Host: api.douguo.net
Content-Length: 68
以上皆为request携带的数据包我们以data字典形式传入请求当中
client=4&_session=1602856798953863254010240033&v=1503650468&_vs=2305 这个是post请求的表单数据
'''
import requests
from multiprocessing import Queue # 进程池之间的通信
import pymongo # 连接mongo将下载的数据保存到mongo中
header = {
"client": "4",
"version": "6922.2",
"device": "MI 6",
"sdk": "19,4.4.2",
"imei": "863254010448503", # 系统设置的国际移动设备识别码,就是手机序列号
"channel": "qqkp",
# "mac": "44:85:00:5E:5B:28",
"resolution": "720*1280",
"dpi": "1.5",
# "android-id": "4485005e5b281516",
# "pseudo-id": "05e5b28151644850",
"brand": "Xiaomi",
"scale": "1.5",
"timezone": "28800",
"language": "zh",
"cns": "3",
"carrier": "CMCC",
# "imsi": "460074485009491",
"user-agent": "Mozilla/5.0 (Linux; Android 4.4.2; MI 6 Build/NMF26X) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36",
"reach": "1",
"newbie": "1",
# "lon": "116.568176",
# "lat": "26.997867",
# "cid": "361000",
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8",
"Accept-Encoding": "gzip, deflate",
"Connection": "Keep-Alive",
# "Cookie": "duid=57158696",
"Host": "api.douguo.net",
# "Content-Length": "68",
}
def big_variety():
url = 'http://api.douguo.net/recipe/flatcatalogs'
data = {
"client": "4",
# "_session": "1537295931652863254010448503",
# "v": "1503650468",
"_vs": "2305",
}
result = requests.post(url, headers=header, data=data).json()
for every_item in result['result']['cs']: # 遍历热门、蔬菜、肉类大全...
for every in every_item['cs']: # 遍历家常菜、下饭菜...
for item in every['cs']: # 遍历上层目录中的内容
# print(item) # 整个菜谱分类中的每道菜都会被遍历且打印出来
data_detail = {
"client": "4",
# "_session": "1537295931652863254010448503",
"keyword": item['name'],
"order": "3",
"_vs": "400",
}
queue.put(data_detail) # 将详细列表的data以队列的方式存入
# print(queue.qsize()) # 结果是517说明总过有517道菜
def detail_variety(data_detail, mong):
print('当前爬取菜的名称为:', data_detail['keyword'])
detail_url = 'http://api.douguo.net/recipe/v2/search/0/20'
response = requests.post(detail_url, data=data_detail).json()
for every_item in response['result']['list']:
caipu = {}
caipu['shicai'] = data_detail['keyword']
if every_item['type'] == 13: # 只拿tyoe等于13的数据,广告等数据type不同,避免拿错数据
caipu['caipu_name'] = every_item['r']['n']
caipu['user_name'] = every_item['r']['an']
caipu['shicai_id'] = every_item['r']['id']
caipu['describe'] = every_item['r']['cookstory']
caipu['zuoliao_list'] = every_item['r']['major']
# print(caipu) # 拿到了20条数据
little_url = 'http://api.douguo.net/recipe/detail/' + str(caipu['shicai_id'])
little_data = {
"client": "4",
# "_session": "1537295931652863254010448503",
"author_id": "0",
"_vs": "2803",
"_ext": '{"query":{"id":' + str(caipu['shicai_id']) + ',"kw":' + caipu[
'shicai'] + ',"idx":"4","src":"2803","type":"13"}}',
}
res = requests.post(little_url, headers=header, data=little_data).json()
caipu['tips'] = res['result']['recipe']['tips']
caipu['cook_step'] = res['result']['recipe']['cookstep']
print('当前入库的菜谱是:', caipu['caipu_name'])
mong.insert_item(caipu) # 调用数据库中自定义的方法保存数据
else:
continue
class ConnectMongo(): # 创建一个mongodb类
def __init__(self):
self.client = pymongo.MongoClient(host='127.0.0.1', port=27017)
# 定义数据库和集合的名字
self.db = self.client['douguo']['item']
def insert_item(self, item):
self.db.insert(item)
if __name__ == '__main__':
queue = Queue() # 创建进程队列
detail = big_variety()
mong = ConnectMongo() # 实例化数据库传入要保存的队列中
detail_variety(queue.get(), mong) # 以爬取20道菜为例
queue.close()
# for i in range(20):# 将队列中所有的菜系全部取出,爬取细节逻辑没写
# detail_variety(queue.get(), mong)