本来只是想简单地抓个好评数,在一开始的搜索结果页面上
然后发现抓不到,用lxml里面etree解析的是空的
问题就变烦了,问了一下前同事,告诉我说是异步渲染的
在这里找到了所有有关评论的请求:
请求得到的是json格式数据:
url明显是商品id拼起来的,所以就要先获取整个页面上所有的商品id
pids = html1.xpath('//li[contains(@class,"gl-item")]/attribute::data-pid')
然后拼个url出来,发请求,最后解析一下json就可以了
'''抓评论'''
pids = html1.xpath('//li[contains(@class,"gl-item")]/attribute::data-pid')
comment_url = "https://club.jd.com/comment/productCommentSummaries.action?referenceIds="
for pid in pids:
comment_url += pid + ","
comment_r = requests.get(comment_url)
p_comment = []
for comment in comment_r.json()["CommentsCount"]:
p_comment.append([comment["CommentCount"],comment["AverageScore"],comment["GoodCount"],
comment["DefaultGoodCount"],comment["GoodRate"],comment["AfterCount"],
comment["VideoCount"],comment["PoorCount"],comment["GeneralCount"]])
# 总评数,平均得分,好评数,默认好评,好评率,追评数,视频晒单数,差评数,中评数
原程序参照这个写的https://blog.csdn.net/xing851483876/article/details/80817578#commentsedit
但评论那边有问题,就是底下回复里提到的数组越界(因为p_comment是空的)
修改之后完整代码如下(只爬取了2页共120条):
import requests
from lxml import etree
import time
import csv
#定义函数抓取每页前30条商品信息
def crow_first(n):
#构造每一页的url变化
url='https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page='+str(2*