requests+cookie爬取淘宝任意商品评论。超详细教程!

首先使用的工具:python3.7,火狐浏览器
思路分析:现在网页版淘宝搜索商品之后,点进去,基本上都会弹出登录框,当我们直接把一个商品的链接去爬取的时候,返回的会是登陆页面的Html,所以我们第一步就是先在网页版登陆淘宝。
然后思考,为什么会返回登陆页面呢,因为淘宝的反爬会识别你的参数,也就是浏览器请求头的信息,里面包含了什么浏览器伪装,cookie了,如下图。(记住打开的是淘宝的商品,不是天猫的,淘宝页面也会有天猫店铺的商品)
在这里插入图片描述
当你把这些添加到headers里面的时候,估计就成功了一半了,然后就想,在哪找到这些呢,不急。请求头有了,需要找到评论的数据在哪个地方。看下图。
在这里插入图片描述
打开所选商品链接,记得登陆,右键检查元素,找到网络,这个时候基本上就上面几个链接,不急,先随便点击一个链接进去,然后勾选持续日志。
在这里插入图片描述
这个时候鼠标回到网页,往下滑,找到累计评价,然后点击,会发现在下面的网络里陆续接收到很多的链接。如下图。
在这里插入图片描述
由于评论都是异步加载的,在新接收的链接里面逐一检查html类型的数据,点开响应部分,就会找到商品评论的数据。若是没找到,可以重试一下上面的操作。然后我们需要找到评论的接口,点击消息头,会看到请求网址,这个网址就是接口,然后下面会有一开始提到的请求头信息。复制下来。这个时候就可以提取评论了。

    url_1 = 'https://item.taobao.com/item.htm?id=520730399218&ali_trackid=2:mm_28347190_2425761_109058700251:1577873001_188_1327372573&spm=a231o.13503973.20618785.2&pvid=f68b32d4-ee6a-4f1f-a44d-dce43e550145&scm=1007.16016.149252.0'
#找到评论接口,构造相应页数的接口
    url_2 = []
    for i in range(1,int(page)+1):
        a='https://rate.taobao.com/feedRateList.htm?auctionNumId=520730399218&userNumId=736950686&currentPageNum='

        b='&pageSize=20&rateType=&orderType=sort_weight&attribute=&sku=&hasSku=false&folded=0&ua=122%23IVbbi4I%2FEE%2BVDDpZMEp0EJponDJE7SNEEP7rEJ%2B%2FkLtu3oQLpoLiEDpWnDE0j51rpyGZp9hBuDEEJFOPpC76EJponDJL7gNpEPXZpJRgu4Ep%2BFQLpoGUEELWn4yP7SQEEyuLpEyiLy8hprzrCqhCV0TPcqByqcCkL0iXFLHCg9Demtf7NXbTwd5RuVJmKl2yrZfcCCDSqgp1uOpOPZLa8oL6JWJxNRVD7W3bEEpxngR4e6aQsupr8CpQ%2BDPEyFfOnbMOw8VanSbWuO5EELGA8oL6JNEEyBfDqMfbDEpCnSL1ul0EDLVr8CpUJ4bEyF3mqW32E5pamMp1uOQLELXr8CLi%2BLPxh69j%2BAqzDDj4EBaxCQffnQnusbN2qfNCJHNxlgsVihhv4B4ZAhKTRQqRqw2iQAiDhOjQseIozP9T3wdtIZWxIX5uPDA504COIKKxNfSqgYiW9r0Hq0I%2BWqQQg6Xe%2Bt8toVzhV82EDzraK92%2FE26ArjkuUja4pT98%2F72RnsxTwmwDDX0a%2FKTW0lY6vDjb02n5JzynN0Z2liu8I8UmnegJg2qUE72mmq4IWl%2B3XrCpyEa8WVMmN8giFSptYFwzfSJ%2BXaNdk3GIQdze%2BFMbmYiWiezJ3zRu9DVxgu3ADlRrpbzxIEXgiYrSgsawCuIu%2BQXB5shwZtvGomasIc%2FtCZlqn6QuaeuwFc%2Fpbc3bFrCIPbJP%2BWWWXQprrhC2hwFR%2F0VqEKv9SCIQoyIJWbxFldEzPmQFWWiP0at9xaf2xNLvzUE%2FMqKn7W%2FVC%2B31D4dgB7RhO5xEDjQB8rC58OWx9PwVM1hJtIZhQo%2Bd0XsDY7v%2B23SIsp6qSseBCA02j4r3%2Fg8PoVHqnw%2BGJvBmoinZiPsB3beRDSLw9C8cUqAdixKiP5xgc9qYCMgzSUJe1ZLptrWGBP%2F8tUSYUZksJE%3D%3D&_ksTS=1577888809718_1360&callback=jsonp_tbcrate_reviews_list'
        url_2.append(a+str(i)+b)
#找到cookie
    cookie=''

    headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0',
        'Host': 'rate.taobao.com',
        'Accept': '*/*',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Accept-Encoding': 'gzip, deflate, br',
        'Referer': url_1,
        'Connection': 'keep-alive',
        'Cookie' : cookie ,
        'TE': 'Trailers'
    }

上面url_1是商品的链接,不是评论的,cookie我删除了,可以换成自己的,经过对比,发现headers里面只需要修改url_1和cookie就行了,由于cookie有时效性,并且方便更换商品,我就把这两个参数提取出来,方便修改。a和b是商品的评论接口,我把他分成三个参数,a+str(i)+b,i是评论的页数,也是经过对比,页数在接口里面是以pagenum=1来显示的,改变1就改变了页数。
虽然不同页数的接口也有一个参数不同,就是里面的ua,但是都用第一页的ua,发现也能正常使用,属实找了半天ua在哪获取,找不到,结果用第一页的,误打误撞也能用。那个a是pagenum前面部分,b是后面部分。

    spider(url_2,headers)


def spider(url_2,headers):
    for y in range(len(url_2)):
        response = requests.get(url_2[y],headers=headers,timeout=30).content.decode()
        #初次评价
        evaluate = re.findall(',"content":"(.*?)","rateId"',response)
        #分类
        kinds = re.findall('"sku":"(.*?)",',response)
        for i in range(len(evaluate)):
            #将每一页的评论添加到总评论里面
            Evaluate.append({'商品的种类为:': kinds[i],'商品的初次评价为:': evaluate[i],})
        print('第'+str(y+1)+'页的评论获取成功')
        #延时,防止检测
        time.sleep(5)

    print('一共获取了'+str(len(Evaluate))+'评论')
    for i in Evaluate:
        print(i)

然后我们就可以就行抓取了,url_2是个列表,里面是上面构造的不同评论页数的接口,使用正则可以提取出评论和商品种类,然后用一个总评论列表Evaluate,存放商品种类和初次评价组合的字典,由于用户超时评价的时候,是不显示种类的,抓取出来也就是空的。贴上全部代码。

import requests
import re
import json
import time
#需要修改的参数
#url_1
#a和b
#cookie不能用时重新修改

def set_up():
#打开商品的主页面链接
    url_1 = 'https://item.taobao.com/item.htm?id=520730399218&ali_trackid=2:mm_28347190_2425761_109058700251:1577873001_188_1327372573&spm=a231o.13503973.20618785.2&pvid=f68b32d4-ee6a-4f1f-a44d-dce43e550145&scm=1007.16016.149252.0'
#找到评论接口,构造相应页数的接口
    url_2 = []
    for i in range(1,int(page)+1):
        a='https://rate.taobao.com/feedRateList.htm?auctionNumId=520730399218&userNumId=736950686&currentPageNum='

        b='&pageSize=20&rateType=&orderType=sort_weight&attribute=&sku=&hasSku=false&folded=0&ua=122%23IVbbi4I%2FEE%2BVDDpZMEp0EJponDJE7SNEEP7rEJ%2B%2FkLtu3oQLpoLiEDpWnDE0j51rpyGZp9hBuDEEJFOPpC76EJponDJL7gNpEPXZpJRgu4Ep%2BFQLpoGUEELWn4yP7SQEEyuLpEyiLy8hprzrCqhCV0TPcqByqcCkL0iXFLHCg9Demtf7NXbTwd5RuVJmKl2yrZfcCCDSqgp1uOpOPZLa8oL6JWJxNRVD7W3bEEpxngR4e6aQsupr8CpQ%2BDPEyFfOnbMOw8VanSbWuO5EELGA8oL6JNEEyBfDqMfbDEpCnSL1ul0EDLVr8CpUJ4bEyF3mqW32E5pamMp1uOQLELXr8CLi%2BLPxh69j%2BAqzDDj4EBaxCQffnQnusbN2qfNCJHNxlgsVihhv4B4ZAhKTRQqRqw2iQAiDhOjQseIozP9T3wdtIZWxIX5uPDA504COIKKxNfSqgYiW9r0Hq0I%2BWqQQg6Xe%2Bt8toVzhV82EDzraK92%2FE26ArjkuUja4pT98%2F72RnsxTwmwDDX0a%2FKTW0lY6vDjb02n5JzynN0Z2liu8I8UmnegJg2qUE72mmq4IWl%2B3XrCpyEa8WVMmN8giFSptYFwzfSJ%2BXaNdk3GIQdze%2BFMbmYiWiezJ3zRu9DVxgu3ADlRrpbzxIEXgiYrSgsawCuIu%2BQXB5shwZtvGomasIc%2FtCZlqn6QuaeuwFc%2Fpbc3bFrCIPbJP%2BWWWXQprrhC2hwFR%2F0VqEKv9SCIQoyIJWbxFldEzPmQFWWiP0at9xaf2xNLvzUE%2FMqKn7W%2FVC%2B31D4dgB7RhO5xEDjQB8rC58OWx9PwVM1hJtIZhQo%2Bd0XsDY7v%2B23SIsp6qSseBCA02j4r3%2Fg8PoVHqnw%2BGJvBmoinZiPsB3beRDSLw9C8cUqAdixKiP5xgc9qYCMgzSUJe1ZLptrWGBP%2F8tUSYUZksJE%3D%3D&_ksTS=1577888809718_1360&callback=jsonp_tbcrate_reviews_list'
        url_2.append(a+str(i)+b)
#找到cookie
    cookie=''

    headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0',
        'Host': 'rate.taobao.com',
        'Accept': '*/*',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Accept-Encoding': 'gzip, deflate, br',
        'Referer': url_1,
        'Connection': 'keep-alive',
        'Cookie' : cookie ,
        'TE': 'Trailers'
    }
    spider(url_2,headers)


def spider(url_2,headers):
    for y in range(len(url_2)):
        response = requests.get(url_2[y],headers=headers,timeout=30).content.decode()
        #初次评价
        evaluate = re.findall(',"content":"(.*?)","rateId"',response)
        #分类
        kinds = re.findall('"sku":"(.*?)",',response)
        for i in range(len(evaluate)):
            #将每一页的评论添加到总评论里面
            Evaluate.append({'商品的种类为:': kinds[i],'商品的初次评价为:': evaluate[i],})
        print('第'+str(y+1)+'页的评论获取成功')
        #延时,防止检测
        time.sleep(5)

    print('一共获取了'+str(len(Evaluate))+'评论')
    for i in Evaluate:
        print(i)

if __name__ == '__main__':
    page = input('输入想获取多少页的评论:')
    # 存放评价的列表
    Evaluate = []
    set_up()

在这里插入图片描述
总结:再用正则处理数据的时候遇到了一个坑,就是抓的种类数量和评价数量不一致,这就会导致字典里面,评价和种类可能不是一一对应的,有的人追加评价,那个正则也把它给提取出来了,忙活了一两个小时,突然想到,把正则改一下就行了,因为评价和追评在网页代码上还是有一“点”不同的。总而言之,理论上上面的代码只需要修改url_1、a和b、cookie,就可以爬取别的商品了,cookie还是会随时改变的,有时效性。还有一点就是,这个是淘宝的,不是天猫的,淘宝网页会出现天猫店铺的商品,它俩网页是有一些不同的。等会把天猫的发出来,百分之90都是一样的。

后面完善的时候,可以将数据存到mongodb数据库,用scrapy-redis分布式爬虫,抓取多个商品的评论、也可以用多个账号,获取cookie来回使用,加上ip代理,防止淘宝反爬检测。

记录学习,一起加油!有不理解的地方可以评论 😃

  • 12
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值