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
引數是用於設定請求超時時間。單位是秒。
cafile
和capath
代表 CA 證書和 CA 證書的路徑。如果使用HTTPS
則需要用到。
context
引數必須是ssl.SSLContext
型別,用來指定SSL
設定
cadefault
引數已經被棄用,可以不用管了。
該方法也可以單獨傳入urllib.request.Request
物件
該函式返回結果是一個http.client.HTTPResponse
物件。
Request的使用
urlopen() 方法可以發起簡單的請求。但這幾個簡單的引數並不足以構建一個完整的請求,如果請求中需要加入headers(請求頭)
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,我們需要用到Handler
和OpenerDirector
。
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是因為不同核心架構瀏覽器需要載入不同的內容,所以為了區分瀏覽器和版本,我們有個這個引數。這也是偽裝請求的時候必須加入的一個頭。