最近在学习Python爬虫,写博客记录一下我的第一个爬虫的创建过程
Python3.0以上、Pycharm
爬虫是模拟浏览器发出请求的,因此我们可以调用第三方requests库中的get请求来获取评论
而get请求中有三个参数,分别为url、params、header
我们需要找到能够返回评论的URL,之前的很多教程都是在网页源代码中找到的URL,但现在已经取消,用ajax动态加载,因此我们需要用chrome浏览器的控制台进行抓包。首先登陆淘宝,打开任意一个宝贝的页面,按f12进入控制台,选择network,按ctrl+R进行抓包。然后我们打开累计评论的第二页(第二页不容易被反爬),随便选择评论中的一句话,复制,在search中搜索
然后我们可以看到复制的评论已经搜索到,点击Headers,问号前的部分即为我们需要的URL
url="https://rate.tmall.com/list_detail_rate.htm"#获取返回评论的URL
params用于添加到URL的请求字符串中,同样在刚刚的Headers中,向下翻可找到QueryStringParameters
其中ItemId、sellerId、currentpage、order、callback都是我们需要的
params={
"itemId" :"20762164858",
"sellerId" :"779529792",
"currentPage" :i,#i用于表示页数,等等会在循环中使用
"order" :"3",
"callback" :"jsonp566",
}
headers即请求头与http协议有关,我们需要在headers中写入cookie、user-agent、referer三项,这三项均可在刚刚的Header中找到,要注意cookie要与params中的callback对应,否则无法得到响应(之前的教程中都没有cookie,但淘宝更新后,不添加cookie会自动跳转到登录界面,所以必须加)
header={
"cookie":"cna=CKNiFp8nOl4CATFOr7ieFJ3M; hng=CN%7Czh-CN%7CCNY%7C156; lid=%E8%91%A3%E6%96%87%E9%9F%AC1002; enc=1j0Gy%2Fb%2F3Hdnzhza%2FtUdD9RqdCuL8QaPzzTy%2FYMyYaADA8cViSQC5%2FYXtNHptAaPDyPd92bHhDKxxgrBlzyDIw%3D%3D; uc1=cookie14=UoTbmVnVwb9ePg%3D%3D; t=99fe5d412b02db800ee8cd1975efc07d; uc3=lg2=W5iHLLyFOGW7aA%3D%3D&id2=UNQ%2BpO1xdZK6UA%3D%3D&nk2=1VAtBvTMWv6LtA%3D%3D&vt3=F8dByuQBIbkTI5itVoY%3D; tracknick=%5Cu8463%5Cu6587%5Cu97EC1002; uc4=nk4=0%4014w9yJPJPTHwS3Df7cJ%2BhcIiwsRM&id4=0%40UgP13Vpe9mGRwCa5CC1sJEU4oVyN; lgc=%5Cu8463%5Cu6587%5Cu97EC1002; _tb_token_=e85be5357e9ee; cookie2=1d9f64cc73afd0313f75cc27de08afb2; _m_h5_tk=6ed78dab07cbd3fd1bdeab4416a7b3cb_1574952701437; _m_h5_tk_enc=636e4c7f8a5b9bc8500fe38fa24a4ad6; isg=BEdHp_0k1gHf2FKJvHYA41kJ1vvR5DBt0OpDzRk071ZxiGRKdR-jflgOKghzYPOm; l=dBIGAagmqVevDaLWBOfZhurza77ToIRf1sPzaNbMiICP9B1X5PYPWZp3VbTWCnGVn6ycf3Jt3efYBzYiSyUBlZXRFJXn9MpTDd8h.",
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
"referer":"https://detail.tmall.com/item.htm"
}
我们通过get函数得到的请求是一段json格式的代码
然后我们需要将他转化为字典格式
req=requests.get(url,params,headers=header).text[11:-1]#调用get请求获取json返回值
dict=json.loads(req,strict=False)
tbjson=json.dumps(dict,indent=2)
review=json.loads(tbjson)#review即我们需要的字典
至此,我们已经获得带有评论、日期、颜色尺码的字典,接下来的工作就是循环处理,以及对字典数据的分析,并将内容写入Excel表格,方便我们进行统计。全部代码如下:
import requests
import json
import time
import xlwt#用于进行Excel操作的库
workbook = xlwt.Workbook(encoding = 'utf-8')
worksheet = workbook.add_sheet('1')#创建新的Excel页
url="https://rate.tmall.com/list_detail_rate.htm"#获取url
header={
"cookie":"cna=CKNiFp8nOl4CATFOr7ieFJ3M; hng=CN%7Czh-CN%7CCNY%7C156; lid=%E8%91%A3%E6%96%87%E9%9F%AC1002; enc=1j0Gy%2Fb%2F3Hdnzhza%2FtUdD9RqdCuL8QaPzzTy%2FYMyYaADA8cViSQC5%2FYXtNHptAaPDyPd92bHhDKxxgrBlzyDIw%3D%3D; uc1=cookie14=UoTbmVnVwb9ePg%3D%3D; t=99fe5d412b02db800ee8cd1975efc07d; uc3=lg2=W5iHLLyFOGW7aA%3D%3D&id2=UNQ%2BpO1xdZK6UA%3D%3D&nk2=1VAtBvTMWv6LtA%3D%3D&vt3=F8dByuQBIbkTI5itVoY%3D; tracknick=%5Cu8463%5Cu6587%5Cu97EC1002; uc4=nk4=0%4014w9yJPJPTHwS3Df7cJ%2BhcIiwsRM&id4=0%40UgP13Vpe9mGRwCa5CC1sJEU4oVyN; lgc=%5Cu8463%5Cu6587%5Cu97EC1002; _tb_token_=e85be5357e9ee; cookie2=1d9f64cc73afd0313f75cc27de08afb2; _m_h5_tk=6ed78dab07cbd3fd1bdeab4416a7b3cb_1574952701437; _m_h5_tk_enc=636e4c7f8a5b9bc8500fe38fa24a4ad6; isg=BEdHp_0k1gHf2FKJvHYA41kJ1vvR5DBt0OpDzRk071ZxiGRKdR-jflgOKghzYPOm; l=dBIGAagmqVevDaLWBOfZhurza77ToIRf1sPzaNbMiICP9B1X5PYPWZp3VbTWCnGVn6ycf3Jt3efYBzYiSyUBlZXRFJXn9MpTDd8h.",
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
"referer":"https://detail.tmall.com/item.htm"
}#构造header
for i in range(2,100,1):#爬取2至99页的内容(淘宝评论最多显示99页)
params={
"itemId" :"20762164858",
"sellerId" :"779529792",
"currentPage" :i,#当前页数
"order" :"3",
"callback" :"jsonp566",
}
req=requests.get(url,params,headers=header).text[11:-1]#获得请求,除去一些不利于我们进行json转字典操作的字符
print(req)#打印一下,观察是否获取了请求
dict=json.loads(req,strict=False)
tbjson=json.dumps(dict,indent=2)
review=json.loads(tbjson)#review中包含了当前页所有的评论
for p in range(1,20,1):#每页有20个评论
data1=review["rateDetail"]["rateList"][p]['auctionSku']#颜色尺码
data2=review["rateDetail"]["rateList"][p]['rateContent']#评论内容
data3=review["rateDetail"]["rateList"][p]['rateDate']#评论日期
time.sleep(0.5)#写一次暂停0.5秒,相当于爬一个页面休息10秒,防止访问过快被制裁
worksheet.write(20*(i - 2) + p - 1, 0, data3)
worksheet.write(20*(i-2)+p-1,1,data1)
worksheet.write(20*(i-2)+p-1,2,data2)#写入Excel操作
workbook.save('E:\\spiders.xls')#保存
右键run,需要大概十分钟时间
由于一个宝贝最多有2000条评论,我用同样的方法爬取了5个不同的宝贝,约1w条记录
最后就是枯燥的Excel操作,下方是处理完毕的图
最后上统计图
over