爬虫项目八:Python对天猫商品数据、评论数据爬取


前言

天猫商城商品数据、评论数据爬取


提示:以下是本篇文章正文内容,下面案例可供参考

一、商品数据

爬取天猫商城商品数据,观察页面没有动态加载,但是页面会是不是出现登录界面,所以选择selenium登录的方式爬取商品数据,整个爬虫的过程中需要mitmdump拦截伪装,详情可看我主页文章淘宝
https://blog.csdn.net/weixin_47163937/article/details/114998786

1.分析url

我们看一下第一页的url一共有5个参数,其中肯定有无用参数,根据以往的爬虫经验可以确定的是q表示的是商品关键字

https://list.tmall.com/search_product.htm?
q=%D0%A1%C3%D7
&type=p
&vmarket=
&spm=875.7931836%2FB.a2227oh.d100
&from=mallfp..pc_1_searchbutton

再看第二页的url,多了几个参数,这几个参数又没用呢?反复试试就好

https://list.tmall.com/search_product.htm?
spm=a220m.1000858.0.0.6a205623Xb1F3l
&s=60
&q=%D0%A1%C3%D7
&sort=s
&style=g
&from=mallfp..pc_1_searchbutton
&smAreaId=130500
&type=pc#J_Filter

最后剩下的有用参数就只有两个,一个是表示关键字的q还有一个s,从下面的规律来看,s就是表示商品个数,从第几个商品个数开始显示,规律就是每下页s+60 第一页为0 即:s=(page-1)60,q表示关键字可以直接换成中文*

第一页:https://list.tmall.com/search_product.htm?&s=0&q=%D0%A1%C3%D7
第二页:https://list.tmall.com/search_product.htm?&s=60&q=%D0%A1%C3%D7
第三页:https://list.tmall.com/search_product.htm?&s=120&q=%D0%A1%C3%D7

最终的url模板

https://list.tmall.com/search_product.htm?&s=(page-1)*60&q=商品关键字

2.登录账号

如果看过我之前写的淘宝的爬虫登录我想这就不用说了,可以看下面的连接文章

https://blog.csdn.net/weixin_47163937/article/details/114998786

使用扫码登录手机淘宝确认的方式实现登录,其中整个爬虫的过程中需要mitmdump拦截伪装,CMD进入文件夹 调用mitmdump -s HttpProxy.py -p 9000
上面链接的文章已经详细说明

通过selenium访问页面出现登录页面强制休眠40秒,手机扫码登录

3.解析数据

扫码登录进入页面之后,我们来打印一下一共有多少页数,这样可以了解我们要获取多少页
在这里插入图片描述
通过xpath定位获取文本,再利用正则表达式提取出页数

page = self.bro.find_element_by_xpath('//form[@name="filterPageForm"]').text
page=int(re.findall('(\d+)',page)[0])

根据页数我们可以制作循环,利用input交互式翻页

self.start_page=input("请输入起始页数:")
self.end_page=input("请输入结束页数:")
for i in range(int(self.start_page),int(self.end_page)+1):
    self.bro.get("https://list.tmall.com/search_product.htm?s=%d&q=%s"%((i-1)*60,self.keyword))

进入商品页面,右键检查元素,可以看到,每一个商品数据都在div标签下
在这里插入图片描述
根据这些,可以利用Xpath定位来获取数据

代码如下(示例):

html=etree.HTML(self.bro.page_source)
div_list=html.xpath('//div[@id="J_ItemList"]/div')
for div in div_list:
    dic={}
    try:
        dic["title"]=div.xpath('.//p[@class="productTitle"]/a[1]/@title')[0]
    except:
        dic["title"]=""
    try:
        dic["price"]=div.xpath('.//p[@class="productPrice"]/em[1]/@title')[0]
    except:
        dic["price"]=""
    try:
        dic["sales"]=re.findall('(\d+)',div.xpath('.//p[@class="productStatus"]/span[1]/em[1]/text()')[0])[0]
    except:
        dic["sales"]=""
    print(dic)
    with open(".//tmall.csv", "a+", encoding="utf-8") as f:
        writer = csv.DictWriter(f, dic.keys())
        writer.writerow(dic)

4.模拟滑动滑块

当你完成扫码登录时有可能出现滑块,需要直接手动滑走,我试过用selenium滑动 别检测了 不可以,我把滑块代码放下面 有兴趣的自己研究
在这里插入图片描述

def Page_Slider_Slide(self):
    Slider = self.bro.find_element_by_xpath('//*[@id="nc_1_n1z"]')
    # 动作链
    action = ActionChains(self.bro)
    # 点击长按指定的标签
    action.click_and_hold(Slider).perform()
    action.move_by_offset(xoffset=260, yoffset=0).perform()
    action.release()

效果
在这里插入图片描述

二、评论数据

我们通过chrome的抓包工具可以 利用搜索功能找到评论数据包

在这里插入图片描述

1.分析url

https://rate.tmall.com/list_detail_rate.htm?
itemId=637718172384
&spuId=1974781701
&sellerId=2024314280
&order=3
&currentPage=2
&append=0
&content=1
&tagId=
&posi=
&picture=
&groupId=
&ua=098%23E1hvQ9v4vfIvUvCkvvvvvjiWPLdOljDRP2FpsjthPmPOAj3vPFcwQjiPn2cZsjtn9vhvHHiwrTCozHi47qBTt1Q471Y4NYGBdvhvmpvC8QPHvv2ldTQCvvyvvBGz49vvG6u%2BvpvEvvHOcRIvvVIb9vhv2HiwRM%2FSjHi473qPzTQCvCZV9NFqq9vvOUZDjlRDKfZ3%2BbydLrVvvpvZ7DSGMl2w7Di4fSS5MvrfwxdLz6k%2BvpvEvvHZZHyvvveNi9hvCvvvpZpgvpvhvvCvpvgCvvpvvPMMvvhvC9mvphvvvv9CvhQCTaNcjXZTKFyzOvxr1EKK5u6aWXxreEAK53rV%2BE7reEuKNZ0QD40Oe4tYLfmD5iyfezBO0f06W3vOJ1kHsfUpV36AxYjxRLwp%2B3%2BFkvhvC9hvpyP9t89Cvv9vvhhtIp3n7d9Cvm9vvhCvvvvvvvvvByOvvvHivvCVB9vv9LvvvhXVvvmCjvvvByOvvUhw39hvCvmvphm%2BvpvEvUhE2aOvvUn4dvhvmpmvlnC%2FvvmEU29CvvpvvhCvdvhvmpmCfeiwvvm8%2BTQCvChhvJSSu9vvgwODj6KHkoVQRL9CvvpvvhCvdvhvmpmCZHRNvvCQZOvCvv14cx2zKn147DIqQnGgvpvhvvCvpv%3D%3D&needFold=0&_ksTS=1616652793241_1231
&callback=jsonp1232

经过筛选最终剩余有用的参数

https://rate.tmall.com/list_detail_rate.htm?
itemId=638745107951
&sellerId=268451883
&order=3
&currentPage=2 ==>页数

2.解析数据

请求头应包含referer、cookie、user-agent

head={
   "referer":"https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.19.7fae1259B86Ot8&id=638745107951&skuId=4750693590803&areaId=130100&user_id=268451883&cat_id=2&is_b=1&rn=e8a3583611f939545fa4eff7ad5d1e04",
   "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
   "cookie":"hng=CN|zh-CN|CNY|156; lid=tb850619367; enc=XWYuCFHvbY6LVFJ8O82ekXp7zn+BpC5PqaDfnxPqRhFZ3W/9+P5VfZz/dkT7I/bzeQzh30BWA80E8sSw7Zc/9Y6soPAlKMR2SftG72vIPXM=;"
        }

我们利用url并且添加请求头信息返回的数据中有干扰数据,其中开头的jsonp128就是

jsonp128({"rateDetail":{"rateCount":{"total":742,"shop":0,"picNum":431,"used":49}

我们将其返回数据字符串剔除掉无用数据,再将其转换为json数据

 text=requests.get(url=url,headers=head,params=params).text
 text=text.replace("jsonp128","").replace("(","").replace(")","")
 data=json.loads(text)

我们将数据放到json.cn中观察,可以看到所以的评论数据数据在rateList中
在这里插入图片描述
代码如下(示例):

for da in data["rateDetail"]["rateList"]:
    dic={}
    try:
        dic["displayUserNick"]=da["displayUserNick"]
    except:
        dic["displayUserNick"]=""
    try:
        dic["auctionSku"]=da["auctionSku"]
    except:
        dic["auctionSku"]=""
    with open(".//comment.csv", "a", encoding="utf-8") as f:
        writer = csv.DictWriter(f, dic.keys())
        writer.writerow(dic)

效果
在这里插入图片描述
完整代码在公众号”阿虚学Python“回复”天猫“获取
在这里插入图片描述
谢谢大家的观看

  • 3
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值