python爬蟲一直報錯,不知道是使用框架還是自己利用request寫的。個人的經驗是碰到錯誤,根據錯誤的提示做相應的修改,下面是我在做爬蟲是碰到的幾種錯誤,分享給大家。

提取頁面數據時,數字越界之類的提醒

在我們利用xpath提取數據的時候,時常會碰到越界的提示,這裡歸結為一句話是對頁面的html結構了解的不夠,對xpath的語法掌握的不夠。比如xpath("./a/text()")和xpath("/a/text()")表達的意思是不一樣的。

頁面的問題,如果只是普通的頁面,你直接用url帶上相應的參數發送請求,對方伺服器就可以響應

我們經常碰到一個爬蟲爬某些頁面的時候正常工作,爬其它的頁面的時候頁面內容爬取不下來,為什麼?因為cookie,出於安全的考慮,現在的頁面都會在本地存儲一些cookie,在用戶下次訪問的時候直接根據cookie來判斷是否需要登錄之類的。這個時候,需要我們也偽裝成之前登錄過訪問過的樣子,因此,需要在正常的請求基礎上添加上一些頭部信息之類的。

robots.txt,爬蟲應該注意爬取網站的robots.txt文件,那些域名是允許爬取的,那些域名下是不允許的

在我們利用scrapy等爬蟲框架爬取的時候,要注意這些,默認情況下scrapy是嚴格遵守這些協議的。因此,需要我們在設置文件里將此項設置為false,這樣就可以不受robots的約束。

當然,問題不止上面列舉的幾個問題,還有很多其它。總的來說,碰到了問題通過百度搜索都可以幫助我們解決掉,所以碰到問題多搜索,搜索後多看,多研究。問題自然 就會解決掉。關鍵是要用心去對待問題。

爬蟲報錯,有好多可能,從一個新手角度來看,大致有以下幾條:

1、ImportError 導入模塊/對象失敗

這類錯誤往往是在導入模塊的時候報錯,比如導入失敗或者沒有安裝對應的模塊

處理方式:安裝相應的模塊,或者檢查語法是否輸入錯誤等等

點此查看圖片摺疊原因

2、KeyError、NameError、SyntaxError、TabError、ValueError、IndentationError

這類錯誤往往是比較麻煩的,我們來挨個解釋下:

KeyError值錯誤,沒有對應的鍵值,比如取字典中不存在的值的時候,就會出現這個錯誤

NameError變數名錯誤,這個錯誤一般出現在沒有定義或者沒有初始化變數,或者變數名字輸入錯誤

SyntaxError語法錯誤,這個錯誤很明顯就是字面意思了

TabError Tab和空格混用導致的錯誤、IndentationError縮進錯誤

ValueError參數錯誤,傳入的參數值有問題,比如類型錯誤或者其他的

以上錯誤往往是因為寫編碼的時候不夠細緻,或者一些不好的操作習慣導致。出現錯誤後只需要根據後面的提示去修正相應的代碼即可!

點此查看圖片摺疊原因

3、AttributeError對象沒有這個屬性、IndexError列表沒有相應的索引

這2個錯誤為什麼單獨拿出來呢,是因為這是新手最常見的錯誤了,比如我們在做一個小爬蟲,用re或者其他方式匹配出結果後,需要對其進行進一步的操作比如分割,往往就忽略了一個問題,匹配出的結果是列表,或者精確的匹配一個內容,也忽略它本身還是一個列表,我們把它當成是一個字元串來處理,就會報錯

還有就是如果沒有匹配到相應的內容,會返回空列表,而這種情況有可能發生在代碼已經寫到後面了,沒有相應的判斷語句去規避,結果就是返回的空列表,去取值,就會報IndexError錯誤了!

當然還有其他的錯誤類型,比如上面幾位所說的,requests沒有返回我們要求的值、因為爬取的過快結果伺服器斷開連接等等,都會發生報錯!


http狀態碼:403,Forbidden。代表伺服器已經理解請求,但是拒絕執行它。通常是被伺服器反爬蟲了。

請用谷歌瀏覽器按f12打開開發人員工具,然後打開要爬的網頁,檢查http頭信息。

1:headers需要偽裝正常的瀏覽器,請檢查各個http頭,比如把host、refer加上,有些網站會檢測;cookie往往是改變的,請測試是否需要加上以及是否合法改變。具體不同網頁不太一樣,原則上就是偽裝headers,以便讓伺服器認為是正常的瀏覽器。

2:如果確認所有的http頭都是正確偽裝,那麼就是請求的頻率太快,被伺服器禁掉了ip或者賬戶,請更換ip或更換代理ip。


推薦閱讀:
相关文章