溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python如何實(shí)現(xiàn)簡(jiǎn)易Web爬蟲

發(fā)布時(shí)間:2022-03-05 09:34:02 來源:億速云 閱讀:185 作者:小新 欄目:web開發(fā)

這篇文章給大家分享的是有關(guān)Python如何實(shí)現(xiàn)簡(jiǎn)易Web爬蟲的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

  簡(jiǎn)介:

  網(wǎng)絡(luò)爬蟲(又被稱為網(wǎng)頁蜘蛛),網(wǎng)絡(luò)機(jī)器人,是一種按照一定的規(guī)則,自動(dòng)地抓信息的程序或者腳本。假設(shè)互聯(lián)網(wǎng)是一張很大的蜘蛛網(wǎng),每個(gè)頁面之間都通過超鏈接這根線相互連接,那么我們的爬蟲小程序就能夠通過這些線不斷的搜尋到新的網(wǎng)頁。

  Python作為一種代表簡(jiǎn)單主義思想的解釋型、面向?qū)ο?、功能?qiáng)大的高級(jí)編程語言。它語法簡(jiǎn)潔并且具有動(dòng)態(tài)數(shù)據(jù)類型和高層次的抽象數(shù)據(jù)結(jié)構(gòu),這使得它具有良好的跨平臺(tái)特性,特別適用于爬蟲等程序的實(shí)現(xiàn),此外Python還提供了例如Spyder這樣的爬蟲框架,BeautifulSoup這樣的解析框架,能夠輕松的開發(fā)出各種復(fù)雜的爬蟲程序。

  在這篇文章中,使用Python自帶的urllib和BeautifulSoup庫實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的web爬蟲,用來爬取每個(gè)URL地址及其對(duì)應(yīng)的標(biāo)題內(nèi)容。

  流程:

  爬蟲算法從輸入中讀取的一個(gè)URL作為初始地址,向該地址發(fā)出一個(gè)Request請(qǐng)求。

  請(qǐng)求的地址返回一個(gè)包含所有內(nèi)容的,將其存入一個(gè)String變量,使用該變量實(shí)例化一個(gè)BeautifulSoup對(duì)象,該對(duì)象能夠?qū)?nèi)容并且將其解析為一個(gè)DOM樹。

  根據(jù)自己的需要建立正則表達(dá)式,最后借助HTML標(biāo)簽從中解析出需要的內(nèi)容和新的URL,將新的放入隊(duì)列中。

  對(duì)于目前所處的URL地址與爬去的內(nèi)容,在進(jìn)行一定的過濾、整理后會(huì)建立索引,這是一個(gè)單詞-頁面的存儲(chǔ)結(jié)構(gòu)。當(dāng)用戶輸入搜索語句后,相應(yīng)的分詞函數(shù)會(huì)對(duì)語句進(jìn)行分解獲得關(guān)鍵詞,然后再根據(jù)每個(gè)關(guān)鍵詞查找到相應(yīng)的URL。通過這種結(jié)構(gòu),可以快速的獲取這個(gè)單詞所對(duì)應(yīng)的地址列表。在這里使用樹形結(jié)構(gòu)的存儲(chǔ)方式,Python的字典和列表類型能夠較好的構(gòu)建出單詞詞典樹。

  從隊(duì)列中彈出目前的URL地址,在爬取隊(duì)列不為空的條件下,算法不斷從隊(duì)列中獲取到新的網(wǎng)頁地址,并重復(fù)上述過程。

  實(shí)現(xiàn):

  環(huán)境:

  Python3.5orAnaconda3

  BeautifulSoup4

  可以使用下面的指令安裝BeautifulSoup4,如果你是Ubuntu用戶,記得在命令前面加上sudo:

  程序分別實(shí)現(xiàn)了幾個(gè)類,分別用于URL地址管理,Html內(nèi)容請(qǐng)求、Html內(nèi)容解析、索引建立以及爬蟲主進(jìn)程。我將整個(gè)程序按照每個(gè)Class分開解釋,最后只要將他們放在一起就可以執(zhí)行代碼了。

  UrlManager類

  這個(gè)類用來管理URL地址,new_urls用來保存還未爬取的URL地址,old_urls保存了已經(jīng)爬取過的地址,兩個(gè)變量都使用set類型保證其中內(nèi)容的唯一性。每次循環(huán)時(shí),add_new_urls()向外提供了向new_urls變量中添加新urls的方法;add_new_url()方法,對(duì)每個(gè)url地址進(jìn)行重復(fù)性檢查,符合條件的才進(jìn)行添加操作;get_urls()向外提供了獲取新的url地址的方法;has_new_url()方法用來檢查爬取隊(duì)列是否為空。

  HtmlDownloader類

  這個(gè)類實(shí)現(xiàn)了向url地址發(fā)送Request請(qǐng)求,并獲取其回應(yīng)的方法,調(diào)用類內(nèi)的download()方法就可實(shí)現(xiàn)。這里要注意的是頁面的編碼問題,這里我使用的是UTF-8來進(jìn)行decode解碼,有的網(wǎng)頁可能使用的是GBK編碼,要根據(jù)實(shí)際情況進(jìn)行修改。

  HtmlParser類

  這個(gè)類通過實(shí)例化一個(gè)BeautifulSoup對(duì)象來進(jìn)行頁面的解析。它是一個(gè)使用Python編寫的HTML/XML文檔解析器。它通過將文檔解析為DOM樹的方式為用戶提供需要抓取的數(shù)據(jù),并且提供一些簡(jiǎn)單的函數(shù)用來處理導(dǎo)航、搜索、修改分析樹等功能。

  該類的關(guān)鍵是_get_new_urls()、_get_new_content()、get_url_title()三個(gè)方法。第一個(gè)方法用來解析出頁面包含的超鏈接,最為重要的選擇要解析的標(biāo)簽并為其構(gòu)造合適的正則表達(dá)式。這里我為a標(biāo)簽定義了一個(gè)匹配正則,用來獲取所有的站內(nèi)鏈接,如下:

  后面的兩個(gè)類都是通過解析Html標(biāo)簽來獲取title的方法,最終在parse()中通過調(diào)取_get_new_content()來獲得title內(nèi)容。具體的標(biāo)簽訪問方法不細(xì)談了,讀者可以自己翻閱BeautifulSoup的官方文檔。

  BuildIndex

  該類為每個(gè)URL地址與他的標(biāo)題包含的關(guān)鍵詞建立了一個(gè)索引關(guān)系并保存在一個(gè)Dict變量中,每個(gè)標(biāo)題對(duì)應(yīng)多個(gè)關(guān)鍵詞,每個(gè)標(biāo)題也對(duì)應(yīng)多個(gè)url地址,因此每個(gè)關(guān)鍵詞也對(duì)應(yīng)了多個(gè)url地址,具體的形式如下:

  index={'keyword':[url1,url2,...,urln],...}

  其中,add_page_index()方法對(duì)每個(gè)標(biāo)題進(jìn)行了分詞處理,并且調(diào)用了add_key_index()方法將keyword-url的對(duì)應(yīng)關(guān)系存到索引中,這其中也進(jìn)行了重復(fù)檢查。主意,這個(gè)分詞方法僅限于英文句子,中文的話需要用到特定的分詞工具。

  SpiderMain

  這是爬蟲的主題類,它通過調(diào)用其他幾個(gè)類生成的對(duì)象來實(shí)現(xiàn)爬蟲的運(yùn)行。該類實(shí)例化的時(shí)候會(huì)永久生成上面幾個(gè)類的對(duì)象,當(dāng)通過craw()方法獲取到用戶提供的url地址時(shí),就會(huì)依次進(jìn)行請(qǐng)求、下載、解析、建立索引的工作。最后該方法會(huì)返回index,graph兩個(gè)變量,他們分別是:

  每個(gè)關(guān)鍵詞集齊對(duì)應(yīng)的地址,keyword-urls索引,如下

  index={'keyword':[url1,url2,...,urln],...}

  每個(gè)url及其頁面中包含的urls,url-suburls索引,如下

  graph={'url':[url1,url2,...,urln],...}

  最后,我們?cè)诔绦蛑刑砑酉旅娴拇a,就可以成功的執(zhí)行我們的爬蟲了

感謝各位的閱讀!關(guān)于“Python如何實(shí)現(xiàn)簡(jiǎn)易Web爬蟲”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI