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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python爬关键词百度指数_Python爬虫爬取百度指数的关键词搜索指数教程

發(fā)布時(shí)間:2023/12/20 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python爬关键词百度指数_Python爬虫爬取百度指数的关键词搜索指数教程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近有很多朋友跟我說,“爬蟲這東西很簡單啊,好像還沒學(xué)就已經(jīng)會(huì)了,沒啥深?yuàn)W的東西哦??戳四阒暗慕坛?#xff0c;不就是一個(gè)隊(duì)列加一些Http請(qǐng)求嗎,不就是寫寫XPath和正則嗎,你們還做個(gè)神箭手云爬蟲出來?我自己上個(gè)廁所就寫完了啊?!?/p>

看來是時(shí)候拿出我們壓箱底多年的老干媽了,哦不,老干貨了。不嚇屎你們這群小學(xué)生我就不在6年級(jí)混了。

廢話不多說,所謂爬蟲天坑,敢對(duì)得起這個(gè)名字的一定不能是等閑之輩。起碼得是過完年老板給你扔這個(gè)任務(wù),你兒童節(jié)還在頭大的級(jí)別。今天第一課,咱們就先找個(gè)最難的熱熱身吧:爬取百度指數(shù)的關(guān)鍵詞搜索指數(shù)。

先貼一個(gè)logo讓大家跪拜一下

好了,大家平身吧,咱們馬上就正式開始了,想上廁所的趕緊去,不然看完這篇文章估計(jì)你就忘了怎么上廁所了。

正式開始之前,先插個(gè)廣告:如果土豪朋友不想寫代碼或者中途看不下去的,我們將以下代碼已經(jīng)打包成一個(gè)完整的應(yīng)用,大家進(jìn)入神箭手的云市場(chǎng)搜索百度指數(shù)(http://www.shenjianshou.cn/index.php?r=market/product&product_id=500036)就可以看到應(yīng)用,直接調(diào)用既可。

——前方高能預(yù)警看也看不完上廁所趕緊去分割線-----

咱們正式開始:所謂知己知彼百戰(zhàn)不殆,我們要先了解一下我們的對(duì)手。咱們打開百度指數(shù)

http://index.baidu.com

,映入眼簾的是一個(gè)簡單的輸入框。好開心啊,好像不用登錄啊,輸入一個(gè)關(guān)鍵字試一下吧,輸入神箭手,回車:

果然百度老司機(jī)不會(huì)讓我們那么開心的。沒事沒事,不就是登錄嗎,也不是沒做過登錄,抓包研究下請(qǐng)求應(yīng)該不難。我們先找一個(gè)賬號(hào)登錄看下。登錄之后繼續(xù)輸入神箭手:

出來了。哈哈,不難嘛,這不就直接顯示了。然后就按照以前的爬蟲的教程,用XPATH獲取一下數(shù)字就可以了,哈哈哈…哈哈..哈……..

慢著,怎么感覺這個(gè)數(shù)字看著怪怪。嚇得我趕緊掀開被子看看這貨到底是啥:

什么?這是圖!!!!什么?這還是拼圖!!!!什么?這貨居然是異步的拼圖!!!!

怎么樣,感受到天坑的深度沒有?

那咱們就一起來看看怎么見招拆招,用神箭手把百度指數(shù)搞定的吧。

開始具體的代碼之前,我們先在神箭手后臺(tái)新建三個(gè)應(yīng)用,分別是百度指數(shù)API,百度登錄爬蟲,百度指數(shù)圖片識(shí)別AI。

第一章登錄應(yīng)用

第一節(jié):咱先搞定登錄

模擬登錄一直是爬蟲的一個(gè)老大難問題,雖然我們神箭手提供了智能登錄接口login函數(shù),但是遇上復(fù)雜一些的登錄依然無能為力。當(dāng)然你可以登錄后復(fù)制本機(jī)Cookie直接用,但這種雕蟲小技百度想封你真得比捏死一只螞蟻還簡單。咱們要有不怕苦,迎難而上的精神,死磕登錄!算了~還是先去搜一下有沒有別人寫過。不搜不知道,一搜嚇一跳啊。咱就隨便找個(gè)源碼借鑒借鑒。喬布斯老人家說過嘛,greateartist steal。

https://github.com/qiyeboy/baidulogin/blob/master/baidulogin.py

這個(gè)不錯(cuò),邏輯清晰,代碼干凈,萬能的github果然不辜負(fù)我的重望。我們steal到神箭手平臺(tái)上來。

首先我們理清這個(gè)流程,根據(jù)這個(gè)代碼我們知道百度的登錄流程是這樣的:

1.通過請(qǐng)求百度首頁或者任意一個(gè)百度url獲得百度的基礎(chǔ)cookie。

2.請(qǐng)求

https://passport.baidu.com/v2/api/?getapi

獲得token

3.通過

https://passport.baidu.com/v2/getpublickey

獲得密碼加密的key

4.通過

https://passport.baidu.com/v2/api/?login

將之前獲得到的token,生成的gid,生成的時(shí)間戳,用key加密密碼,來提交登錄。

5.如果返回有驗(yàn)證碼,獲取codestring并請(qǐng)求

https://passport.baidu.com/cgi-bin/genimage

獲得驗(yàn)證碼圖片并識(shí)別。

6.通過

https://passport.baidu.com/v2/?checkvcode

來驗(yàn)證是否識(shí)別成功

7.如果不成功通過

https://passport.baidu.com/v2/?reggetcodestr

來切換驗(yàn)證碼,在重復(fù)前兩步。

8.再次提交

https://passport.baidu.com/v2/api/?login

看是否登錄成功。

好了,這中間很麻煩的兩個(gè)地方是

1.驗(yàn)證碼識(shí)別 這個(gè)神箭手提供了驗(yàn)證碼識(shí)別的函數(shù),調(diào)用方式如下:

varcodeUrl = "

https://passport.baidu.com/cgi-bin/genimage?"

; + codeString;

varcodeReg = getCaptcha(71, codeUrl);

varimgCaptchaData = JSON.parse(codeReg);

if(imgCaptchaData && imgCaptchaData.ret > 0) {

varresult = imgCaptchaData.result;

verifycode= encodeURI(result,"UTF-8");

tt= (new Date()).getTime();

varcodeCheck = site.requestUrl("

https://passport.baidu.com/v2/?checkvcode&token="

;+ token + "&tpl=mn&apiver=v3&tt=" + tt + "&verifycode="+ verifycode + "&codestring=" + codeString + "&callback=");

varcheckInfo = JSON.parse(codeCheck);

if(checkInfo.errInfo.no != "0") {

console.log("驗(yàn)證碼識(shí)別錯(cuò)誤");

}

continue;

}else {

console.log("驗(yàn)證碼識(shí)別失敗");

continue;

}

2.RSA加密

當(dāng)我們獲取到key之后需要對(duì)密碼進(jìn)行RSA加密,百度是采用的JS的開源RSA加密庫,神箭手也提供了RSAEncode的方法,具體代碼如下:

varpubkeyJson = site.requestUrl("

https://passport.baidu.com/v2/getpublickey?token="

;+ token + "&tpl=mn&apiver=v3&tt=" + tt + "&gid="+ gid + "&callback=");

varpubkeyInfo = JSON.parse(pubkeyJson.replace(/'/g, "\""));

varpubkey = pubkeyInfo.pubkey;

varrsakey = pubkeyInfo.key;

varcrypttype = "";

varrsaPassword="";

if(rsakey != "") {

crypttype= "12";

//加密密碼

pubkey= pubkey.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----ENDPUBLIC KEY-----", "").trim();

rsaPassword= (RSAEncode(password, pubkey));

}

其他的都是一些基礎(chǔ)的請(qǐng)求,大家可以參考github中的代碼進(jìn)行編寫。

第二節(jié):瘋狂登錄

完成了第一節(jié)的工作之后,你以為登錄就沒問題了嗎?你以為你可以用一個(gè)帳號(hào)爬到天荒地老嗎?有人說限制爬取頻率,這當(dāng)然是一個(gè)方法,但卻不是最好的解決方案。畢竟縮手縮腳,感覺很受限。最好的方案當(dāng)然是登錄一堆帳號(hào),獲取一堆的Cookie,然后從這堆Cookie中每次隨機(jī)取一個(gè)Cookie,再通過這個(gè)Cookie去訪問。那我們就需要一個(gè)新的東西:Cookie池。

我們看下神箭手如何調(diào)用Cookie池,首先我們需要新建一個(gè)爬蟲應(yīng)用專門用于登錄:

varconfigs = {

shareUserWithKey:"__bindex__",

};

configs.onUserAdded= function (use, psw, site) {

varloginResult = login(use, psw, site);

if(loginResult !="success") {

returnfalse;

}

returntrue;

}

這里的login方法就是剛剛我們寫的百度登錄,然后我們?cè)僭赽eforeCrawl的回調(diào)函數(shù)中反復(fù)調(diào)用以下方法:

site.addUser(user,password);

當(dāng)然這里還有一個(gè)問題,如果我們一直使用一個(gè)IP來登錄,也很容易被百度封掉,所以我們最好打開企業(yè)代理IP接入。

通過這種形式我們就可以建立一個(gè)可共享的Cookie池。然后我們?cè)诎俣戎笖?shù)API應(yīng)用(下一章會(huì)詳細(xì)介紹)里通過設(shè)置以下代碼來共享這個(gè)Cookie池:

varconfigs = {

shareUserWithKey:"__bindex__",

multiUser:true

}

這樣在這個(gè)應(yīng)用中會(huì)在每次訪問一個(gè)Url的周期中隨機(jī)從Cookie池取一個(gè)Cookie并請(qǐng)求Url。通過這種形式我們還可以把登錄和請(qǐng)求代碼解耦合。將來還可以復(fù)用登錄代碼。

第三節(jié):問題來了,帳號(hào)從哪來呢?

除了把七大姑八大姨的手機(jī)都來注冊(cè)一遍以外,沒什么好辦法,除非…(此處省略1000個(gè)字)。

第二章:獲取指數(shù)圖片API

第一節(jié):異步請(qǐng)求數(shù)據(jù)

終于完成了登錄,感覺怎么樣,是不是有點(diǎn)天坑的意思?哈哈,萬里長征咱才走了第一步。下面我們才真正來揭開天坑的核心:數(shù)字圖片。

然后我們繼續(xù)掀被子看看這個(gè)標(biāo)簽是怎么來的:

貌似不難找,不過看這個(gè)URL看著就頭大,感覺已經(jīng)被百度登錄傷害過一次之后真的無力再一個(gè)一個(gè)參數(shù)分析,我們直接使用神箭手提供的js渲染頁面的接口,直接把頁面渲染出來把:

varconfigs = {

domains:["index.baidu.com"],

scanUrls:["

http://index.baidu.com/?tpl=trend&word="

; + encodeURI(keyword, "GBK")],

enableJS:true

}

這樣我們?cè)赼fterDownloadPage中拿到的就直接是渲染好的頁面了,我們?cè)偻ㄟ^正則和XPath取出數(shù)字圖片的容器標(biāo)簽代碼和Css代碼(Css代碼就是把圖片設(shè)置成背景的style標(biāo)簽),之所以要拿Style標(biāo)簽是因?yàn)閮蓚€(gè)數(shù)字圖片共享了一個(gè)Style,而這個(gè)Style在第一個(gè)數(shù)字圖片的標(biāo)簽中,所以我們必須抽取出這個(gè)Style標(biāo)簽,在分別設(shè)置給兩個(gè)不同的數(shù)字的容器標(biāo)簽代碼。這段代碼咱們?cè)傧乱还?jié)中給出。

第二節(jié):渲染數(shù)據(jù)成圖片

我們拿到了數(shù)字圖片的容器標(biāo)簽代碼有什么用呢,當(dāng)然是要渲染出對(duì)應(yīng)的圖片了。那為什么我們要這么大的彎去得到這張圖呢。這一點(diǎn)正是百度指數(shù)能當(dāng)選天坑的原因了,我們看一下這個(gè)圖片是如何拼出來的,我們看下這段HTML代碼。

總結(jié)

以上是生活随笔為你收集整理的python爬关键词百度指数_Python爬虫爬取百度指数的关键词搜索指数教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。