赞
踩
更新:目前淘宝的参数已经变更,这是2020年(2020.4)的代码参数,已经无法使用。但是,思路仍然可以参考。
目前网站上很多爬取评论的博文都已经失效了,所以自己尝试写一篇目前可行的爬取代码。我们以爬取淘宝的APPLE官方旗舰店的Iphone11为例。
打开淘宝页面,按下F12快捷键,进入开发者模式。点击累计评价。然后在开发者窗口左上角输入list,找到相应的进程。
这里发现了评论。寻找请求头headers信息。找到请求的url,发现其中只有三个参数是会改变的。发现其中的规律。
首先是"currentPage"参数,这是评论的页码,
第二个是"_ksTS"参数,通过观察得出这是一个时间戳,并且下划线前面的是
13位数字,这是固定的,多余的时间戳都放到下划线的后面。
这里用time模块的time方法构造。
import time
t_param=time.time()
t_list=str(t_param).split(".") #将时间戳格式拆分
t_list[0]+t_list[1][:3] #这是下划线前面的部分
t_list[1][3:] #这是下划线后面的部分
第三个参数是callback回调参数。这个参数前面的"jsonp"是固定的,后面的数字是time参数的最后三个数字加一,图中的337=336+1。
"callback":str(int(t_list[1][3:])+1)
这样页面的url就基本构造完成,只需把url的上述三个参数删除即可。
其实这里的url里面的 ua 参数好像是可有可无的,不影响,可以自己尝试一下。
url=“https://rate.tmall.com/list_detail_rate.htm?itemId=602659642364&sellerId=1917047079”
url构造好了现在只需构造请求头信息,参数信息均可在Headers选项中找到。
headers={
"Cookie":""
"referer":""
"User-Agent":""
}
现在将代码整合:
import requests import time import json def get_content(url): t_param=time.time() t_list=str(t_param).split(".") headers={ "Cookie":"", "referer":"", "User-Agent":"" } params={ "callback":str(int(t_list[1][3:])+1), "_ksTS":t_list[0]+t_list[1][:3]+"_"+t_list[1][3:], "currentPage":"1" } res=requests.get(url,params=params,headers=headers).text print(res)
这里我们先看一下获取的文本的格式,可以看出这是一个json格式的,但是这个文本在前面多了冗余的部分我们需要将它删除才能正确解析。
res=requests.get(url,params=params,headers=headers).text[len(str(int(t_list[1][3:])+1))+3:-1]
#前面的多余部分就是"_ksTS"参数下划线后面的部分
#注意末尾还有一个括号,不同评论索引需要进行相应的调整。
接下来使用json库进行解析。输出如下。这里如果报错,应该是text处的索引不对,可以确认一遍进行修改。
res2=json.loads(res)
res3=json.dumps(res2,indent=4)
#以上两步是为了美化json的输出格式,方便获取内容,省略也可。
result=json.loads(res3)
要获取我们的需要的信息需要进行索引。结果如下。
result_content=result["rateDetail"]["rateList"][0]["rateContent"]
#索引中的[0]是获取第一条评论,可以进行循环一页获取20条评论。这里只是示例。
这里就基本运行完成。可以整合一下代码并加入循环。
import requests import time import json def get_content(url): t_param=time.time() t_list=str(t_param).split(".") headers={ "Cookie":"", "referer":"", "User-Agent":"" } params={ "callback":str(int(t_list[1][3:])+1), "_ksTS":t_list[0]+t_list[1][:3]+"_"+t_list[1][3:], "currentPage":"1" } res=requests.get(url,params=params,headers=headers).text[len(str(int(t_list[1][3:])+1))+3:-1] res2=json.loads(res) res3=json.dumps(res2,indent=4) #以上两步是为了美化json的输出格式,方便获取内容,省略也可。 result=json.loads(res3) for items in range(20): result_content=result["rateDetail"]["rateList"][items]["rateContent"] print(result_content)
后续可以自己完善代码,将结果写入文件,也可以加入循环爬取更多页码的评论。这里不再详写。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。