Python百度指數(shù)獲取腳本下載并保存
前言
有時(shí)候大家需要知道一個(gè)關(guān)鍵詞在互聯(lián)網(wǎng)上的熱度,想知道某個(gè)關(guān)鍵詞的熱度變化趨勢。大家可能就是使用百度指數(shù)、微信指數(shù)之類的。非常好用,但是就是不能把數(shù)據(jù)下載保存下來,不方便我們后面進(jìn)行操作。
我無意間看到別人提供的python腳本,可以對百度指數(shù)進(jìn)行爬蟲,于是我稍微修改了部分代碼,做了一個(gè)可以直接返回pd.DataFrame的數(shù)據(jù)框的類;然后后面又加了一個(gè)小的可視化代碼。這里和大家分享,只要使用這個(gè)腳本,就可以將百度指數(shù)數(shù)據(jù)下載下來,并且保存。
具體步驟
1. 獲得cookie值
百度指數(shù)是需要登陸,進(jìn)行用戶驗(yàn)證,因此,我們要登陸百度指數(shù),然后隨便搜索一個(gè)關(guān)鍵詞,比如python。然后在網(wǎng)頁空白地方,右鍵打開【檢查】,然后進(jìn)入【網(wǎng)絡(luò)】

這個(gè)時(shí)候會發(fā)現(xiàn)【網(wǎng)絡(luò)】里面都是空的,需要重新刷新網(wǎng)頁即可看到所有內(nèi)容。內(nèi)容太多了,注意選擇【Fetch/XHR】.

然后找到index?開頭的文件,查看他的【標(biāo)頭】、查看他的【Cookie】.將這個(gè)cookie的值復(fù)制

2. 使用我的代碼
基礎(chǔ)代碼,只要復(fù)制好就行:
import?requests
import?json
from?datetime?import?date,?timedelta
import?pandas?as?pd
class?DownloadBaiDuIndex(object):
????def?__init__(self,?cookie):
????????self.cookie?=?cookie
????????self.headers?=?{
????????????"Connection":?"keep-alive",
????????????"Accept":?"application/json,?text/plain,?*/*",
????????????"User-Agent":?"Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/86.0.4240.198?Safari/537.36",
????????????"Sec-Fetch-Site":?"same-origin",
????????????"Sec-Fetch-Mode":?"cors",
????????????"Sec-Fetch-Dest":?"empty",
????????????"Referer":?"https://index.baidu.com/v2/main/index.html",
????????????"Accept-Language":?"zh-CN,zh;q=0.9",
????????????'Cookie':?self.cookie,
????????}
????def?decrypt(self,?ptbk,?index_data):
????????n?=?len(ptbk)?//?2
????????a?=?dict(zip(ptbk[:n],?ptbk[n:]))
????????return?"".join([a[s]?for?s?in?index_data])
????def?get_index_data_json(self,?keys,?start=None,?end=None):
????????words?=?[[{"name":?key,?"wordType":?1}]?for?key?in?keys]
????????words?=?str(words).replace("?",?"").replace("'",?""")
????????url?=?f'http://index.baidu.com/api/SearchApi/index?area=0&word={words}&area=0&startDate={start}&endDate={end}'
????????print(words,?start,?end)
????????res?=?requests.get(url,?headers=self.headers)
????????data?=?res.json()['data']
????????uniqid?=?data['uniqid']
????????url?=?f'http://index.baidu.com/Interface/ptbk?uniqid={uniqid}'
????????res?=?requests.get(url,?headers=self.headers)
????????ptbk?=?res.json()['data']
????????result?=?{}
????????result["startDate"]?=?start
????????result["endDate"]?=?end
????????for?userIndexe?in?data['userIndexes']:
????????????name?=?userIndexe['word'][0]['name']
????????????tmp?=?{}
????????????index_all?=?userIndexe['all']['data']
????????????index_all_data?=?[int(e)?for?e?in?self.decrypt(ptbk,?index_all).split(",")]
????????????tmp["all"]?=?index_all_data
????????????index_pc?=?userIndexe['pc']['data']
????????????index_pc_data?=?[int(e)?for?e?in?self.decrypt(ptbk,?index_pc).split(",")]
????????????tmp["pc"]?=?index_pc_data
????????????index_wise?=?userIndexe['wise']['data']
????????????index_wise_data?=?[int(e)
???????????????????????????????for?e?in?self.decrypt(ptbk,?index_wise).split(",")]
????????????tmp["wise"]?=?index_wise_data
????????????result[name]?=?tmp
????????return?result
????def?GetIndex(self,?keys,?start=None,?end=None):
????????today?=?date.today()
????????if?start?is?None:
????????????start?=?str(today?-?timedelta(days=8))
????????if?end?is?None:
????????????end?=?str(today?-?timedelta(days=2))
????????try:
????????????raw_data?=?self.get_index_data_json(keys=keys,?start=start,?end=end)
????????????raw_data?=?pd.DataFrame(raw_data[keys[0]])
????????????raw_data.index?=?pd.date_range(start=start,?end=end)
????????except?Exception?as?e:
????????????print(e)
????????????raw_data?=?pd.DataFrame({'all':?[],?'pc':?[],?'wise':?[]})
????????finally:
????????????return?raw_data使用上面的類:
使用上面的類,然后使用下面的代碼。先初始化類,然后在使用這個(gè)對象的GetIndex函數(shù),里面的參數(shù)keys就是傳遞一個(gè)關(guān)鍵詞就行,要用列表形式傳遞。
說更加簡單一點(diǎn)的,只要把python替換成別的關(guān)鍵詞就行了,然后時(shí)間也都是文本形式,樣式就是'yyyy-mm-dd'形式就行。
cookie?=?'你的cookie值,注意使用英文單引號;就是直接復(fù)制就行了' #?初始化一個(gè)類 downloadbaiduindex?=?DownloadBaiDuIndex(cookie=cookie) data?=?downloadbaiduindex.GetIndex(keys=['python'],?start='2021-01-01',?end='2021-11-12') data
保存數(shù)據(jù)
如果想保存數(shù)據(jù),直接可以這么寫:
data.to_csv('data.csv')可視化
獲得數(shù)據(jù)已經(jīng)很簡單了,接下來可視化,就是非常簡單的事情了,你用別的語言處理數(shù)據(jù)也都可以了。我這里簡單的畫一個(gè)時(shí)間序列圖:
import?plotly.graph_objects?as?go
import?pandas?as?pd
df?=?data
fig?=?go.Figure([go.Scatter(x=df.index,?y=df['all'],?fill='tozeroy')])
fig.update_layout(template='plotly_white',?title='python?百度指數(shù)')
fig.show()
fig.write_html('python.html')結(jié)果如下:

總結(jié)
上面基本上沒有任何難點(diǎn)了,只要沒把cookie復(fù)制錯(cuò),只要沒有把上面的參數(shù)寫錯(cuò)就行。
到此這篇關(guān)于Python百度指數(shù)獲取腳本下載并保存的文章就介紹到這了,更多相關(guān)Python獲取腳本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python多進(jìn)程控制學(xué)習(xí)小結(jié)
這篇文章主要介紹了python多進(jìn)程控制學(xué)習(xí)小結(jié),想要充分利用多核CPU資源,Python中大部分情況下都需要使用多進(jìn)程,Python中提供了multiprocessing這個(gè)包實(shí)現(xiàn)多進(jìn)程。感興趣的小伙伴們可以參考一下2018-10-10
Pandas?Groupby之在Python中匯總、聚合和分組數(shù)據(jù)的示例詳解
GroupBy是一個(gè)非常簡單的概念,我們可以創(chuàng)建一個(gè)類別分組,并對這些類別應(yīng)用一個(gè)函數(shù),本文給大家介紹Pandas?Groupby之如何在Python中匯總、聚合和分組數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧2023-07-07
Python學(xué)習(xí)之函數(shù)的定義與使用詳解
函數(shù)是具有某種特定功能的代碼塊,可以重復(fù)使用(在前面數(shù)據(jù)類型相關(guān)章節(jié)。它使得我們的程序更加模塊化,不需要編寫大量重復(fù)的代碼。本文將詳細(xì)介紹Python中函數(shù)的定義與使用,感興趣的可以學(xué)習(xí)一下2022-03-03
Python 12306搶火車票腳本 Python京東搶手機(jī)腳本
這篇文章主要為大家詳細(xì)介紹了Python 12306搶火車票腳本和Python京東搶手機(jī)腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
Python OpenCV 圖像區(qū)域輪廓標(biāo)記(框選各種小紙條)
這篇文章主要介紹了Python OpenCV 圖像區(qū)域輪廓標(biāo)記(框選各種小紙條),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
PyTorch使用torch.nn.Module模塊自定義模型結(jié)構(gòu)方式
這篇文章主要介紹了PyTorch使用torch.nn.Module模塊自定義模型結(jié)構(gòu)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02

