最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python爬蟲基礎(chǔ)之urllib的使用

 更新時(shí)間:2020年12月31日 11:44:09   作者:過去圍觀  
這篇文章主要介紹了python爬蟲基礎(chǔ)之urllib的使用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

一、urllib 和 urllib2的關(guān)系

在python2中,主要使用urllib和urllib2,而python3對(duì)urllib和urllib2進(jìn)行了重構(gòu),拆分成了urllib.request, urllib.parse, urllib.error,urllib.robotparser等幾個(gè)子模塊,這樣的架構(gòu)從邏輯和結(jié)構(gòu)上說(shuō)更加合理。urllib庫(kù)無(wú)需安裝,python3自帶。python 3.x中將urllib庫(kù)和urilib2庫(kù)合并成了urllib庫(kù)。

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

二、python3下的urllib庫(kù)

  • request,它是最基本的 HTTP 請(qǐng)求模塊,我們可以用它來(lái)模擬發(fā)送一請(qǐng)求,只需要給庫(kù)方法傳入 URL 還有額外的參數(shù),就可以模擬實(shí)現(xiàn)這個(gè)過程了。
  • error ,即異常處理模塊,如果出現(xiàn)請(qǐng)求錯(cuò)誤,我們可以捕獲這些異常,然后進(jìn)行重試或其他操作保證程序不會(huì)意外終止。
  • parse ,是一個(gè)工具模塊,提供了許多 URL 處理方法,比如拆分、解析、合并等等的方法。
  • robotparser,主要是用來(lái)識(shí)別網(wǎng)站的 robots.txt 文件,然后判斷哪些網(wǎng)站可以爬,哪些網(wǎng)站不可以爬的,其實(shí)用的比較少。

三、request的基礎(chǔ)類

(一)request.urlopen

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

get方法請(qǐng)求如下:

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

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

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

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

  • url 參數(shù)是請(qǐng)求 URL,這個(gè)是必傳參數(shù),其他的都是可選參數(shù)。
  • data 參數(shù)如果要傳必須傳 bytes(字節(jié)流)類型的,如果是一個(gè)字典,可以先用 urllib.parse 模塊里的 urlencode() 編碼。
  • headers 參數(shù)是一個(gè)字典,這個(gè)就是 Request Headers 了,你可以在構(gòu)造 Request 時(shí)通過 headers 參數(shù)直接構(gòu)造,也可以通過調(diào)用 Request 實(shí)例的 add_header() 方法來(lái)添加, Request Headers 最常用的用法就是通過修改 User-Agent 來(lái)偽裝瀏覽器,默認(rèn)的 User-Agent 是 Python-urllib,我們可以通過修改它來(lái)偽裝瀏覽器。
  • origin_req_host 參數(shù)指的是請(qǐng)求方的 host 名稱或者 IP 地址。
  • unverifiable 參數(shù)指的是這個(gè)請(qǐng)求是否是無(wú)法驗(yàn)證的,默認(rèn)是False。意思就是說(shuō)用戶沒有足夠權(quán)限來(lái)選擇接收這個(gè)請(qǐng)求的結(jié)果。例如我們請(qǐng)求一個(gè) HTML 文檔中的圖片,但是我們沒有自動(dòng)抓取圖像的權(quán)限,這時(shí) unverifiable 的值就是 True。
  • method 參數(shù)是一個(gè)字符串,它用來(lái)指示請(qǐng)求使用的方法,比如GET,POST,PUT等等。

通過隨機(jī)的方法,選擇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)'
]

#隨機(jī)獲取一個(gè)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)
#請(qǐng)求添加user-agent
req.add_header("User-Agent",user_agent)
#獲取請(qǐng)求的user-agent agent的a要小寫
print(req.get_header("User-agent"))
response = request.urlopen(req)print(respones.read().decode('utf-8'))

三、request的高級(jí)類

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

  • add_parent(director):添加director作為父類
  • close():關(guān)閉它的父類
  • parent():打開使用不同的協(xié)議或處理錯(cuò)誤
  • defautl_open(req):捕獲所有的URL及子類,在協(xié)議打開之前調(diào)用

Handler的子類包括:

HTTPDefaultErrorHandler:用來(lái)處理http響應(yīng)錯(cuò)誤,錯(cuò)誤會(huì)拋出HTTPError類的異常
HTTPRedirectHandler:用于處理重定向
HTTPCookieProcessor:用于處理cookies
ProxyHandler:用于設(shè)置代理,默認(rèn)代理為空
HTTPPasswordMgr:永遠(yuǎn)管理密碼,它維護(hù)用戶名和密碼表
HTTPBasicAuthHandler:用戶管理認(rèn)證,如果一個(gè)鏈接打開時(shí)需要認(rèn)證,可以使用它來(lái)實(shí)現(xiàn)驗(yàn)證功能

(一)ProxyHandler

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

from urllib import request

#代理開關(guān),表示是否開啟代理
proxyswitch =True

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

#不加代理的handler處理器對(duì)象
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

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

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

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

#代理服務(wù)器
proxyserver = "1.1.1.1:9999"

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

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

#構(gòu)建基礎(chǔ)ProxyBasicAuthHandler處理器對(duì)象
proxyauth_handler = request.ProxyBasicAuthHandler(passmgr)

opener = request.build_opener(proxyauth_handler)

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

response = opener.open(req)

(三)ProxyBasicAuthHandler

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

#web驗(yàn)證
from urllib import request

test = "test"
passwd = "123456"

webserver = "1.1.1.1"

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

#HTTP基礎(chǔ)驗(yàn)證處理器類
http_authhandler = request.HTTPBasicAuthHandler(passwdmgr)

opener = request.build_opener(http_authhandler)

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

response = opener.open(req)

四、Cookie處理

 通過http.cookiejar中的HTTPCookieProcessor構(gòu)建cookie處理器對(duì)象,處理cookie信息

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

#通過CookieJar類構(gòu)件一個(gè)coociejar對(duì)象,從來(lái)保存cookie值
cookie = http.cookiejar.CookieJar()

#構(gòu)件cookie處理器對(duì)象,用來(lái)處理cookie
cookie_handler = request.HTTPCookieProcessor(cookie)

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

#通過自定義的opener的addheaders參數(shù),可以添加HTTP報(bào)頭參數(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賬號(hào)",
  "password":"密碼"
}
#數(shù)據(jù)處理
data = bytes(parse.urlencode(data),'utf-8')
#第一次是POST請(qǐng)求,通過登陸賬戶密碼,得到cookie
req = request.Request(url,data=data)
#發(fā)送第一次POST請(qǐng)求,生成登陸后的cookie
response = opener.open(req)

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

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

以上就是python爬蟲基礎(chǔ)之urllib的使用的詳細(xì)內(nèi)容,更多關(guān)于python 爬蟲urllib的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python中幾個(gè)比較常見的名詞解釋

    Python中幾個(gè)比較常見的名詞解釋

    這篇文章主要介紹了Python中幾個(gè)比較常見的名詞解釋,本文解釋同樣適應(yīng)其它編程語(yǔ)言,本文講解了循環(huán)、迭代、遞歸、遍歷等名詞的含義,需要的朋友可以參考下
    2015-07-07
  • Python Flask自定義URL路由參數(shù)過濾器的方法詳解

    Python Flask自定義URL路由參數(shù)過濾器的方法詳解

    Flask是一個(gè)輕量級(jí)的Python Web應(yīng)用框架,它允許開發(fā)者以一種簡(jiǎn)潔明了的方式來(lái)構(gòu)建Web應(yīng)用,Flask自定義URL的主要功能在于使得開發(fā)者能夠通過簡(jiǎn)單的路由規(guī)則來(lái)自定義應(yīng)用程序的URL結(jié)構(gòu),本文給大家介紹了Python Flask自定義URL路由參數(shù)過濾器的方法,需要的朋友可以參考下
    2024-07-07
  • Python 實(shí)現(xiàn)Serial 與STM32J進(jìn)行串口通訊

    Python 實(shí)現(xiàn)Serial 與STM32J進(jìn)行串口通訊

    今天小編就為大家分享一篇Python 實(shí)現(xiàn)Serial 與STM32J進(jìn)行串口通訊,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2019-12-12
  • linux下安裝python3和對(duì)應(yīng)的pip環(huán)境教程詳解

    linux下安裝python3和對(duì)應(yīng)的pip環(huán)境教程詳解

    這篇文章主要介紹了linux下安裝python3和對(duì)應(yīng)的pip環(huán)境,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python 示例分享---邏輯推理編程解決八皇后

    python 示例分享---邏輯推理編程解決八皇后

    八皇后問題,是一個(gè)古老而著名的問題,是回溯算法的典型案例。該問題是國(guó)際西洋棋棋手馬克斯·貝瑟爾于1848年提出:在8X8格的國(guó)際象棋上擺放八個(gè)皇后,使其不能互相攻擊,即任意兩個(gè)皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法。
    2014-07-07
  • django中使用Celery 布式任務(wù)隊(duì)列過程詳解

    django中使用Celery 布式任務(wù)隊(duì)列過程詳解

    這篇文章主要介紹了django中使用Celery 布式任務(wù)隊(duì)列實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python中使用__new__實(shí)現(xiàn)單例模式并解析

    Python中使用__new__實(shí)現(xiàn)單例模式并解析

    單例模式是一個(gè)經(jīng)典設(shè)計(jì)模式,簡(jiǎn)要的說(shuō),一個(gè)類的單例模式就是它只能被實(shí)例化一次,實(shí)例變量在第一次實(shí)例化時(shí)就已經(jīng)固定。 這篇文章主要介紹了Python中使用__new__實(shí)現(xiàn)單例模式并解析 ,需要的朋友可以參考下
    2019-06-06
  • Python 實(shí)現(xiàn)將數(shù)組/矩陣轉(zhuǎn)換成Image類

    Python 實(shí)現(xiàn)將數(shù)組/矩陣轉(zhuǎn)換成Image類

    今天小編就為大家分享一篇Python 實(shí)現(xiàn)將數(shù)組/矩陣轉(zhuǎn)換成Image類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-01-01
  • tensorflow如何繼續(xù)訓(xùn)練之前保存的模型實(shí)例

    tensorflow如何繼續(xù)訓(xùn)練之前保存的模型實(shí)例

    今天小編就為大家分享一篇tensorflow如何繼續(xù)訓(xùn)練之前保存的模型實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-01-01
  • Python Web編程之WSGI協(xié)議簡(jiǎn)介

    Python Web編程之WSGI協(xié)議簡(jiǎn)介

    這篇文章主要介紹了Python Web編程之WSGI協(xié)議,簡(jiǎn)單說(shuō)明了WSGI的概念、功能并結(jié)合實(shí)例形式分析了Gunicorn和uWSGI相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-07-07

最新評(píng)論

平远县| 稷山县| 云霄县| 策勒县| 大连市| 南城县| 阿勒泰市| 偃师市| 镇巴县| 株洲县| 自贡市| 盐亭县| 布尔津县| 建湖县| 樟树市| 海伦市| 桦南县| 台中县| 铁岭市| 黑山县| 江华| 类乌齐县| 沁阳市| 海宁市| 湾仔区| 宾川县| 博乐市| 绿春县| 读书| 临海市| 张北县| 易门县| 吴江市| 巫溪县| 博罗县| 收藏| 新宁县| 新干县| 措美县| 共和县| 龙井市|