之前我们通过保存网页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文件得到。