之前我们通过保存网页HTML代码的方法对饿了么商品进行爬虫。但是这种方法比较复杂,需要保存非常多的html文件。具体文章可以参阅:

这一次我们使用Fiddlerr进行抓包爬取商品数据。相关代码,文件请关注公众号:Romi的杂货铺回复饿了么Fiddler爬虫获取

Fiddler简介

Fiddler是位于客户端和服务器端之间的代理,也是目前最常用的抓包工具之一 。它能够记录客户端和服务器之间的所有请求,可以针对特定的请求,分析请求数据、设置断点、调试web应用、修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大

Fiddler的工作原理可以用下图来解释:
在这里插入图片描述
因此我们通过fiddler抓取服务器返回的数据并保存到本地即可

Fiddler抓包

在进行后续步骤前,请在电脑上安装Fiddler。

从我们之前的文章中可以确定饿了么的商品信息是通过json文件进行传输的,Json文件名都是?jsv开始。但是由于这些json文件是动态加载的同时request URL也是没有特定规范的,因此无法通过请求URL获取Json数据。

如果你想了解这些信息的具体确认步骤,请查看这篇文章:https://blog.csdn.net/qq_42692386/article/details/105825085

基于以上分析,我们使用Fiddler抓取Json文件并批量保存,这样就可以获取所有的Json数据并解析了。

具体步骤为:
1)首先查看商品信息对应的json文件找到具体的请求URL:
在这里插入图片描述
查看所有的Json文件可以发现所有的数据json文件请求 URL都包含/h5/mtop.venus.shopcategoryservice.getcategorydetail/1.1/?jsv=3.0.0
2)修改fiddler脚本并保存,使fiddler自动保存特定的数据。具体过程如下:
在这里插入图片描述

        if  (oSession.fullUrl.Contains("/h5/mtop.venus.shopcategoryservice.getcategorydetail/1.1/?jsv=3.0.0")) {
            oSession.utilDecodeResponse();
            //消除保存的请求可能存在乱码的情况
            var fso;
            var file;
            fso = new ActiveXObject("Scripting.FileSystemObject");
            //文件保存路径,可自定义
            file = fso.OpenTextFile("C:/Users/Smile/Downloads/elm_Response.txt",8 ,true, true);
            file.writeLine("Response code: " + oSession.responseCode);
            file.writeLine("Response body: " + oSession.GetResponseBodyAsString());
            file.writeLine("\n");
            file.close();

        }

3)之后重新刷新页面并下拉,点击所有的商品项目分类,确保加载所有的json文件并被filddler抓包。

4)之后就可以在我们之前fiddler脚本中设定的保存位置找到我们的所有数据信息了!

数据解析

这一步我们对上一步获取的json数据进行解析。
首先查看文件编码:

#查看文件编码
import chardet
path = r"C:\Users\Smile\Downloads\elm_Response.txt"
f = open(path,'rb')
data = f.read()
print(chardet.detect(data))

得到编码格式为UTF-16。之后通过python解析下载下来的文件。由于下载的文件格式中包含请求信息,所以需要在解析过程之中对文件进行清理。
具体代码为:

for jsondata in jsonlines:
    if jsondata not in ['\n','Response code: 200\n']:
        jsondata=jsondata.replace('Response body: ','')
        data = json.loads(jsondata)
        foods_list=data['data']['data'][0]['foods']
        for detail_info in foods_list:
            name=detail_info['name']
            currentprice=detail_info['currentPrice']
            saleunit=detail_info['defaultSaleUnit']
            org_price=detail_info['originalPrice']
            goods_name.append(name)
            goods_currentprice.append(currentprice)
            goods_orginalprice.append(org_price)
            goods_salesunit.append(saleunit)


total={}
total['商品']=goods_name;total['现价']=goods_currentprice;total['原价']=goods_orginalprice;total['售卖单位']=goods_salesunit
data_final=pd.DataFrame(total)
print(data_final)

之后就可以看到我们所需要的信息了

                           商品    现价    原价 售卖单位
0       维尔美纤纯.黄系列纸面巾110抽*12包/提  39.8          份
1              洁云绒触感抽取式纸面巾8包/提  24.9          份
2    洁云绒触感抽取式纸面巾100抽*(10+2)包/提  39.9          份
3    维达超韧颐和园系列抽取式纸面巾100抽*10包/提  52.9          份
4     维达棉韧系列三层抽取式纸面巾100抽*18包/提  43.9          份
..                         ...   ...   ...  ...
135      阿奇侬铁观音茶味奶盖珍珠雪糕 360克/盒    23    46    份
136   阿奇侬珍珠奶茶味雪糕 340克(85克*4)/盒    23    46    份
137   迷你可爱多芒果酸奶混合口味冰淇淋200g10支装  15.9          份
138           哈根达斯草莓冰淇淋  81克/杯  28.8    34    份
139           哈根达斯香草冰淇淋 392克/杯    69  85.7   

同理,如果你需要其他的商品信息,例如图片,编码等也可以通过解析Json文件得到。