Python爬取电商商品信息,包括标题、店铺、价格、评论数量、好评数、差评数、好评率
对电商商城数据的爬取主要是评论数量的爬取,标题、店铺、价格等字段可以直接获取网页源码然后通过etree进行解析,但是评论数量字段是隐藏的,因此需要通过抓包获取
本次数据采集的目标数据包括商品名称、商品价格、商品店铺、评论数量等信息,具体如下表所示。
采集方式:通过观察页面结构查看目标数据位置,发现商品名称、价格、店铺数据都能够直接从网页中获取首先,爬取商品基本信息,需要使用requests获取到网页源码,然后通过etree的xpath模块获取指定标签的文本数据。通过模拟头部信息和cookie信息,来应对网站的反爬虫机制。
但是对于评论数据是动态加载的,无法直接解析得到。为了更完整的获取商品的评论数量数据,利用了谷歌浏览器的开发者工具,通过NetWork模块找到了评论数据所在的json包,通过抓取评论数据所在的jsob包来获取对应的数据,在通过商品id这一唯一标识来将基础数据和评论数据结合到一起。
最终得到了食品的详细数据和评论数据。
基础信息抓取
首先获取网页源码,解析标题、店铺、价格等字段,模拟的请求头信息可以通过浏览器开发者工具来查看
#模拟请求头
headers ={
'user-agent':''
}
res = requests.get(url,headers=headers)# 获取源码
res.encoding = 'utf-8'# 编码格式
text = res.text # 获取text
#etree+xpath解析
selector = etree.HTML(text)
list = selector.xpath('//*[@id="J_goodsList"]/ul/li')
rows = []
for i in list:
# 获取每条数据
title=i.xpath('.//div[@class="p-name p-name-type-2"]/a/em/text()')
price = i.xpath('.//div[@class="p-price"]/strong/i/text()')[0]
product_id = i.xpath('.//div[@class="p-commit"]/strong/a/@id')[0].replace("J_comment_","")
try:
shop = i.xpath('.//div[@class="p-shop"]/span/a/text()')[0]
except IndexError:
shop=''
title = ' '.join(title)
print("title"+str(title))
print("price="+str(price))
print("product_id="+str(product_id))
print("shop="+str(shop))
print("-----")
rows.append([product_id,title.replace('\n',''),price,shop,pinpai])
利用xpath进行解析还是方便哈,对于可能不存在的数据try一下
获取的数据如下
评论数量抓取
然后根据商品id获取对应的评论数据,评论数据隐藏在网页的JSON包中,访问是需要输入自己的Cookie信息
#模拟请求头
kv = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",
"cookie": "你的Cookie" # cookie信息每个人都不同,需登录到网站,通过浏览器查看cookie信息
}
'''抓评论'''
pids = data[0]
for i in range(1,231):
# 根据之前爬取的商品id拼接url
newpids=pids[100*(i-1):100*i]
comment_url = "?referenceIds="
comment_r = requests.get(comment_url,headers=kv)
p_comment = []
for comment in comment_r.json()["CommentsCount"]:
p_comment.append([comment['ProductId'],comment["CommentCountStr"], comment["AverageScore"],
comment["GoodCountStr"], comment["DefaultGoodCountStr"],
comment["GoodRate"],comment["AfterCountStr"],comment["VideoCountStr"],
comment["PoorCountStr"], comment["GeneralCountStr"]])
# 总评数,平均得分,好评数,默认好评,好评率,追评数,视频晒单数,差评数,中评数
获取的数据如下
合并
然后通过商品id将两个csv文件进行合并
#根据商品id拼接评论数据和原始数据
df1 = pd.read_csv('result.csv', encoding='utf-8')#读取第一个文件
df2 = pd.read_csv('result1.csv', encoding='utf-8')#读取第二个文件
df1['商品id'] = df1['商品id'].astype(str)
df2['商品id'] = df2['商品id'].astype(str)
outfile = pd.merge(df1, df2, left_on='商品id', right_on='商品id')#
outfile.to_csv('result2.csv', index=False,encoding='utf-8')#输出文件
品牌获取
通过搜索完首页获取的所有的品牌信息,然后根据品牌来拼接url重复上述获取基础数据和评论的步骤即可
# 获取品牌
pinpai =getpinpai('B5%E8%84%91%E6%95%B4%E6%9C%BA&pvid=e41f3b2a96d44fceb2c2cb7fbc9aa2f5')
print(pinpai[:20])
for item in pinpai:
# 循环100页数据
for i in range(1,100):
url = '5%E8%84%91%E6%95%B4%E6%9C%BA&wq=%E7%AC%94%E8%AE%B0%E6%9C%AC%20%E7%94%B5%E8%84%91%E6%95%B4%E6%9C%BA&ev=exbrand_{}%5E'.format(
item)
n = i*2-1
url = url+"&pvid=6921761f749b4b879c08d19588c55876&page={}".format(n)
savedata(getdata(url,item))
print(url)
最终数据格式如下
更多问题可以在评论区提出,也可以私信