Python爬蟲 Urllib庫的高階用法

2022-05-30 09:27:12 字數 3418 閱讀 2336

有些**不會同意程式直接用上面的方式進行訪問,如果識別有問題,那麼站點根本不會響應,所以為了完全模擬瀏覽器的工作,我們需要設定一些headers 的屬性。

首先,開啟我們的瀏覽器,除錯瀏覽器f12,我用的是chrome,開啟網路監聽,示意如下,比如知乎,點登入之後,我們會發現登陸之後介面都變化了,出現乙個新的介面,實質上這個頁面包含了許許多多的內容,這些內容也不是一次性就載入完成的,實質上是執行了好多次請求,一般是首先請求html檔案,然後載入js,css 等等,經過多次請求之後,網頁的骨架和肌肉全了,整個網頁的效果也就出來了。

拆分這些請求,我們只看一第乙個請求,你可以看到,有個request url,還有headers,下面便是response,顯示得不全,小夥伴們可以親身實驗一下。那麼這個頭中包含了許許多多是資訊,有檔案編碼啦,壓縮方式啦,請求的agent啦等等。

其中,agent就是請求的身份,如果沒有寫入請求身份,那麼伺服器不一定會響應,所以可以在headers中設定agent,例如下面的例子,這個例子只是說明了怎樣設定的headers,小夥伴們看一下設定格式就好。

1

import

urllib

2import

urllib2

34 url = '

'5 user_agent = '

mozilla/4.0 (compatible; msie 5.5; windows nt)

'6 values =

7 headers =

8 data =urllib.urlencode(values)

9 request =urllib2.request(url, data, headers)

10 response =urllib2.urlopen(request)

11 page = response.read()

這樣,我們設定了乙個headers,在構建request時傳入,在請求時,就加入了headers傳送,伺服器若識別了是瀏覽器發來的請求,就會得到響應。

另外,我們還有對付」反盜鏈」的方式,對付防盜煉,伺服器會識別headers中的referer是不是它自己,如果不是,有的伺服器不會響應,所以我們還可以在headers中加入referer

例如我們可以構建下面的headers

1 headers =
同上面的方法,在傳送請求時把headers傳入request引數裡,這樣就能應付防盜煉了。

另外headers的一些屬性,下面的需要特別注意一下:

user-agent : 有些伺服器或 proxy 會通過該值來判斷是否是瀏覽器發出的請求

content-type : 在使用 rest 介面時,伺服器會檢查該值,用來確定 http body 中的內容該怎樣解析。

在使用伺服器提供的 restful 或 soap 服務時, content-type 設定錯誤會導致伺服器拒絕服務

其他的有必要的可以審查瀏覽器的headers內容,在構建時寫入同樣的資料即可。

urllib2 缺省會使用環境變數 http_proxy 來設定 http proxy。假如乙個**它會檢測某一段時間某個ip 的訪問次數,如果訪問次數過多,它會禁止你的訪問。所以你可以設定一些**伺服器來幫助你做工作,每隔一段時間換乙個**,**君都不知道是誰在搗鬼了,這酸爽!

下面一段**說明了**的設定用法

1

import

urllib2

2 enable_proxy =true

3 proxy_handler = urllib2.proxyhandler()

4 null_proxy_handler =urllib2.proxyhandler({})5if

enable_proxy:

6 opener =urllib2.build_opener(proxy_handler)

7else

:8 opener =urllib2.build_opener(null_proxy_handler)

9 urllib2.install_opener(opener)

例如下面的**,如果第二個引數data為空那麼要特別指定是timeout是多少,寫明形參,如果data已經傳入,則不必宣告。

1

import

urllib2

2 response = urllib2.urlopen('

', timeout=10)

1

import

urllib2

2 response = urllib2.urlopen('

',data, 10)

http協議有六種請求方法,get,head,put,delete,post,options,我們有時候需要用到put方式或者delete方式請求。

put:這個方法比較少見。html表單也不支援這個。本質上來講, put和post極為相似,都是向伺服器傳送資料,但它們之間有乙個重要區別,put通常指定了資源的存放位置,而post則沒有,post的資料存放位置由伺服器自己決定。

delete:刪除某乙個資源。基本上這個也很少見,不過還是有一些地方比如amazon的s3雲服務裡面就用的這個方法來刪除資源。

如果要使用 http put 和 delete ,只能使用比較低層的 httplib 庫。雖然如此,我們還是能通過下面的方式,使 urllib2 能夠發出 put 或delete 的請求,不過用的次數的確是少,在這裡提一下。

1

import

urllib2

2 request = urllib2.request(uri, data=data)

3 request.get_method = lambda: '

put'

#or 'delete'

4 response = urllib2.urlopen(request)

可以通過下面的方法把 debug log 開啟,這樣收發包的內容就會在螢幕上列印出來,方便除錯,這個也不太常用,僅提一下

python爬蟲 urllib庫基本使用

匯入urllib from urllib import request 明確url base url 發起乙個http請求,返回乙個類檔案物件 response request.urlopen base url 獲取網頁內容 html response.read decode utf 8 將網頁寫入...

python 爬蟲基礎篇 urllib庫

衣帶漸寬終不悔,為伊消得人憔悴。urllib.request模組 該模組是urllib的核心模組用於傳送請求,獲取請求返回結果。urlopen 發起請求 response urllib.request.urlopen url,data none,timeout,cafile none,capath ...

Python 爬蟲乾貨之urllib庫

小試牛刀 怎樣扒網頁呢?其實就是根據url來獲取它的網頁資訊,雖然我們在瀏覽器中看到的是一幅幅優美的畫面,但是其實是由瀏覽器解釋才呈現出來的,實質它是一段html 加 js css,如果把網頁比作乙個人,那麼html便是他的骨架,js便是他的肌肉,css便是它的衣服。所以最重要的部分是存在於html...