python3網路爬蟲學習——基本庫的使用(2)

來源:互聯網
上載者:User

標籤:位元組   電腦   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呢,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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.