Python爬蟲入門 :擴充套件知識點(超時設定、HTTP協議請求實戰:)
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理
以下文章來源於騰訊雲 作者:py3study
( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群檔案流,可以自行下載!還有海量最新2020python學習資料。 )
超時設定
有時候訪問網頁時長時間未響應,系統就會判斷網頁超時,無法開啟網頁。如果需要自己設定超時時間則:
通過urlopen()開啟網頁時使用timeout欄位設定 import urllib.request for i in range(1,100): #迴圈99次 try: file = urllib.request.urlopen("http://yum.iqianyue.com",timeout=0.1) #設定超時時間為0.1s data = file.read() print(len(data)) except Exception as e: print("出現異常:"+str(e)) #網站伺服器效能不好的時候可能出現異常
一般我們不想出現超時異常就可以把時間設定長一點如:30。
HTTP協議請求實戰:
在客戶端和伺服器端之間訊息傳遞可以使用http協議請求進行
http六種型別:
get請求:通過url地址傳遞資訊。
post請求:可以向伺服器提交資料,比較主流比較安全。
put請求:請求伺服器儲存一個資源,通常要指定儲存的位置。
head請求:請求獲取報頭資訊。
delete請求:請求伺服器刪除一個資源。
options請求:獲取當前url所支援的請求型別。
一般使用get和post較多隻介紹這兩種:
get請求: 例如我們想在百度上查詢一個關鍵詞,如何用爬蟲進行處理呢? 步驟:首先我們開啟百度輸入關鍵詞如“xpath”之後回車,我們觀察一下url的變化:
https://www.baidu.com/s?wd=xpath&rsv_spt=1&rsv_iqid=0xdb261ac900003e2f&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_n=2&rsv_sug3=1
我們分析一下:欄位wd是我們查詢的值,也就是說wd就是儲存使用者要檢索的關鍵詞
我們簡化下網址 “https://www.baidu.com/s?wd=關鍵詞”
這時我們把https://www.baidu.com/s?wd=xpath 也加入瀏覽器重新整理一下,也能出現關鍵詞,這說明我們在百度上查詢關鍵詞會用get請求進行。
接著我們實現
import urllib.request keywd = "xpath" url = "http://www.baidu.com/s?wd=" + keywd req = urllib.request.Request(url) data = urllib.request.urlopen(req).read() fhandle = open("D:/crawler/6.html", "wb") fhandle.write(data) fhandle.close()
如果要檢索的關鍵詞是中文,則要對上述程式碼進行優化:
import urllib.request keywd = "xpath" keywd="楊守鶴" url = "http://www.baidu.com/s?wd=" #注意不是https key_code=urllib.request.quote(keywd)#這裡對關鍵詞部分進行編碼 url_all=url+key_code req = urllib.request.Request(url_all)#通過url引數構建Request物件 data = urllib.request.urlopen(req).read()#通過urlopen開啟構建的Request物件 fhandle = open("D:/crawler/7.html", "wb") fhandle.write(data) fhandle.close()
這裡我們學習到滿足get請求的url格式:“http://網址?欄位名1=欄位內容1&欄位名2=欄位內容2 …”
post請求
我們在進行註冊登入的時候時常用到post請求
我們先開啟一個網頁:http://www.iqianyue.com/mypost/
輸入資料提交後會顯示資訊。
如何使用爬蟲自動實現呢?
步驟:
首先設定url地址,我們分析一下,在點選了提交之後會傳遞到當前頁面進行處理,所以處理的頁面應該是:
http://www.iqianyue.com/mypost/,我們設為url。之後我們在網頁右擊選擇檢視頁面原始碼,找到對應的form表單部分
,進行分析。
<form action="" method="post"> name:<input name="name" type="text" /><br> passwd:<input name="pass" type="text" /><br> <input name="" type="submit" value="submit" />
我們看到屬性值
我們使用字典形式 格式:{欄位名1:欄位值1,欄位名2:欄位值2…}
如:{"name":"yang","pass":"a123456"}
之後我們還要對資料進行編碼處理:使用urllib.parse.urlencode
然後建立Request物件傳入url和資料,接著我們可以使用之前學過的add_header()新增頭資訊,模擬瀏覽器爬取。之後就按以往進行處理即可。
import urllib.request import urllib.parse url = "http://www.iqianyue.com/mypost/" postdata=urllib.parse.urlencode({ "name":"yang", "pass":"a123456" }).encode('utf-8')#將編碼設定為utf-8 req = urllib.request.Request(url,postdata) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36') data = urllib.request.urlopen(req).read() fhandle = open("D:/crawler/8.html", "wb") fhandle.write(data) fhandle.close()
代理伺服器設定
有時候使用同一個ip去爬取同一個網站,久了就會被對方伺服器遮蔽,怎麼辦??
這時我們就要使用一招:“瞞天過海、暗度陳倉”,也就是使用代理伺服器。
這裡有一個網址:http://yum.iqianyue.com/proxy 裡面有更新很多代理ip
我們選擇一個: 格式:"網址:埠號"即:110.52.235.249:9999
#實現使用代理伺服器爬取url網頁功能
def use_proxy(proxy_addr,url): import urllib.request proxy=urllib.request.ProxyHandler({'http':proxy_addr}) opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler) urllib.request.install_opener(opener) data=urllib.request.urlopen(url).read().decode('utf-8') return data proxy_addr="58.219.8.8:1080" data=use_proxy(proxy_addr,"http://www.baidu.com")#傳遞ip和要爬取的url print(len(data))#//後續處理
如果:由於連線方在一段時間後沒有正確答覆或連線的主機沒有反應,連線嘗試失敗。>
說明IP可能失效了,要換一個試試,實際上我們可以實現多個ip用程式實現一個不行自動切換為下一個。