日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python爬取知乎live_Python爬虫 - 简单抓取百度指数

發布時間:2023/12/10 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

轉載請注明出處

總結

以上是生活随笔為你收集整理的python爬取知乎live_Python爬虫 - 简单抓取百度指数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。