当前位置:   article > 正文

Python爬取商品信息,包括标题、店铺、价格、评论数量、好评数、差评数、好评率_python爬取商品价格

python爬取商品价格

Python爬取电商商品信息,包括标题、店铺、价格、评论数量、好评数、差评数、好评率

对电商商城数据的爬取主要是评论数量的爬取,标题、店铺、价格等字段可以直接获取网页源码然后通过etree进行解析,但是评论数量字段是隐藏的,因此需要通过抓包获取

本次数据采集的目标数据包括商品名称、商品价格、商品店铺、评论数量等信息,具体如下表所示。

采集方式:通过观察页面结构查看目标数据位置,发现商品名称、价格、店铺数据都能够直接从网页中获取首先,爬取商品基本信息,需要使用requests获取到网页源码,然后通过etree的xpath模块获取指定标签的文本数据。通过模拟头部信息和cookie信息,来应对网站的反爬虫机制。

但是对于评论数据是动态加载的,无法直接解析得到。为了更完整的获取商品的评论数量数据,利用了谷歌浏览器的开发者工具,通过NetWork模块找到了评论数据所在的json包,通过抓取评论数据所在的jsob包来获取对应的数据,在通过商品id这一唯一标识来将基础数据和评论数据结合到一起。

最终得到了食品的详细数据和评论数据。

基础信息抓取

首先获取网页源码,解析标题、店铺、价格等字段,模拟的请求头信息可以通过浏览器开发者工具来查看

  1. #模拟请求头
  2. headers ={
  3. 'user-agent':''
  4. }
  5. res = requests.get(url,headers=headers)# 获取源码
  6. res.encoding = 'utf-8'# 编码格式
  7. text = res.text # 获取text
  8. #etree+xpath解析
  9. selector = etree.HTML(text)
  10. list = selector.xpath('//*[@id="J_goodsList"]/ul/li')
  11. rows = []
  12. for i in list:
  13. # 获取每条数据
  14. title=i.xpath('.//div[@class="p-name p-name-type-2"]/a/em/text()')
  15. price = i.xpath('.//div[@class="p-price"]/strong/i/text()')[0]
  16. product_id = i.xpath('.//div[@class="p-commit"]/strong/a/@id')[0].replace("J_comment_","")
  17. try:
  18. shop = i.xpath('.//div[@class="p-shop"]/span/a/text()')[0]
  19. except IndexError:
  20. shop=''
  21. title = ' '.join(title)
  22. print("title"+str(title))
  23. print("price="+str(price))
  24. print("product_id="+str(product_id))
  25. print("shop="+str(shop))
  26. print("-----")
  27. rows.append([product_id,title.replace('\n',''),price,shop,pinpai])

利用xpath进行解析还是方便哈,对于可能不存在的数据try一下

获取的数据如下

评论数量抓取

然后根据商品id获取对应的评论数据,评论数据隐藏在网页的JSON包中,访问是需要输入自己的Cookie信息

  1. #模拟请求头
  2. kv = {
  3. "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",
  4. "cookie": "你的Cookie" # cookie信息每个人都不同,需登录到网站,通过浏览器查看cookie信息
  5. }
  6. '''抓评论'''
  7. pids = data[0]
  8. for i in range(1,231):
  9. # 根据之前爬取的商品id拼接url
  10. newpids=pids[100*(i-1):100*i]
  11. comment_url = "?referenceIds="
  12. comment_r = requests.get(comment_url,headers=kv)
  13. p_comment = []
  14. for comment in comment_r.json()["CommentsCount"]:
  15. p_comment.append([comment['ProductId'],comment["CommentCountStr"], comment["AverageScore"],
  16. comment["GoodCountStr"], comment["DefaultGoodCountStr"],
  17. comment["GoodRate"],comment["AfterCountStr"],comment["VideoCountStr"],
  18. comment["PoorCountStr"], comment["GeneralCountStr"]])
  19. # 总评数,平均得分,好评数,默认好评,好评率,追评数,视频晒单数,差评数,中评数

 获取的数据如下

合并

然后通过商品id将两个csv文件进行合并 

  1. #根据商品id拼接评论数据和原始数据
  2. df1 = pd.read_csv('result.csv', encoding='utf-8')#读取第一个文件
  3. df2 = pd.read_csv('result1.csv', encoding='utf-8')#读取第二个文件
  4. df1['商品id'] = df1['商品id'].astype(str)
  5. df2['商品id'] = df2['商品id'].astype(str)
  6. outfile = pd.merge(df1, df2, left_on='商品id', right_on='商品id')#
  7. outfile.to_csv('result2.csv', index=False,encoding='utf-8')#输出文件

品牌获取

通过搜索完首页获取的所有的品牌信息,然后根据品牌来拼接url重复上述获取基础数据和评论的步骤即可

  1. # 获取品牌
  2. pinpai =getpinpai('B5%E8%84%91%E6%95%B4%E6%9C%BA&pvid=e41f3b2a96d44fceb2c2cb7fbc9aa2f5')
  3. print(pinpai[:20])
  4. for item in pinpai:
  5. # 循环100页数据
  6. for i in range(1,100):
  7. 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(
  8. item)
  9. n = i*2-1
  10. url = url+"&pvid=6921761f749b4b879c08d19588c55876&page={}".format(n)
  11. savedata(getdata(url,item))
  12. print(url)

最终数据格式如下

 更多问题可以在评论区提出,也可以私信

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/360547
推荐阅读
相关标签
  

闽ICP备14008679号