python爬虫二十三:使用fiddler抓取app数据(三)

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)

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值