赞
踩
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)
最终数据格式如下
更多问题可以在评论区提出,也可以私信
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。