在抓取动态页面的时候会出现一些特殊的情况导致获取json取得数据比较困难,这个时候只能使用其他的爬取自动化爬取方式,但是相对门槛比较高比较麻烦,所以对于一些特殊的情况可以采取一下半自动化的手段​–保存html后进行爬虫。

例如现在我想爬取一个饿了么的店铺里的商品信息和商品的价格

1.首先登陆饿了么的网页端https://h5.ele.me/

2.登陆之后我们可以很明显看到是手机端的页面,按F12进入开发者模式(使用的是Chrome浏览器),点击下图红框部分可以切换网页和手机视图浏览
image.png

3.之后选择一家店进入。需要注意的是饿了么店铺之间的差距其实还是比较大的,需要找一个商品数量较多,分级层数也比较多的店铺来做测试

4.之后同样右键查看源码,直接找第一个商品的名称,发现源码中没有对应的商品名称,基本上可以确定是动态加载的页面
image.png

5.按F12进入开发者界面,选择XHR并刷新界面,按Ctrl+F查找商品名称,根据返回的结果并查看对应的文件中的内容可以定位文件
image.png

多层下拉后可以找到对应的数据位置

6.目前看起来似乎还好,页面中加载了所有的需要的数据,但是当接着
向下看就会有问题出现。例如这里选择儿科用药:
image.png
会发现一个页面中对应的有多个动态加载文件,也就是说在下拉的过程中动态加载的。

7.这样没有办法,去找一下请求URL有没有规律吧。通过比较发现URL中前后差别较大而且无法找到固定的规律

在线文本比对工具:https://text-compare.com/

image.png

所以对于这样的网站无法一个一个请求URL获取数据,就可以先保存HTML文件到本地之后再解析
1.首先将网页下拉到最后,右键保存网页
image.png

2.打开下载的html文件,可以看到所有的数据已保留,这个时候就可以像普通的静态网页一样解析即可。唯一的区别就是不是再用request去请求网页解析,而是直接解析本地的html文件
image.png

这种方法算是无法爬取页面的一个解决办法,算是一个半自动化的方法。
之后我们就可以通过解析HTML的方法进行商品数据的抓取了。

import re
import pandas as pd

#读取本地的html文件
path=r"C:\Users\Desktop\test.html"
fp = open(path,'rb')
html = fp.read().decode('utf-8')

#对html进行解析
#([\s\S]*使用正则提取所有的字符串,?表示使用使用非贪婪模式
goodslist=re.findall(r'<div class="name" data-s-2fa74f50fceca7d0683c7058722358a8="">([\s\S]*?)</div>',html)
#-?\d+\.?\d*e?-?\d*?提取所有的数字,包括小数
currentpricelist=re.findall(r'¥</span>(-?\d+\.?\d*e?-?\d*?)</div>',html)

#将list转为datafarme
goods=pd.DataFrame(goodslist)
currentprice=pd.DataFrame(currentpricelist)
#横向拼接
result=pd.concat([goods,currentprice],axis=1)
#更改dataframe列名称
result.columns=['商品名','现价']
#保存文件
result.to_excel(r"C:\Users\Desktop\result.xlsx",index=None)