Python爬取百度指数中的搜索指数

Python爬取百度指数中的搜索指数

2023年7月9日发(作者:)

Python爬取百度指数中的搜索指数本⽂是在实际需要中使⽤爬⾍获取数据,然后进⾏对应的数据分析,仅是学习⽤途,特此记录。1.环境:Python3.7+PyCharm1.1 所需要的库:datetime,requests,execjs(⾮必须)2.百度指数中的数据获取难点:2.1 百度指数的URL请求地址返回的数据,并不是可以直接进⾏json解析使⽤的数据,⽽是加密之后的数据和uniqid,需要通过uniqid再次请求对应的地址(后⾯部分介绍)获取到解密的密钥,然后在前端页⾯进⾏解密,然后再渲染到折线图中。2.2 必须要在百度指数页⾯登录百度账号,由于时间关系,本次数据爬取都是在登录之后进⾏的操作。2.3 需要将前端解密代码转化为Python代码,获取直接使⽤前端代码也可以。2.3.1 不转换像下⾯这样使⽤也可以解密,直接利⽤execjs直接JavaScript代码即可。# Python的强⼤之处就在于,拥有很强⼤的第三⽅库,可以直接执⾏js代码,即对解密算法不熟悉,⽆法转换为Python代码时,直接执⾏js代码即可 js = e(''' function decryption(t, e){ for(var a=(""),i=(""),n={},s=[],o=0;o

调⽤此⽅式解密,需要打开上⾯的注解2.3.2 前端JavaScript代码对应的Python代码#

搜索指数数据解密def decryption(keys, data): dec_dict = {} for j in range(len(keys) // 2): dec_dict[keys[j]] = keys[len(keys) // 2 + j] dec_data = '' for k in range(len(data)): dec_data += dec_dict[data[k]] return dec_data2.4 获取⾃⼰登陆之后的Cookie(必须要有,否则⽆法获取到数据),具体的Cookie获取如下图,请注意看我下图标红的地⽅。3.爬取数据的步骤3.1 构建请求头,爬⾍必须,请求头直接全部复制2.4中的请求头即可。header = { 'Accept': 'application/json, text/plain, */*', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', 'Cookie': '你登陆之后的Cookie', 'Host': '', 'Referer': '/v2/main/', 'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"', 'sec-ch-ua-mobile': '?0', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36' }3.2 分析url3.2.1 请求数据的url,2.4已经给出dataUrl = '/api/SearchApi/index?area=0&word=[[%7B%22name%22:%22%E4%B8%BD%E6%B1%9F%E5%8F%A4%E5%9F%8E%22,%22wordType%22:1%7D]]&days=30'其中,汉字和部分符号被替换,只需找到对应的汉字部分即可,%22是",所以,哪⾥是汉字,对⽐浏览器的地址栏就晓得了吧,url最后的days=30,代表获取⼀个⽉的数据,从当前⽇期的前⼀天往前推⼀个⽉,可以根据需要修改days获取更多的数据或者更少的数据。在浏览器中输⼊dataUrl中的内容,可以得到以下数据经过对all,pc,wise对应的数据进⾏解密,和搜索指数的折线图显⽰的数据对⽐,发现all部分的数据就是搜索指数的数据。本次请求返回的数据就在这⾥了,可以看到uniqid,⽽且每次刷新加密的数据和uniqid都会变。3.2.2 获取密钥的url经过多次分析,发现请求数据的url下⾯的uniqid出现在了下⾯这个url中因此需要先对请求数据对应的url进⾏数据获取,解析出搜索指数对应的加密数据和uniqid,然后拼接url获取密钥,最后调⽤解密⽅法解密即可获取到搜索指数的数据。keyUrl = '/Interface/ptbk?uniqid='3.2.3 找到了对应的url,我们的爬⾍也就完成了,接下来就是发送请求,解析数据,然后对数据进⾏解密即可。4.完整代码import datetimeimport requestsimport execjs#

搜索指数数据解密def decryption(keys, data): dec_dict = {} for j in range(len(keys) // 2): dec_dict[keys[j]] = keys[len(keys) // 2 + j] dec_data = '' for k in range(len(data)): dec_data += dec_dict[data[k]] return dec_dataif __name__ == "__main__": scenicName = '丽江古城' dataUrl = '/api/SearchApi/index?area=0&word=[[%7B%22name%22:%22' + scenicName + '%22,%22wordType%22:1%7D]]&days=30' keyUrl = '/Interface/ptbk?uniqid=' header = { 'Accept': 'application/json, text/plain, */*', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', 'Cookie': '你登陆之后的Cookie', 'Host': '', 'Referer': '/v2/main/', 'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"', 'sec-ch-ua-mobile': '?0', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36' } #

设置请求超时时间为30秒 resData = (dataUrl, timeout=30, headers=header) uniqid = ()['data']['uniqid'] print("uniqid:{}".format(uniqid)) keyData = (keyUrl + uniqid, timeout=30, headers=header) _for_status() ng = nt_encoding #

开始对json数据进⾏解析 startDate = ()['data']['userIndexes'][0]['all']['startDate'] print("startDate:{}".format(startDate)) endDate = ()['data']['userIndexes'][0]['all']['endDate'] print("endDate:{}".format(endDate)) source = (()['data']['userIndexes'][0]['all']['data']) #

原加密数据 print("原加密数据:{}".format(source)) key = ()['data'] #

密钥 print("密钥:{}".format(key)) # Python的强⼤之处就在于,拥有很强⼤的第三⽅库,可以直接执⾏js代码,即对解密算法不熟悉,⽆法转换为Python代码时,直接执⾏js代码即可 # js = e(''' # function decryption(t, e){ # for(var a=(""),i=(""),n={},s=[],o=0;o

调⽤此⽅式解密,需要打开上⾯的注解 res = decryption(key, source) # print(type(res)) resArr = (",") dateStart = me(startDate, '%Y-%m-%d') dateEnd = me(endDate, '%Y-%m-%d') dataLs = [] while dateStart <= dateEnd: (str(dateStart)) dateStart += lta(days=1) # print(me('%Y-%m-%d')) ls = [] for i in range(len(dataLs)): ([scenicName, dataLs[i], resArr[i]]) for i in range(len(ls)): print(ls[i])5.总结总的来说,本次爬⾍⼤体完成,在代码的编写之余,查阅了解密算法的Python实现,还查看了对⽇期的操作博客,所有的博客地址如下:/weixin_41074255/article/details/90579939/junli_chen/article/details/52944724/lilongsy/article/details/80242427/philip502/article/details/14004815/感谢各位⼤⽜的博客,因为有了你们我才能完成这篇博客,本⽂只为记录我在实际中遇到的问题和解决的⽅法,如有不⾜还请见谅,若有更好的解决⽅式,可以评论出来⼤家⼀起参考。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688892064a181707.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信