摘要:前言項(xiàng)目地址該程序正常運(yùn)行所需要的插件為,建議下載版本,然后將下載的整個(gè)文件夾放在和文件同一級(jí)的目錄下,若是系統(tǒng)的話則修改程序中的指向的插件目錄名稱實(shí)現(xiàn)原理百度的搜索排名它選錄的都是你所檢索的關(guān)鍵詞以及目標(biāo)網(wǎng)址在第幾個(gè)結(jié)果列表當(dāng)中,但其中并
前言
項(xiàng)目地址 https://github.com/Ricbet/ran...
該程序正常運(yùn)行所需要的插件為phantomjs,建議下載mac版本,然后將下載的整個(gè)文件夾放在和.py文件同一級(jí)的目錄下,若是window系統(tǒng)的話則修改程序中的
driver指向的插件目錄名稱
百度的搜索排名它選錄的都是你所檢索的關(guān)鍵詞以及目標(biāo)網(wǎng)址在第幾個(gè)結(jié)果列表當(dāng)中,但其中并不包括帶“廣告”標(biāo)示的結(jié)果,例如
我搜素switch的時(shí)候我想知道Nintendo的官網(wǎng)在百度排名中屬于第幾名,圖所示的例子中我在第二頁(yè)里找到了任天堂的官網(wǎng)nintendo.com,所以switch這個(gè)關(guān)鍵詞對(duì)于任天堂來(lái)說(shuō)在百度的搜索排名是第十二名
我要做的就是根據(jù)關(guān)鍵詞搜索模擬一次搜索,然后在搜索的結(jié)果集當(dāng)中找到目標(biāo)網(wǎng)址,匹配之后我再利用phantomjs截取屏幕并在關(guān)鍵的地方給予紅框標(biāo)注,然后再將該截圖保存到本地目錄當(dāng)中
首先我們還是得先了解下百度搜索的一些常用參數(shù)
pn: 表示從第pn條結(jié)果開始顯示
rn: 表示每一頁(yè)要顯示多少條結(jié)果,默認(rèn)10條
wd: 表示要搜索的詞
其實(shí)我們只需要這三個(gè)參數(shù)就足夠了
首先先記錄要請(qǐng)求的url,使用quote處理帶中文的url
r_url = "http://www.baidu.com/s?rn=%s" % rn + "&pn=%s"%((pn_baidu-1)*rn) + "&wd=%s" % wd r_url = quote(r_url, safe=string.printable)
然后我們用BeautifulSoup提取網(wǎng)頁(yè)的文本內(nèi)容
with requests.get("http://www.baidu.com/s", params={"wd": wd, "pn": (pn_baidu-1)*rn, "rn": rn}, timeout=7) as r: soup = BeautifulSoup(r.text, "html.parser")
我們觀察百度的搜索結(jié)果列表頁(yè)的html結(jié)構(gòu)
發(fā)現(xiàn)這些結(jié)果集都被包含在了content_left這個(gè)id里面,然后只有result這個(gè)類的標(biāo)簽才是真正搜索出來(lái)的結(jié)果,其他的result-op這個(gè)類的標(biāo)簽并不算在排名中,因?yàn)檫@是那些最新相關(guān)信息呀、貼吧等
p = re.compile(r"^result") contentItem = soup.find(id="content_left").find_all("div", p)
contentItem就是我們列出的所有算在排名內(nèi)的結(jié)果集列表
然后我們通過(guò)for循環(huán)遍歷正則匹配我們輸入的網(wǎng)址,看看在哪個(gè)下標(biāo)的結(jié)果里面,就是當(dāng)前的排名
for index, list in enumerate(contentItem): _list = "".join(re.split(r"s+", list.get_text())) # 如果匹配成功 if str.search(_list): # xxxxx
如果找到匹配的結(jié)果集了,此時(shí)就是PhantomJS派上用場(chǎng)的時(shí)候了
保存為截圖并標(biāo)注python的PhantomJS用法可以在谷某或者某度里面查得到,這里就不一一闡述了
我們通過(guò)觀察到每一個(gè)result類的標(biāo)簽都有一個(gè)數(shù)字id,然后我們只要用js的方法獲取這個(gè)id然后給它設(shè)置紅框的樣式就可以了
driver.execute_script(""" (function(){ var result = document.getElementById(%s) result.setAttribute("style","border:5px solid red;padding:10px;margin-left:-15px") })() """ %((index + 1)+((pn_baidu-1)*rn)))
同時(shí)根據(jù)時(shí)間戳來(lái)命名圖片名稱
out_img_name = "baidu_" + time_now_rub + ".jpeg" driver.save_screenshot(out_img_name)
同時(shí)為了減少圖片的資源大小,我們用PIL進(jìn)一步處理圖片,并保存為jpeg的格式
# 打開圖片 im = Image.open(out_img_name) # 獲取生成的圖片寬度和高度 w, h = im.size # 等比例壓縮圖片 im.thumbnail((int(w / 1.5), int(h / 1.5)), Image.ANTIALIAS) # 保存 im.convert("RGB").save(out_img_name, "JPEG", quality=80)
最后一步我們就是把生成的圖片放在一個(gè)目錄里面了
def findDirectory( img_name ): # 查詢目錄,如果沒(méi)有就創(chuàng)建目錄 src_item = ["public","uploads",time_year,time_month,time_day,""] join_src_item = "/".join(src_item[0:-1])+"/" # 判斷當(dāng)前目錄文件是否有uploads if( os.path.exists(join_src_item) == False ): os.makedirs(join_src_item) shutil.move(img_name, join_src_item) else: shutil.move(img_name, join_src_item)測(cè)試
截圖
目錄結(jié)構(gòu)
大致思路就是這樣子
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41335.html
摘要:學(xué)習(xí)爬蟲的背景了解。但是搜索引擎蜘蛛的爬行是被輸入了一定的規(guī)則的,它需要遵從一些命令或文件的內(nèi)容,如標(biāo)注為的鏈接,或者是協(xié)議。不同領(lǐng)域不同背景的用戶往往具有不同的檢索目的和需求,搜索引擎無(wú)法提供針對(duì)具體某個(gè)用戶的搜索結(jié)果。 學(xué)習(xí)python爬蟲的背景了解。 大數(shù)據(jù)時(shí)代數(shù)據(jù)獲取方式 如今,人類社會(huì)已經(jīng)進(jìn)入了大數(shù)據(jù)時(shí)代,數(shù)據(jù)已經(jīng)成為必不可少的部分,可見數(shù)據(jù)的獲取非常重要,而數(shù)據(jù)的獲取的方式...
摘要:百度快照丟失前言百度為了更好的用戶體驗(yàn),推出了異地排名功能,讓搜索結(jié)果更有個(gè)性化。但是今天這個(gè)怪象,不是百度的問(wèn)題。數(shù)據(jù)截圖說(shuō)明幾個(gè)地區(qū)的網(wǎng)絡(luò)運(yùn)營(yíng)商居然丟失了百度的快照。百度快照丟失前言:百度為了更好的用戶體驗(yàn),推出了異地排名功能,讓搜索結(jié)果更有個(gè)性化。但是今天這個(gè)怪象,不是百度的問(wèn)題。今天一個(gè)做SEO的朋友咨詢我,說(shuō)我博客的快照沒(méi)了,我打開電腦一看還在,還能給大家分享一些知識(shí),然后朋友給我...
閱讀 2433·2023-04-26 02:54
閱讀 2348·2021-10-14 09:43
閱讀 3417·2021-09-22 15:19
閱讀 2866·2019-08-30 15:44
閱讀 2729·2019-08-30 12:54
閱讀 1010·2019-08-29 18:43
閱讀 1960·2019-08-29 17:12
閱讀 1353·2019-08-29 16:40