網頁是複雜的。資料的格式差,隨著**的宕機,可使用的標籤也會消失。在網路爬蟲中最令人感到挫折的經歷之一就是:讓爬蟲執行,睡覺,夢到第二天你在你的資料庫中看到了所有的資料,然而,現實是---僅僅返現了爬蟲遇到了乙個意想不到的資料格式的小錯誤,在你關閉電腦螢幕之後不久就停止了任務的執行。在相類似的情形下,你可能是對構建網路的程式設計人員詛咒,然而,那個應該真正被你鄙視的應該是你自己,由於你沒有在第一時間處理這個異常。
讓我們看看我們爬蟲的第一行,在重要的描述之後,搞明白如何去處理可能的異常:
html = urlopen("")
在這一行中,有兩個錯誤的地方:
伺服器中沒有這個網頁(或者獲取它有一些錯誤)
伺服器沒有發現
在第一種情況下,會返回乙個http錯誤。這個http錯誤可能是「404 page not found」,「500 internal server error」,等等。在這些情況下,urlopen
會返回乙個常見的異常「httperror」。我們以下面的方式來處理:
use"else" statement.如果乙個http錯誤**被返回,程式會輸出錯誤,且不會執行else
下的其他**。
如果始終沒有發現伺服器(比如說: 宕機了,或者 url 被錯誤錄入),httperror
需要加入包from urllib.error import httperror
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
)。
當寫爬蟲的時候,很重要的一點就是思考你的**的全部的模式,這是為了處理異常以及**具有可讀性。你也有可能會再次使用這些**。構造常用的函式,比如getsitehtml
和gettitle
,會是得爬整個網路變得快速以及可靠。
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...