1. 程式人生 > 實用技巧 >Python爬蟲入門 :擴充套件知識點(超時設定、HTTP協議請求實戰:)

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用程式實現一個不行自動切換為下一個。