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

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)

最终数据格式如下

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

  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_892532969

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值