標籤:位元組 電腦 dup print ade none 認證 htm eal
2.request
首先上執行個體
import urllib.requestrequest = urllib.request.Request(‘https://python.org‘)response = urllib.request.urlopen(request)print(response.read().decode(‘utf-8‘))
與之前一樣產生了python官網的內容,但這次我們構造的是一個Request類,我們可以將請求獨立成一個對象,也可以配置參數
class.urllib.request.Request(url , data = None , headers = {} , origin_req_host = None , unverifiable = False , method = None)
- 第一個參數為必傳參數,其他都為選擇性參數。
- 第二個data如果要傳,必須以位元組流(bytes)的類型傳,如果為字典,可以先用urllib.parse模組裡的urlencode()編碼
- 第三個headers參數為一個字典,就是要求標頭,可用add_header()添加,可通過修改User-Agent來偽裝成瀏覽器,比如要偽裝成Firefox瀏覽器,可以
Mozilla/5.0 (X11;U;Linux i686) Gecko/20071127 Firefox/2.0.0.11
- 第四個是請求方的host名稱或者IP地址
- 第五個表示這個請求是無法驗證的,預設為False,比如我們要抓取某文檔的圖片,但沒有自動擷取的許可權,這是該參數為TRUE
- 第六個為一個字串,用來只是請求使用的方法,比如GET,POST,PUT等
import urllibfrom urllib import parse,requesturl = ‘http://httpbin.org/post‘headers = { ‘User-agent‘:‘Mozilla/4.0(compatible;MSIE 5.5 ;Windows NT)‘ ‘host = httpbin.org‘ }dict = {‘name‘:‘Germey‘}data = bytes(parse.urlencode(dict),encoding=‘utf-8‘)req = urllib.request.Request(url=url , data = data , headers = headers , method = ‘POST‘)response = urllib.request.urlopen(req)print(response.read().decode(‘utf-8‘))===================== RESTART: F:\Python\exercise\ok.py ====================={ "args": {}, "data": "", "files": {}, "form": { "name": "Germey" }, "headers": { "Accept-Encoding": "identity", "Connection": "close", "Content-Length": "11", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "Mozilla/4.0(compatible;MSIE 5.5 ;Windows NT)host = httpbin.org" }, "json": null, "origin": "182.110.15.26", "url": "http://httpbin.org/post"}>>>
bytes()函數的API為:
class bytes([source[, encoding[, errors]]])
- 如果 source 為整數,則返回一個長度為 source 的初始化數組;
- 如果 source 為字串,則按照指定的 encoding 將字串轉換為位元組序列;
- 如果 source 為可迭代類型,則元素必須為[0 ,255] 中的整數;
- 如果 source 為與 buffer 介面一致的對象,則此對象也可以被用於初始化 bytearray。
- 如果沒有輸入任何參數,預設就是初始化數組為0個元素。
而parse下的urlencode函數,可以把key-value這樣的索引值對轉換成我們想要的格式,返回的是a=1&b=2這樣的字串
Request類也可以通過add_header(‘User-agent‘:‘Mozilla/4.0(compatible;MSIE 5.5 ;Windows NT)
下面介紹一些更進階的用法,我們的工具Handle上場了
首先需要瞭解一下所有Handler的父類Basehandler類,他有很多子類:
- HTTPDefaultErrorHandler:用於處理HTTP響應錯誤,錯誤會拋出HTTPError異常
- HTTPRedirectHandler:用於處理定向
- HTTPCookieProcessor:用於處理Cookies
- ProxyHandler:用於設定代理,預設代理為空白
- HTTPPasswordMgr:用於管理密碼,維護了使用者名稱和密碼的表
- HTTPBasicAuthHandler:用於管理認證,連結開啟時需要認證,可用他來解決認證問題
還有OpenerDirector類,之前使用的urlopen其實就是開啟了opener類,前面的urlopen就相當於封裝好了要求方法,現在這個相當於更深一步配置請求功能,用到了opener類
其可以使用open方法,雖然返回的類型與urlopen()的一致
HTTPBasicAuthHandler處理器(Web用戶端授權驗證)
有些網站開啟時會進行身分識別驗證,提示輸入使用者名稱和密碼
import urllib.requestfrom urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_openerfrom urllib.error import URLErrorusername = ‘username‘password = ‘password‘url = ‘http://localhost:4000/‘#構建一個密碼管理對象,用來儲存需要處理的使用者名稱和密碼p = urllib.request.HTTPPasswordMgrWithDefaultRealm()#添加賬戶資訊,第一個參數realm是與遠程伺服器相關的域資訊,一般沒人管都是None,後面三個參數分別是Web伺服器,使用者名稱,密碼p.add_password(None, url, username, password)#構建一個HTTP基礎使用者名稱/密碼驗證的HTTPBasicAuthHandler處理器對象,參數是建立的密碼管理對象auth_handler=HTTPBasicAuthHandler(p)#通過 build_opener()方法使用這些代理Handler對象,建立自訂opener對象,參數包括構建的 proxy_handleropener = build_opener(auth_handler)#然後直接在Opener發送請求時就相當於已經驗證成功了try: urllib.request.install_opener(opener) result = opener.open(url) html = result.read().decode(‘utf-8‘) print(html)except URLError as e: print(e.reason)
===================== RESTART: F:\Python\exercise\ok.py =====================
[WinError 10061] 由於目標電腦積極拒絕,無法串連。
ProxyBasicAuthHandler(代理授權驗證)
使用了ProxyHandler函數處理,直接上代碼
import urllib.request # 私密代理授權的賬戶user = "mr_mao_hacker"# 私密代理授權的密碼passwd = "sffqry9r"# 私密代理 IPproxyserver = "61.158.163.130:16816" # 1. 構建一個密碼管理對象,用來儲存需要處理的使用者名稱和密碼passwdmgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() # 2. 添加賬戶資訊,第一個參數realm是與遠程伺服器相關的域資訊,一般沒人管它都是寫None,後面三個參數分別是 Proxy 伺服器、使用者名稱、密碼passwdmgr.add_password(None, proxyserver, user, passwd) # 3. 構建一個代理基礎使用者名稱/密碼驗證的ProxyBasicAuthHandler處理器對象,參數是建立的密碼管理對象# 注意,這裡不再使用普通ProxyHandler類了proxyauth_handler = urllib.request.ProxyBasicAuthHandler(passwdmgr) # 4. 通過 build_opener()方法使用這些代理Handler對象,建立自訂opener對象,參數包括構建的 proxy_handler 和 proxyauth_handleropener = urllib.request.build_opener(proxyauth_handler) # 5. 構造Request 請求
#這裡構造的Request類相當於一個自訂的請求,但自訂只定義了他的URL,與只輸入URL沒有區別
request = urllib.request.Request("http://www.baidu.com/") # 6. 使用自訂opener發送請求response = opener.open(request) # 7. 列印響應內容print (response.read().decode(‘uft-8‘))
關於代理的還可以參考這篇文章:79074219
首先,啥是Cookies呢,Cookies就是伺服器暫存放在你的電腦裡的資料(.txt格式的文字檔),好讓伺服器用來辨認你的電腦。當你在瀏覽網站的時候,Web伺服器會先送一小小資料放在你的電腦上,Cookies 會幫你在網站上所打的文字或是一些選擇都記錄下來。當下次你再訪問同一個網站,Web伺服器會先看看有沒有它上次留下的Cookies資料,有的話,就會依據Cookie裡的內容來判斷使用者,送出特定的網頁內容給你。
先上一個執行個體如何將網站的Cookies弄下來:
import http.cookiejar,urllib.request#首先必須聲明一個CookieJar對象
cookie = http.cookiejar.CookieJar()handler = urllib.request.HTTPCookieProcessor(cookie)opener = urllib.request.build_opener(handler)response = opener.open(‘http://www.baidu.com‘)for item in cookie: print (item.name+"="+item.value)====================== RESTART: F:\Python\exercise\1.py ======================BAIDUID=76B5F4D5A2EF8ADD2571BABCBAA63F79:FG=1BIDUPSID=76B5F4D5A2EF8ADD2571BABCBAA63F79H_PS_PSSID=1993_1454_21093_26350_26922_22158PSTM=1534469599BDSVRTM=0BD_HOME=0delPer=0
然後根據網上一個博主的部落格,進行其他一些學習69817490
接著我儲存cookie的資訊
import http.cookiejar,urllib.requestfilename = ‘cookies.txt‘cookie = http.cookiejar.MozillaCookieJar(filename)handler = urllib.request.build_opener(cookie)opener = urllib.request.build_opener(handler)response = opener.open(‘http://www.baidu.com‘)cookie.save(ignore_discard = True , ignore_expires = True)
發現程式顯示為
這個坑先留到這裡,如果哪位大神知道我哪裡錯了,還請能幫忙指出
python3網路爬蟲學習——基本庫的使用(2)