Python爬虫学习笔记-第三十一+三十二课(fiddler工具的使用)

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()

运行结果:

在这里插入图片描述

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...