1. 程式人生 > >python爬蟲學習6_UrlLib使用進階

python爬蟲學習6_UrlLib使用進階

python爬蟲學習6_UrlLib使用進階

基礎使用的話參看之前的文件:

基礎使用:https://blog.csdn.net/u011486491/article/details/82844587

請求頭和代理:https://blog.csdn.net/u011486491/article/details/82973379

異常處理:https://blog.csdn.net/u011486491/article/details/82973364

 

該庫有四個模組,分別是urllib.request,urllib.error,urllib.parse,urllib.robotparser。

網路請求

urlopen

簡單的網路請求模組,如果直接通過url去訪問的話,user-agent內的內容直接是Python-urllib/x.y。直接就被識別成了爬蟲,所以我們需要通過Request去封裝我們的data和header之後再通過urlopen去訪問。

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

data 是 bytes 型別的內容,可通過 bytes()函式轉為化位元組流。它也是可選引數。使用 data 引數,請求方式變成以 POST 方式

提交表單。使用標準格式是application/x-www-form-urlencoded

timeout 引數是用於設定請求超時時間。單位是秒。

cafilecapath代表 CA 證書和 CA 證書的路徑。如果使用HTTPS則需要用到。

context引數必須是ssl.SSLContext型別,用來指定SSL設定

cadefault引數已經被棄用,可以不用管了。

該方法也可以單獨傳入urllib.request.Request物件

該函式返回結果是一個http.client.HTTPResponse物件。

Request的使用

urlopen() 方法可以發起簡單的請求。但這幾個簡單的引數並不足以構建一個完整的請求,如果請求中需要加入headers(請求頭)

指定請求方式等資訊,我們就可以利用更強大的Request類來構建一個請求。

urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

data 引數跟 urlopen() 中的 data 引數用法相同。

headers 引數是指定發起的 HTTP 請求的頭部資訊。headers 是一個字典。它除了在 Request 中新增,還可以通過呼叫 Reques t例項的 add_header() 方法來新增請求頭。

origin_req_host 引數指的是請求方的 host 名稱或者 IP 地址。

unverifiable 引數表示這個請求是否是無法驗證的,預設值是False。意思就是說使用者沒有足夠許可權來選擇接收這個請求的結果。例如我們請求一個HTML文件中的圖片,但是我們沒有自動抓取影象的許可權,我們就要將 unverifiable 的值設定成 True。

method 引數指的是發起的 HTTP 請求的方式,有 GET、POST、DELETE、PUT等。

Request的高階用法

如果我們需要在請求中新增代理、處理請求的 Cookies,我們需要用到HandlerOpenerDirector

1) Handler Handler 的中文意思是處理者、處理器。 Handler 能處理請求(HTTP、HTTPS、FTP等)中的各種事情。它的具體實現是這個類 urllib.request.BaseHandler。它是所有的 Handler 的基類,其提供了最基本的Handler的方法,例如default_open()、protocol_request()等。 繼承 BaseHandler 有很多個,我就列舉幾個比較常見的類:

  • ProxyHandler:為請求設定代理

  • HTTPCookieProcessor:處理 HTTP 請求中的 Cookies

  • HTTPDefaultErrorHandler:處理 HTTP 響應錯誤。

  • HTTPRedirectHandler:處理 HTTP 重定向。

  • HTTPPasswordMgr:用於管理密碼,它維護了使用者名稱密碼的表。

  • HTTPBasicAuthHandler:用於登入認證,一般和 HTTPPasswordMgr 結合使用。

2) OpenerDirector 對於 OpenerDirector,我們可以稱之為 Opener。我們之前用過 urlopen() 這個方法,實際上它就是 urllib 為我們提供的一個Opener。那 Opener 和 Handler 又有什麼關係?opener 物件是由 build_opener(handler) 方法來創建出來 。我們需要建立自定義的 opener,就需要使用 install_opener(opener)方法。值得注意的是,install_opener 例項化會得到一個全域性的 OpenerDirector 物件。

代理的使用

在高頻率訪問網站的時候,為了防止網站封我們ip,我們使用代理進行訪問。

import urllib.request
​
url = "http://tieba.baidu.com/"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
​
proxy_handler = urllib.request.ProxyHandler({
    'http': 'web-proxy.oa.com:8080',
    'https': 'web-proxy.oa.com:8080'
})
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
​
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
​

認證登入

帶賬號密碼的訪問;

使用 HTTPPasswordMgrWithDefaultRealm() 例項化一個賬號密碼管理物件;然後使用 add_password() 函式新增賬號和密碼;接著使用 HTTPBasicAuthHandler() 得到 hander;再使用 build_opener() 獲取 opener 物件;最後使用 opener 的 open() 函式發起請求。

import urllib.request
​
url = "http://tieba.baidu.com/"
user = 'user'
password = 'password'
pwdmgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
pwdmgr.add_password(None,url ,user ,password)
​
auth_handler = urllib.request.HTTPBasicAuthHandler(pwdmgr)
opener = urllib.request.build_opener(auth_handler)
response = opener.open(url)
print(response.read().decode('utf-8'))

cookie登入

為了免去重複登入,我們可以使用cookie來進行登入。

獲取 Cookies 需要使用 http.cookiejar.CookieJar() 例項化一個 Cookies 物件。再用 urllib.request.HTTPCookieProcessor 構建出 handler 物件。最後使用 opener 的 open() 函式

import http.cookiejar
import urllib.request
​
url = "http://tieba.baidu.com/"
fileName = 'cookie.txt'
​
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open(url)
​
f = open(fileName,'a')
for item in cookie:
    f.write(item.name+" = "+item.value+'\n')
f.close()
​

 

User-Agent

為了顯得合法地訪問別人網站,我們需要設定User-Agent頭。

最早的user-Agent是因為不同核心架構瀏覽器需要載入不同的內容,所以為了區分瀏覽器和版本,我們有個這個引數。這也是偽裝請求的時候必須加入的一個頭。