1 第乙個網路爬蟲(3)

2021-07-25 15:51:49 字數 3342 閱讀 2069

網頁是複雜的。資料的格式差,隨著**的宕機,可使用的標籤也會消失。在網路爬蟲中最令人感到挫折的經歷之一就是:讓爬蟲執行,睡覺,夢到第二天你在你的資料庫中看到了所有的資料,然而,現實是---僅僅返現了爬蟲遇到了乙個意想不到的資料格式的小錯誤,在你關閉電腦螢幕之後不久就停止了任務的執行。在相類似的情形下,你可能是對構建網路的程式設計人員詛咒,然而,那個應該真正被你鄙視的應該是你自己,由於你沒有在第一時間處理這個異常。

讓我們看看我們爬蟲的第一行,在重要的描述之後,搞明白如何去處理可能的異常:

html = urlopen("")

在這一行中,有兩個錯誤的地方:

伺服器中沒有這個網頁(或者獲取它有一些錯誤)

伺服器沒有發現

在第一種情況下,會返回乙個http錯誤。這個http錯誤可能是「404 page not found」,「500 internal server error」,等等。在這些情況下,urlopen會返回乙個常見的異常「httperror」。我們以下面的方式來處理:

use"else" statement.如果乙個http錯誤**被返回,程式會輸出錯誤,且不會執行else下的其他**。

httperror需要加入包from urllib.error import httperror

如果始終沒有發現伺服器(比如說: 宕機了,或者 url 被錯誤錄入),urlopen會返回乙個none物件。這個物件與其他程式語言的null一致。我們可以增加乙個檢測去看看返回的是否是none:

if html is

none:

print("url is not found")

else:

#program continues

當然,如果網頁能夠成功地從伺服器檢索出來,仍然有一些問題,即網頁的內容並不是我們所期待的。每一次,你呼叫bs物件的乙個標籤,檢查該標籤是否存在是非常明智的。如果你嘗試去呼叫乙個不存在的標籤,bs會返回乙個none物件。問題是,嘗試呼叫乙個none物件的標籤會返回乙個attributeerror結果。

下面的語句會返回乙個none物件:

print

(bsobj.nonexistenttag)

其中,nonexistenttag是乙個捏造的標籤,並不是乙個真正的bs函式。對這個物件的處理和檢查時完全合理的。如果你不檢查它,反而繼續且試圖去呼叫none物件的函式,就會產生一些問題,下面是乙個例子:

print(bsobj.nonexistenttag

.sometag)

該語句會返回乙個異常:

attributeerror: 'nonetype'

object has no attribute 'sometag'

所以,我們如何處理這兩個情況?最簡單的方式是明確地檢查這兩種情況:

try:

badcontent = bsobj.nonexistingtag.anothertag

except attributeerror as e:

print("tag was not found")

else:

if badcontent == none:

print("tag was not found")

else:

print(badcontent)

對於每個錯誤的檢查和處理確實是繁瑣的,但是,我們可以很容易地對**進行改編,使得寫**變得不那麼困難(更重要的是,使得讀**變得不那麼困難)。這段**,可以以下面稍微不同的方式來寫我們的爬蟲:

print(title)在這個例子中,我們構造了乙個gettitle函式,該函式會返回乙個網頁的標題,或者在出現錯誤的情況下返回乙個none物件。在gettitle內部,我們檢查了之前例子中的httperror錯誤,然後,封裝了兩個bs語句。任何乙個attributeerror都可能從這兩個語句中出現(比如:如果伺服器不存在,html會返回乙個none物件,然後html.read()會丟擲乙個attributeerror)。

當寫爬蟲的時候,很重要的一點就是思考你的**的全部的模式,這是為了處理異常以及**具有可讀性。你也有可能會再次使用這些**。構造常用的函式,比如getsitehtmlgettitle,會是得爬整個網路變得快速以及可靠。

1 第乙個網路爬蟲(4)

在這一章中,我寫了第乙個網路爬蟲去讀取乙個非常簡單的網頁。當我以為可以去隨意地爬蟲任意乙個網頁的時候,卻不得不面對殘酷的現實。我會將我所遇到的一些問題列舉出來。在這一章節所爬蟲的網頁都是http格式的,當我們輸入https的時候,卻會報錯 如果在我們的瀏覽器中,我們輸入 按下回車之後,鏈結會自動的改...

第乙個網路爬蟲程式

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 importre importrequests 啟動兩個模組,pycharm5.0.1裡貌似不用特別啟動os模組,也可以open html requests.get aaa html.text 從目標 上捕獲源 body ...

第乙個爬蟲

很多人學習python的目的就是為了學習能夠實現爬蟲的功能,這裡,我使用了scrapy框架來實現了乙個簡單的爬蟲功能,這裡我簡單的介紹一下scrapy專案的建立,和執行。1,第一步是安裝scrapy,我相信到了這一步,大多數人都已經會安裝第三方庫檔案了,這裡主要是使用命令pip install sc...