豆瓣爬蟲python
❶ python爬蟲怎麼處理豆瓣網頁異常請求
1.URLError
首先解釋下URLError可能產生的原因:
網路無連接,即本機無法上網
連接不到特定的伺服器
伺服器不存在
在代碼中,我們需要用try-except語句來包圍並捕獲相應的異常。下面是一個例子,先感受下它的風騷
Python
1
2
3
4
5
6
7
import urllib2
requset = urllib2.Request('http://www.xxxxx.com')
try:
urllib2.urlopen(requset)
except urllib2.URLError, e:
print e.reason
我們利用了 urlopen方法訪問了一個不存在的網址,運行結果如下:
Python
1
[Errno 11004] getaddrinfo failed
它說明了錯誤代號是11004,錯誤原因是 getaddrinfo failed
2.HTTPError
HTTPError是URLError的子類,在你利用urlopen方法發出一個請求時,伺服器上都會對應一個應答對象response,其中它包含一個數字」狀態碼」。舉個例子,假如response是一個」重定向」,需定位到別的地址獲取文檔,urllib2將對此進行處理。
其他不能處理的,urlopen會產生一個HTTPError,對應相應的狀態嗎,HTTP狀態碼表示HTTP協議所返回的響應的狀態。下面將狀態碼歸結如下:
100:繼續 客戶端應當繼續發送請求。客戶端應當繼續發送請求的剩餘部分,或者如果請求已經完成,忽略這個響應。
101: 轉換協議 在發送完這個響應最後的空行後,伺服器將會切換到在Upgrade 消息頭中定義的那些協議。只有在切換新的協議更有好處的時候才應該採取類似措施。
102:繼續處理 由WebDAV(RFC 2518)擴展的狀態碼,代表處理將被繼續執行。
200:請求成功 處理方式:獲得響應的內容,進行處理
201:請求完成,結果是創建了新資源。新創建資源的URI可在響應的實體中得到 處理方式:爬蟲中不會遇到
202:請求被接受,但處理尚未完成 處理方式:阻塞等待
204:伺服器端已經實現了請求,但是沒有返回新的信 息。如果客戶是用戶代理,則無須為此更新自身的文檔視圖。 處理方式:丟棄
300:該狀態碼不被HTTP/1.0的應用程序直接使用, 只是作為3XX類型回應的默認解釋。存在多個可用的被請求資源。 處理方式:若程序中能夠處理,則進行進一步處理,如果程序中不能處理,則丟棄
301:請求到的資源都會分配一個永久的URL,這樣就可以在將來通過該URL來訪問此資源 處理方式:重定向到分配的URL
302:請求到的資源在一個不同的URL處臨時保存 處理方式:重定向到臨時的URL
304:請求的資源未更新 處理方式:丟棄
400:非法請求 處理方式:丟棄
401:未授權 處理方式:丟棄
403:禁止 處理方式:丟棄
404:沒有找到 處理方式:丟棄
500:伺服器內部錯誤 伺服器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。一般來說,這個問題都會在伺服器端的源代碼出現錯誤時出現。
501:伺服器無法識別 伺服器不支持當前請求所需要的某個功能。當伺服器無法識別請求的方法,並且無法支持其對任何資源的請求。
502:錯誤網關 作為網關或者代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的響應。
503:服務出錯 由於臨時的伺服器維護或者過載,伺服器當前無法處理請求。這個狀況是臨時的,並且將在一段時間以後恢復。
HTTPError實例產生後會有一個code屬性,這就是是伺服器發送的相關錯誤號。
因為urllib2可以為你處理重定向,也就是3開頭的代號可以被處理,並且100-299范圍的號碼指示成功,所以你只能看到400-599的錯誤號碼。
下面我們寫一個例子來感受一下,捕獲的異常是HTTPError,它會帶有一個code屬性,就是錯誤代號,另外我們又列印了reason屬性,這是它的父類URLError的屬性。
Python
1
2
3
4
5
6
7
8
import urllib2
req = urllib2.Request('httt/cqcre')
try:
urllib2.urlopen(req)
except urllib2.HTTPError, e:
print e.code
print e.reason
運行結果如下
Python
1
2
403
Forbidden
錯誤代號是403,錯誤原因是Forbidden,說明伺服器禁止訪問。
我們知道,HTTPError的父類是URLError,根據編程經驗,父類的異常應當寫到子類異常的後面,如果子類捕獲不到,那麼可以捕獲父類的異常,所以上述的代碼可以這么改寫
Python
1
2
3
4
5
6
7
8
9
10
11
import urllib2
req = urllib2.Request('hcqcre')
try:
urllib2.urlopen(req)
except urllib2.HTTPError, e:
print e.code
except urllib2.URLError, e:
print e.reason
else:
print "OK"
如果捕獲到了HTTPError,則輸出code,不會再處理URLError異常。如果發生的不是HTTPError,則會去捕獲URLError異常,輸出錯誤原因。
另外還可以加入 hasattr屬性提前對屬性進行判斷,代碼改寫如下
Python
1
2
3
4
5
6
7
8
9
10
11
12
import urllib2
req = urllib2.Request('httcqcre')
try:
urllib2.urlopen(req)
except urllib2.URLError, e:
if hasattr(e,"code"):
print e.code
if hasattr(e,"reason"):
print e.reason
else:
print "OK"
首先對異常的屬性進行判斷,以免出現屬性輸出報錯的現象。
以上,就是對URLError和HTTPError的相關介紹,以及相應的錯誤處理辦法,小夥伴們加油!
❷ 怎樣避開豆瓣對爬蟲的封鎖,從而抓取豆瓣上電影內容
在互聯網中,有網路爬蟲的地方,絕對少不了反爬蟲的身影。網站反爬蟲的攔截前提是要正確區分人類訪問用戶和網路機器人,當發現可疑目標時,通過限制IP地址等措施阻止你繼續訪問。爬蟲該如何突破反爬蟲限制?
一、構建合理的HTTP請求頭
HTTP的請求頭是在你每次向網路伺服器發送請求時,傳遞的一組屬性和配置信息。由於瀏覽器和Python爬蟲發送的請求頭不同,有可能被反爬蟲檢測出來。
二、設置cookie的學問
Cookie是一把雙刃劍,有它不行,沒它更不行。網站會通過cookie跟蹤你的訪問過程,如果發現你有爬蟲行為會立刻中斷你的訪問,比如你特別快的填寫表單,或者短時間內瀏覽大量頁面。而正確地處理cookie,又可以避免很多採集問題,建議在採集網站過程中,檢查一下這些網站生成的cookie,然後想想哪一個是爬蟲需要處理的。
三、正常的時間訪問路徑
合理控制採集速度,是Python爬蟲不應該破壞的規則,盡量為每個頁面訪問時間增加一點兒間隔,可以有效幫助你避免反爬蟲。
四、使用http
對於分布式爬蟲和已經遭遇反爬蟲的人來說,使用http將成為你的首選。Ipidea分布地區廣,可滿足分布式爬蟲使用需要。支持api提取,對Python爬蟲來說再適合不過。
❸ Python爬蟲實戰(1)requests爬取豆瓣電影TOP250
爬取時間:2020/11/25
系統環境:Windows 10
所用工具:Jupyter NotebookPython 3.0
涉及的庫:requestslxmlpandasmatplotlib
umpy
蛋肥想法: 先將電影名稱、原名、評分、評價人數、分類信息從網站上爬取下來。
蛋肥想法: print數據列表後發現電影原名、分類信息等存在不需要的字元,需預先處理;同時因為後續想做一個豆瓣電影TOP250的維度分布圖,而同一電影存在多個發行國家、類型(如「法國 美國 / 劇情 動作 犯罪」),為了簡(偷)便(懶),這里均取第一個作為記入的數據;最後將數據保存為xlsx。
蛋肥想法: 蛋肥想知道在豆瓣電影TOP250中年份、國家、類型的維度數據,為了練手,使用剛才保存成xlsx的數據,並分別畫成雷達圖、柱形圖、扇形圖。
❹ python爬蟲怎麼做
大到各類搜索引擎,小到日常數據採集,都離不開網路爬蟲。爬蟲的基本原理很簡單,遍歷網路中網頁,抓取感興趣的數據內容。這篇文章會從零開始介紹如何編寫一個網路爬蟲抓取數據做告宏,然後會一步步逐漸完善爬蟲的抓取功能。
工具安裝
我們需要安裝python,python的requests和BeautifulSoup庫。我們用Requests庫用抓取網頁的內容,使用BeautifulSoup庫來從網頁中提取數據。
安裝python
運行pipinstallrequests
運行pipinstallBeautifulSoup
抓取網頁
完成必要工具安裝後,我們正式開始編寫我們的爬蟲。我們的第一個任務是要抓取所有豆瓣上的圖書信息。我們以/subject/26986954/為例,首先看看開如何抓取網頁的內容。
使用python的requests提供的get()方法我們可以非常簡單的獲取的指定網頁的內純冊容,代碼如下:
提取內容
抓取到網頁的內容後,我們要做的就是提取出我們想要的內容。在我們的第一個例子中,我們只需要提取書名。首先我們導入BeautifulSoup庫,使用BeautifulSoup我們可以非常簡單的提取網頁的特定內容。
連續抓取網頁
到目前為止,我們已經可以抓取單個網頁的內容了,現在讓我們看看如何抓取整個網站的內容。我們知道網頁之間是通過超鏈接互相連接在一起的,通過鏈接我們可以訪問整個網路。所以我們可以從每個頁面提取出包含指向其它網頁的鏈接,然後重復的對新鏈接進行抓取。
通過以上幾步我們就可以寫出一個最原始的爬蟲。在理解了爬蟲原理的基礎上,我們可以進一步對爬蟲進行完善。
寫過一個系列關於爬蟲的文章:/i6567289381185389064/。感興趣的可以前往查看。
Python基本環境的搭建,爬蟲的基本原理以及爬蟲的原型
Python爬蟲入門(第1部分)
如何使用BeautifulSoup對網頁內容進行提取
Python爬蟲入門(第2部分)
爬蟲運行時數據的存儲數據,以SQLite和MySQL作為示例
Python爬蟲入門(第3部分)
使用seleniumwebdriver對動態網頁進行抓取
Python爬蟲入門(第4部分)
討論了如何處理網站的反爬蟲策略
Python爬友如蟲入門(第5部分)
對Python的Scrapy爬蟲框架做了介紹,並簡單的演示了如何在Scrapy下進行開發
Python爬蟲入門(第6部分)
❺ 【Python爬蟲】分析網頁真實請求
1、抓取網頁、分析請求
2、解析網頁、尋找數據
3、儲存數據、多頁處理
翻頁有規律:
很多網址在第一頁時並沒有變化,多翻下一頁後規律就出來,比如 豆瓣第一頁 和 豆瓣第三頁
發現start為40,limit=20,所以猜測start=0就是第一頁,每頁顯示20條數據,對於第三頁顯示的參數可以一個個刪除驗證,可以減去不必要的參數, 但是刪除前一定要做好數據的對比
(1) 文本框輸入後產生一個請求,如常見的登錄、注冊頁面
Referer:表示當前請求的來源
Request URL:表示實際請求地址
翻頁後URL不變,該如何尋找請求?
如: http://www.zkh360.com/zkh_catalog/3.html
通過對比可以發現網站是通過pageIndex參數控制翻頁的,?表示連接
接下來用抓包工具分析下 ,從第四頁開始看URL就知道了,但是前面幾面需要查看請求的參數,這里偏多,就切換到【Inspectors--Webforms】選項,看的比較直觀
類似的網站還有 今日頭條 ,有興趣的朋友可以去研究下
(可通過獲取max_behot_time的值而改變as和cp)
❻ python爬蟲小白求幫助:爬取豆瓣網的內容 不知道哪裡出問題了 只能print一行
只獲取到一個movie_name 和 一個movies_score,然後遍歷這兩個值,循環一定是只走兩遍。不知道你這個是不是豆瓣top250 我看頁面元素好像不對了
❼ 學習python爬蟲推薦書籍
1、基礎書籍:《Python編程》
推薦理由:作者專業水平極高,從原理到開發實戰,內容詳盡且涉及面廣,通過多個案例介紹了不同場景下如何實現數據爬取,通篇干貨,無一點水分。
適讀群體:適合有一定Python基礎,或有開發經驗想轉爬蟲方向的讀者。