溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

urllib怎么在python中使用

發(fā)布時間:2020-12-31 14:49:16 來源:億速云 閱讀:156 作者:Leah 欄目:開發(fā)技術

urllib怎么在python中使用?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

一、urllib 和 urllib2的關系

在python2中,主要使用urllib和urllib2,而python3對urllib和urllib2進行了重構,拆分成了urllib.request, urllib.parse, urllib.error,urllib.robotparser等幾個子模塊,這樣的架構從邏輯和結構上說更加合理。urllib庫無需安裝,python3自帶。python 3.x中將urllib庫和urilib2庫合并成了urllib庫。

    urllib2.urlopen() 變成了 urllib.request.urlopen()
    urllib2.Request() 變成了 urllib.request.Request()
    python2中的 cookielib 改為 http.cookiejar.
    import http.cookiejar 代替  import cookielib
    urljoin 現(xiàn)在對應的函數(shù)是 urllib.parse.urljoin

二、python3下的urllib庫

  • request,它是最基本的 HTTP 請求模塊,我們可以用它來模擬發(fā)送一請求,只需要給庫方法傳入 URL 還有額外的參數(shù),就可以模擬實現(xiàn)這個過程了。

  • error ,即異常處理模塊,如果出現(xiàn)請求錯誤,我們可以捕獲這些異常,然后進行重試或其他操作保證程序不會意外終止。

  • parse ,是一個工具模塊,提供了許多 URL 處理方法,比如拆分、解析、合并等等的方法。

  • robotparser,主要是用來識別網(wǎng)站的 robots.txt 文件,然后判斷哪些網(wǎng)站可以爬,哪些網(wǎng)站不可以爬的,其實用的比較少。

三、request的基礎類

(一)request.urlopen

urlopen方法最主要的參數(shù)就是目標網(wǎng)站的url地址,可以使str類型,也可以是一個request對象。

get方法請求如下:

from urllib import request,parse
respones = request.urlopen(http://www.baidu.com/)

post方法請求,需要添加data參數(shù)(字典格式),它要是字節(jié)流編碼格式的內(nèi)容,即 bytes 類型,通過 bytes() 方法可以進行轉化,另外如果傳遞了這個 data 參數(shù),不添加data參數(shù)就默認為 GET 方式請求。

from urllib import request,parse
url = "http://www.baidu.com/"
wd = {'wd':'哇哈哈哈'}
data = bytes(parse.urlencode(wd),'utf-8')
respones = request.urlopen(url,data=data)

(二)request.Request

由于單獨使用urlopen() 方法的不能添加User-Agent、Cookie等headers信息,需要構建一個 Request 類型的對象,通過構造這個這個數(shù)據(jù)結構,一方面我們可以將請求獨立成一個對象,另一方面可配置參數(shù)更加豐富和靈活。主要參數(shù)有:

  • url 參數(shù)是請求 URL,這個是必傳參數(shù),其他的都是可選參數(shù)。

  • data 參數(shù)如果要傳必須傳 bytes(字節(jié)流)類型的,如果是一個字典,可以先用 urllib.parse 模塊里的 urlencode() 編碼。

  • headers 參數(shù)是一個字典,這個就是 Request Headers 了,你可以在構造 Request 時通過 headers 參數(shù)直接構造,也可以通過調用 Request 實例的 add_header() 方法來添加, Request Headers 最常用的用法就是通過修改 User-Agent 來偽裝瀏覽器,默認的 User-Agent 是 Python-urllib,我們可以通過修改它來偽裝瀏覽器。

  • origin_req_host 參數(shù)指的是請求方的 host 名稱或者 IP 地址。

  • unverifiable 參數(shù)指的是這個請求是否是無法驗證的,默認是False。意思就是說用戶沒有足夠權限來選擇接收這個請求的結果。例如我們請求一個 HTML 文檔中的圖片,但是我們沒有自動抓取圖像的權限,這時 unverifiable 的值就是 True。

  • method 參數(shù)是一個字符串,它用來指示請求使用的方法,比如GET,POST,PUT等等。

通過隨機的方法,選擇user-agent:

import randomUA_LIST = [
  'Mozilla/5.0 (compatible; U; ABrowse 0.6; Syllable) AppleWebKit/420+ (KHTML, like Gecko)',
  'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729)',
  'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729)',
  'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)',
  'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; Acoo Browser; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; Avant Browser)',
  'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)',
  'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)',
  'Mozilla/4.0 (compatible; Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729); Windows NT 5.1; Trident/4.0)',
  'Mozilla/4.0 (compatible; Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; Acoo Browser; .NET CLR 1.1.4322; .NET CLR 2.0.50727); Windows NT 5.1; Trident/4.0; Maxthon; .NET CLR 2.0.50727; .NET CLR 1.1.4322; InfoPath.2)',
  'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser; GTB6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)'
]

#隨機獲取一個user-agent
user_agent = random.choice(UA_LIST)

添加headers頭部信息的方法1:

url='http://www.baidu.com/'user_agent = random.choice(UA_LIST)
headers = {
  'User-Agent': user_agent
}
req = request.Request(url=url,headers=headers)
respones = request.urlopen(req)

添加headers頭部信息的方法2:

url='http://www.baidu.com'
headers = {
  'User-Agent': user_agent
}
#添加user-agent的方法2
req = request.Request(url)
#請求添加user-agent
req.add_header("User-Agent",user_agent)
#獲取請求的user-agent agent的a要小寫
print(req.get_header("User-agent"))
response = request.urlopen(req)print(respones.read().decode('utf-8'))

三、request的高級類

在urllib.request模塊里的BaseHandler類,他是所有其他Handler的父類,他是一個處理器,比如用它來處理登錄驗證,處理cookies,代理設置,重定向等。它提供了直接使用和派生類使用的方法:

  • add_parent(director):添加director作為父類

  • close():關閉它的父類

  • parent():打開使用不同的協(xié)議或處理錯誤

  • defautl_open(req):捕獲所有的URL及子類,在協(xié)議打開之前調用

Handler的子類包括:

HTTPDefaultErrorHandler:用來處理http響應錯誤,錯誤會拋出HTTPError類的異常
HTTPRedirectHandler:用于處理重定向
HTTPCookieProcessor:用于處理cookies
ProxyHandler:用于設置代理,默認代理為空
HTTPPasswordMgr:永遠管理密碼,它維護用戶名和密碼表
HTTPBasicAuthHandler:用戶管理認證,如果一個鏈接打開時需要認證,可以使用它來實現(xiàn)驗證功能

(一)ProxyHandler

如果爬蟲需要大量爬取網(wǎng)站數(shù)據(jù),為了避免被封號,需要使用代理,通過request.build_opener()方法生成一個opener對象,添加代理的方法如下:

from urllib import request

#代理開關,表示是否開啟代理
proxyswitch =True

#構建一個handler處理器對象,參數(shù)是一個字典類型,包括代理類型和代理服務器IP+PORT
proxyhandler = request.ProxyHandler({"http":"191.96.42.80:3128"})
#如果是帶用戶名和密碼的代理,格式為{"http":"username:passwd@191.96.42.80:3128"}

#不加代理的handler處理器對象
nullproxyhandler = request.ProxyHandler()

if proxyswitch:
  opener = request.build_opener(proxyhandler)
else:
  opener = request.build_opener(nullproxyhandler)

req = request.Request("http://www.baidu.com/")

response = opener.open(req)

print(response.read().decode("utf-8"))

(二)ProxyBasicAuthHandler

通過密碼管理器的方法實現(xiàn)代理服務器功能

from urllib import request
#代理密碼管理,也可以管理服務器賬戶密碼

#賬戶密碼
user = "username"
passwd = "passwd"

#代理服務器
proxyserver = "1.1.1.1:9999"

#構建密碼管理對象,保存需要處理的用戶名和密碼
passmgr = request.HTTPPasswordMgrWithDefaultRealm()

#添加賬戶信息,第一個參數(shù)realm是與遠程服務器相關的域信息
passmgr.add_password(None,proxyserver,user,passwd)

#構建基礎ProxyBasicAuthHandler處理器對象
proxyauth_handler = request.ProxyBasicAuthHandler(passmgr)

opener = request.build_opener(proxyauth_handler)

req = request.Request("http://www.baidu.com/")

response = opener.open(req)

(三)ProxyBasicAuthHandler

通過密碼管理器的方法實現(xiàn)web認證登陸功能

#web驗證
from urllib import request

test = "test"
passwd = "123456"

webserver = "1.1.1.1"

#構建密碼管理器handler
passwdmgr = request.HTTPPasswordMgrWithDefaultRealm()
#添加密碼信息
passwdmgr.add_password(None,webserver,test,passwd)

#HTTP基礎驗證處理器類
http_authhandler = request.HTTPBasicAuthHandler(passwdmgr)

opener = request.build_opener(http_authhandler)

req = request.Request("http://"+webserver)

response = opener.open(req)

四、Cookie處理

 通過http.cookiejar中的HTTPCookieProcessor構建cookie處理器對象,處理cookie信息

import http.cookiejar
from urllib import request,parse
#模擬登陸先post賬戶密碼
#然后保存生成的cookie

#通過CookieJar類構件一個coociejar對象,從來保存cookie值
cookie = http.cookiejar.CookieJar()

#構件cookie處理器對象,用來處理cookie
cookie_handler = request.HTTPCookieProcessor(cookie)

#構件一個自定義的opener
opener = request.build_opener(cookie_handler)

#通過自定義的opener的addheaders參數(shù),可以添加HTTP報頭參數(shù)
opener.addheaders = [("User-Agent","Mozilla/5.0 (compatible; U; ABrowse 0.6; Syllable) AppleWebKit/420+ (KHTML, like Gecko)"),]

#需要登陸的接口
url = 'http://www.renren.com/PLogin.do'

#需要登陸的賬戶密碼
data = {
  "email":"renren賬號",
  "password":"密碼"
}
#數(shù)據(jù)處理
data = bytes(parse.urlencode(data),'utf-8')
#第一次是POST請求,通過登陸賬戶密碼,得到cookie
req = request.Request(url,data=data)
#發(fā)送第一次POST請求,生成登陸后的cookie
response = opener.open(req)

print(response.read().decode("utf-8"))

#此時的opener已經(jīng)包含了該鏈接下的cookie,此時使用該opener就可以直接訪問該站點下其他的網(wǎng)頁而不需要再登陸了
opener.open(http://www.renren.com/PLogin.doxxxxxxxxxxxxx)

看完上述內(nèi)容,你們掌握urllib怎么在python中使用的方法了嗎?如果還想學到更多技能或想了解更多相關內(nèi)容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI