python爬取知乎live_Python爬蟲 - 簡單抓取百度指數

前言有點忙,沒空寫東西,這是之前寫的,加了些配圖而已

這次要爬的網站是百度指數

正文

一、分析

打開網站(百度指數),呈現出來是這樣的

如果搜索的話就需要登陸了,如果沒有什么特別頻繁的請求的話,直接登陸復制Cookie就完事了

這里以 酷安 為例搜索

這一欄是選擇時間范圍的,拖拽它能將范圍選擇更廣

我將其拖拽至2011,調試窗口可以看到請求,是個GET請求,參數有四個,除了 area 其他的都很好理解

切換到 Preview 預覽窗口,通過分析,個人認為比較可疑的幾個Key有這些:uniqid、all、pc、wise、data

其中data可以看到應該是加密了的,all是表示全部數據,pc是指pc端,wise是移動端,這些可以在js文件里找到;首先先搞清楚這個像加密了的data是怎么解密的;我們現在知道這個數據是json格式,那么它處理肯定要從中取出這些data,所以,重新刷新一下網頁,目的是為了讓所有js都能加載出來,然后利用搜索功能從中找。搜索過程就不上圖了,我是搜索 decrypt找到的;首先,我用decrypt找到了一個js文件,其中有一個名為decrypt的方法

這個js文件中有很多decrypt的搜索結果,在不知道多少行處找到了一個名為 fetchThrendIndexLive 的方法,這個方法名用我工地英語翻譯為 獲取趨勢指數

這里調用了名為decrypt的方法,是不是上面那個我不知道

這次我不打算用charles的替換js文件功能了,直接用瀏覽器的調試功能+console就行了

右鍵js的請求,Open in Sources panel

直接在這里下斷點,然后刷新頁面

在這停頓后可以看到兩個參數的內容

想要知道這兩個參數是什么很簡單,回到Network看請求里的json;其中e參數是data,t參數不太清楚是什么。for循環里第一步是先將t字符串按單個字符分割,返回的列表保存在n變量里;

然后將e也按單字符分割,保存到i變量里

a是一個字典,r是一個列表

從右邊的 Scope 中可以看到

以t的字符長度遍歷,a中key為t遍歷的字符,a中value為:從t中按索引取的值,其中索引為:t的字符長度除2后加上當前遍歷的索引(a[n[o] = n[n.length/2 + o])

這里始終沒有用到i,也就是我們能獲取到的data,這個i在第二個循環中才被用到;

第二個循環是遍歷e,結果保存在r列表里,這里的遍歷很容易就看得懂。。我就不分析了,自己都頭暈,直接用python抄一遍就行了;

最后是將r列表里的內容合并為一個字符串然后返回;

二、整理思路

解密

方法對應python代碼為:

def decrypt(t,e):

n = list(t)

i = list(e)

a = {}

result = []

ln = int(len(n)/2)

start = n[ln:]

end = n[:ln]

for j,k in zip(start, end):

a.update({k: j})

for j in e:

result.append(a.get(j))

return ''.join(result)

完全照搬。。可能有寫地方可以簡化,但我懶得去處理了,最后返回的是這個玩意兒

python運行結果

到這可能都覺得已經解決了,可你不知道t這個參數是什么,怎么來的,這里我就不帶各位分析了,你么可以自己嘗試分析分析,我直接說結果,之前我就指出了幾個可疑的東西,其中uniqid在獲取t參數需要用到,這個t其實是叫ptbk,獲取這個ptbk的url:http://index.baidu.com/Interface/ptbk?uniqid= 有一個參數uniqid,GET請求,返回json內容

獲取uniqid和data的url:http://index.baidu.com/api/SearchApi/thumbnail?area=0&word= (如果要指定日期只需要在word后面追加&startDate=、&endDate=就行)

所以可以明確一下思路:1、通過url獲取uniqid和data

2、通過uniqid獲取ptbk

3、通過ptbk和data解密

解密后的東西就是我們要的數據

三、代碼部分

完整代碼:

import requests

import sys

import time

word_url = 'http://index.baidu.com/api/SearchApi/thumbnail?area=0&word={}'

COOKIES = ''

def decrypt(t,e):

n = list(t)

i = list(e)

a = {}

result = []

ln = int(len(n)/2)

start = n[ln:]

end = n[:ln]

for j,k in zip(start, end):

a.update({k: j})

for j in e:

result.append(a.get(j))

return ''.join(result)

def get_index_home(keyword):

headers = {

'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36',

'Cookie': COOKIES

}

resp = requests.get(word_url.format(keyword), headers=headers)

j = resp.json()

uniqid = j.get('data').get('uniqid')

return get_ptbk(uniqid)

def get_ptbk(uniqid):

url = 'http://index.baidu.com/Interface/ptbk?uniqid={}'

ptbk_headers = {

'Accept': 'application/json, text/plain, */*',

'Accept-Encoding': 'gzip, deflate',

'Accept-Language': 'zh-CN,zh;q=0.9',

'Cache-Control': 'no-cache',

'Cookie': COOKIES,

'DNT': '1',

'Host': '百度指數',

'Pragma': 'no-cache',

'Proxy-Connection': 'keep-alive',

'Referer': '百度指數',

'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36',

'X-Requested-With': 'XMLHttpRequest',

}

resp = requests.get(url.format(uniqid), headers=ptbk_headers)

if resp.status_code != 200:

print('獲取uniqid失敗')

sys.exit(1)

return resp.json().get('data')

def get_index_data(keyword, start='2011-01-03', end='2019-08-05'):

url = f'http://index.baidu.com/api/SearchApi/index?word={keyword}&area=0&startDate={start}&endDate={end}'

headers = {

'Accept': 'application/json, text/plain, */*',

'Accept-Encoding': 'gzip, deflate',

'Accept-Language': 'zh-CN,zh;q=0.9',

'Cache-Control': 'no-cache',

'Cookie': COOKIES,

'DNT': '1',

'Host': '百度指數',

'Pragma': 'no-cache',

'Proxy-Connection': 'keep-alive',

'Referer': '百度指數',

'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36',

'X-Requested-With': 'XMLHttpRequest',

}

resp = requests.get(url, headers=headers)

if resp.status_code != 200:

print('獲取指數失敗')

sys.exit(1)

data = resp.json().get('data').get('userIndexes')[0]

uniqid = data.get('uniqid')

ptbk = get_index_home(uniqid)

while ptbk is None or ptbk == '':

ptbk = get_index_home(uniqid)

all_data = data.get('all').get('data')

result = decrypt(ptbk, all_data)

result = result.split(',')

print(result)

if __name__ == '__main__':

get_index_data('酷安')

輸出:

END

轉載請注明出處

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258936.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258936.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258936.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在Visual Studio上開發Node.js程序

在Visual Studio上開發Node.js程序 原文:在Visual Studio上開發Node.js程序【題外話】 最近準備用Node.js做些東西,于是找找看能否有Visual Studio上的插件以方便開發。結果還真找到了一個,來自微軟的Node.js Tools for Visual Studio(NTVS&a…

Oracle ASM 翻譯系列第十一彈:高級知識 Offline or drop?

Offline or drop? 當一個ASM磁盤不可用時,ASM會把它從磁盤組里移除,對嗎?要看情況,通常取決于ASM版本和磁盤組的冗余級別。因為一個external冗余的磁盤組會直接被dismount,所以主要關注normal和high冗余磁盤組的情況。…

net與樹莓派的情緣-安裝與卸載MySql(五)

安裝MySql sudo apt-get install mysql-server 刪除 mysql sudo apt-get autoremove --purge mysql-server-5.0sudo apt-get remove mysql-serversudo apt-get autoremove mysql-serversudo apt-get remove mysql-common //這個很重要上面的其實有一些是多余的。 清理殘留數據 …

mpls工作原理通俗解釋_用這兩種方法向最終用戶解釋NLP模型的工作原理還是不錯的...

點擊上方關注,All in AI中國上周,我看了一個關于“NLP的實踐特性工程”的演講。主要是關于LIME和SHAP在文本分類可解釋性方面是如何工作的。我決定寫一篇關于它們的文章,因為它們很有趣、易于使用,而且視覺上很吸引人。所有的機器…

向往2的年代

1. JDBC 對插入大量數據如何處理? 2. JAVA反射的使用,如何獲取一個java類的某個方法? 3. 數據庫連接池(優化) 4. 分布式事務管理轉載于:https://www.cnblogs.com/dragonflyyi/p/3564843.html

C++ limits頭文件的用法(numeric_limits)

初學C的時候,對這個模板很陌生,不知道它到底是做什么用的,今天拿起《C標準程序庫》,出現了它的討論,所以決定好好研究一番。 1. numeric_limits是什么? (A)《C標準程序庫》&#xff…

三層架構——配置文件

1、配置文件是什么? 配置文件是隨安裝程序一起被安裝到計算機上的文件,里面存放著安裝好的應用程序執行時所須要的參數。 應用程序配置文件是標準的XML文件,XML標記和屬性是區分大寫和小寫的。它能夠按須要更改,開發者可使用配置文…

《嵌入式系統開發之道——菜鳥成長日志與項目經理的私房菜》——02-04項目范圍(Scope)管理...

本節書摘來異步社區《嵌入式系統開發之道——菜鳥成長日志與項目經理的私房菜》一書中的第2章,第2.4節,作者:邱毅凌,更多章節內容可以訪問云棲社區“異步社區”公眾號查看 02-04項目范圍(Scope)管理 嵌入式…

flex(入門)之timer的使用,鍵盤,鼠標的監聽

package {import flash.display.Shape;import flash.display.Sprite;import flash.events.Event;import flash.events.KeyboardEvent;import flash.events.MouseEvent;import flash.events.TimerEvent;import flash.utils.Timer;import mx.controls.Label;//窗體大小&#xff0…

python 線程超時設置_python 條件變量Condition(36)

文章首發微信公眾號,微信搜索:猿說python對于線程與線程之間的交互我們在前面的文章已經介紹了 python 互斥鎖Lock / python事件Event , 今天繼續介紹一種線程交互方式 – 線程條件變量Condition.一.線程條件變量Condition相關函數介紹acquire() — 線程…

MsWord 操作總結

轉自(http://www.cnblogs.com/eye-like/p/4121219.html) Msdn上的word操作api(不過只有英文版,英文差的先閃過) Word2007的API:http://msdn.microsoft.com/en-us/library/bb257531(voffice.12).aspxWord201…

fwrite,fread and fprintf,fscanf的一些使用體會

這周一直在完成一個任務,就是將訓練出的多個model寫成一個model。其中我們使用了c語言的讀寫方法,搞了一星期, 挖了很多坑,最終都鏟平了。下面列舉出若干有用的知識。 1.fwrite,fread VS fprintf,fscanf的區別 fwrite,fread 讀寫…

《第一桶金怎么賺——淘寶開店創業致富一冊通》一一1.4 淘寶開店創業的流程...

本節書摘來自異步社區出版社《第一桶金怎么賺——淘寶開店創業致富一冊通》一書中的第1章,第1.4節,作者:葛存山,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 1.4 淘寶開店創業的流程 第一桶金怎么賺——淘寶開店創業致…

檢測虛擬機代碼總匯(更新中)

檢測虛擬機代碼 1 004092D0 /. 55 push ebp2 004092D1 |. 8BEC mov ebp,esp3 004092D3 |. 51 push ecx4 004092D4 |. 53 push ebx5 004092D5 |. 68 1D934000 push 0040931D 6 004092DA |. 64:FF35…

兩數之和 python_同一屏幕播放兩個視頻 視頻左右兩個畫面或視頻上下兩個畫面如何制作...

咱們在網上經常可以看到一些視頻畫面是可以在同一屏幕播放兩個視頻,有的是視頻左右兩個畫面或視頻上下兩個畫面這些是如何制作的呢,其實熟悉視頻編輯軟件的網友應該會比較了解這些操作,好嘞,來,現在就讓小編來演示一下…

dlib人臉特征點對齊

前面我們介紹了使用dlib進行人臉檢測&#xff0c;下面我們給出如何使用dlib進行人臉特征點檢測。我們直接貼出代碼。我們的代碼包括如下幾部分功能&#xff1a; 檢測單張圖片檢測一個視頻檢測一個camera 先給出代碼&#xff1a; #include <dlib/image_processing/frontal_…

IOS開發基礎知識--碎片13

1:運行程序報the file couldnt be opened because you dont have permission to view it 解決辦法&#xff1a;項目—>targets->build settings->build options->changed the value of the "Compiler for C/C/Objective-C" to Default Compiler. 2:百度…

《LoadRunner 12七天速成寶典》—第2章2.6節第二個性能測試案例

本節書摘來自異步社區《LoadRunner 12七天速成寶典》一書中的第2章&#xff0c;第2.6節第二個性能測試案例&#xff0c;作者陳霽&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.6 第二個性能測試案例云云&#xff1a;烤魚吃得很爽。 戀戀&#xff1a;就…

MongoDB_1

突然想去看下MongoDB的東西&#xff0c;于是有了這篇文章。其實很早以前就看過一些關于NoSql的文章&#xff0c;還記得當時里面有介紹MongoDB的&#xff0c;多瞅了2眼&#xff0c;并且在Window下安裝了MongoDB的驅動&#xff0c;小玩了會。今天重新翻出來&#xff0c;沒成想在命…

牛頓法與擬牛頓法,SDM方法的一些注記

SDM方法 考慮一般額NLS問題&#xff1a; f(x)minx||h(x)?y||2這里x為優化參數&#xff0c;h為非線性函數&#xff0c;y是已知變量&#xff0c;如下是基于梯度的迭代公式&#xff1a; ΔxαAJTh(h(x)?y)這里α是步長&#xff0c;A是縮放因子&#xff0c;Jh是h在當前參數x下的…