当当网动态数据爬取
- 静态数据爬取
- 动态数据爬取
- 接口参数的获取
静态数据爬取
进入图书详情,这里的图书数据信息比如标题、价格、图片都是非结构化数据,可以使用xpath语法提取。是很简单的数据采集了,就不细说了。
动态数据爬取
滑到下面这里的数据,像大图,内容简介等这些,我们通过详情页静态页面数据是找不到对应的数据内容的,而且通过全局搜索我们也找不到对应的内容。这就不好办了。但是作为动态加载的数据,那肯定在返回的接口数据中可以找到对应的内容。
现在我们只能通过一个一个接口看了,不过看接口也是有技巧的,比如这里他有这么长的大图数据,说明这个接口数据的大小不会很小,应该是数据比较大的。
最终发现是倒数第二个接口数据返回的内容,里面就有我们要的内容。
说是动态数据,其实返回回来的接口数据也是一个html文本内容。最后我们提取也是可以用xpath语法提取,或者习惯哪种方法就哪种方法提取。
接口参数的获取
那么这个接口的参数需要传递什么?还有要如何获取这些参数呢?这不同的图书总有各自对应的参数吧。
经过测试发现,主要这四个参数是变换的,这四个参数在图书详情页静态页面数据里可以找到,这里就可以通过全局搜索找到,我也是通过全局搜索搜到的。
但是要提取出来就发现这个数据是在js语法里面
用xpath提取不了,只能通过正则语法把这个参数数据提取出来,直接看代码吧
try:
# 先获取详情页数据
res = requests.get(url, headers=headers, cookies=cookies)
# print(res.status_code)
except requests.exceptions.ProxyError as e:
print(f"Proxy error: {e}")
# print(res.text)
book_detail_html = etree.HTML(res.text)
# print(re.findall(r'var prodSpuInfo = (.*);', res.text))
playload = json.loads(re.findall(r'var prodSpuInfo = (.*);', res.text)[0])
# print(playload)
# 在这里获取通过playload载荷请求接口
params = {
'r': 'callback/detail',
'productId': playload['productId'],
'templateType': 'publish',
'describeMap': playload['describeMap'],
'shopId': playload['shopId'],
'categoryPath': playload['categoryPath'],
}
# 这个作为接口参数
try:
detail_res = requests.get('https://product.dangdang.com/index.php', params=params, cookies=cookies,
headers=headers)
except requests.exceptions.ProxyError as e:
print(f"Proxy error: {e}")
上面就是获取动态数据的所有内容。点个赞吧,大佬!