python爬蟲之urllib庫(kù)常用方法用法總結(jié)大全
Urllib
官方文檔地址:https://docs.python.org/3/library/urllib.html
urllib提供了一系列用于操作URL的功能。
本文主要介紹的是關(guān)于python urllib庫(kù)常用方法用法的相關(guān)內(nèi)容,下面話不多說了,來一起看看詳細(xì)的介紹吧
1、讀取cookies
import http.cookiejar as cj,urllib.request as request cookie = cj.CookieJar() handler = request.HTTPCookieProcessor(cookie) opener = request.build_opener(handler) response = opener.open('http://www.bigdata17.com') for item in cookie: print(item.name + "=" + item.value)
2、將cookies保存在文件中
filename = 'baidu_cookies.txt' cookies = cj.MozillaCookieJar(filename) handler = request.HTTPCookieProcessor(cookies) opener = request.build_opener(handler) response = opener.open('http://www.baidu.com') cookies.save(ignore_discard=True,ignore_expires=True)
3、處理異常
URLError和HTTPError類,兩個(gè)類是父子關(guān)系,HTTPError會(huì)返回錯(cuò)誤代碼,兩個(gè)類都可以處理request模塊產(chǎn)生的異常,這兩個(gè)都有一個(gè)reason屬性,用于記錄出現(xiàn)異常的原因
URLError處理異常:
from urllib import request,error try: response = request.urlopen('http://www.bigdata17.com/index.htm') except error.URLError as e: print(e.reason)
HTTPError處理異常:
這個(gè)類是專門處理http請(qǐng)求的異常,http請(qǐng)求會(huì)返回一個(gè)請(qǐng)求代碼,因此HTTPError會(huì)有一個(gè)code屬性。另外HTTP請(qǐng)求會(huì)有包含請(qǐng)求頭信息,所以HTTPError還包含一個(gè)headers屬性。HTTPError繼承自URLError類,因此也包含有reason屬性。
代碼:
try: response = request.urlopen('http://www.bigdata17.com/index.htm') except error.HTTPError as e: print(e.reason) print(e.code) print(e.headers)
4、解析鏈接
urllib庫(kù)中的parse類提供了很多用于解析鏈接的方法。
urlparse()方法是專門用于解析鏈接的,我們先看這個(gè)方法的返回值:
from urllib.parse import urlparse result = urlparse('http://www.bigdata17.com') print(result)
上面的代碼返回的結(jié)果:
ParseResult(scheme='http', netloc='www.bigdata17.com', path='', params='', query='', fragment='')
可見urlparse()方法返回的是ParseResult類,這個(gè)了有6個(gè)屬性,分別是scheme、netloc、path、params、query和fragment。其中scheme代表的是協(xié)議,有http,https,ftp等協(xié)議類型。netloc是網(wǎng)站域名,path是要訪問的網(wǎng)頁(yè)名稱。params是代表參數(shù)。query查詢參數(shù),fragment是錨點(diǎn)。
urlparse()方法是如何將一個(gè)鏈接映射到上面的6個(gè)參數(shù)中呢?
繼續(xù)看下一段代碼:
from urllib.parse import urlparse result = urlparse('http://www.bigdata17.com/22.html;user=bigdata17?id=10#content') print(result)
運(yùn)行的結(jié)果如下:
ParseResult(scheme='http', netloc='www.bigdata17.com', path='/22.html', params='user=bigdata17', query='id=10', fragment='content')
可見從鏈接開始為://止,是scheme。從://開始到一個(gè)/位置,是netloc域名。從/開始到;分號(hào)為止是path,訪問頁(yè)面的路徑。;開始到?為止是params參數(shù)。從?問號(hào)開始到#井號(hào)結(jié)束時(shí)query查詢參數(shù)。最后是fragment錨點(diǎn)參數(shù)。
5、urlopen()方法
該方法返回的是HTTPResponse對(duì)象:
import urllib.request as request response = request.urlopen('http://www.bigdata17.com') print(response) <http.client.HTTPResponse object at 0x000002A9655BBF28>
HTTPResponse對(duì)象有read(),getheaders()等方法。
通過read()方法可以讀取網(wǎng)頁(yè)的信息:
import urllib.request as request response = request.urlopen('http://www.bigdata17.com') print(response.read().decode('utf-8'))
使用該方法時(shí)要注意網(wǎng)站使用的編碼格式,配合decode()方法一起使用,否則會(huì)出現(xiàn)亂碼。像百度用的是utf-8,網(wǎng)易用的是gbk。
getHeaders()方法返回的是網(wǎng)頁(yè)的頭信息:
import urllib.request as request response = request.urlopen('http://www.bigdata17.com') print(response.getheaders())
結(jié)果:
[('Server', 'nginx/1.12.2'), ('Date', 'Mon, 12 Nov 2018 15:45:22 GMT'), ('Content-Type', 'text/html'), ('Content-Length', '38274'), ('Last-Modified', 'Thu, 08 Nov 2018 00:35:52 GMT'), ('Connection', 'close'), ('ETag', '"5be384e8-9582"'), ('Accept-Ranges', 'bytes')]
繼續(xù)看urlopen()方法有哪些參數(shù):
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
其中url是必須傳遞的參數(shù),其他的參數(shù)不是必須傳遞的。data用于將數(shù)據(jù)傳輸?shù)轿覀円廊〉木W(wǎng)站上,例如用戶名、密碼、驗(yàn)證碼等。timeout是設(shè)置請(qǐng)求超時(shí)時(shí)間。
data參數(shù)的用法:
>>> import urllib.parse as parse >>> import urllib.request as request >>> data = bytes(parse.urlencode({'username': 'bigdata17'}), encoding='utf8') >>> print(data) b'username=bigdata17' >>> response = request.urlopen('http://httpbin.org/post', data=data) >>> print(response.read()) b'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "username ": "bigdata17"\n }, \n "headers": {\n "Accept-Encoding": "identity", \n "Connection": "close", \n "Content-Length": "18", \n "Content-Type": "appl ication/x-www-form-urlencoded", \n "Host": "httpbin.org", \n "User-Agent": "Python-urllib/3.7"\n }, \n "json": null, \n "origin": "183.134.52.58", \n "url": "http://httpbin.org/post"\n}\n'
使用data傳輸數(shù)據(jù)時(shí),必須將urlencode方法將data的數(shù)據(jù)轉(zhuǎn)換為bytes類型。
在使用urlopen方法時(shí),如果不使用data參數(shù),則使用的get方式傳送數(shù)據(jù),如果使用了data參數(shù),則是以post的方式傳送數(shù)據(jù)。post的方式必須保證要爬取的網(wǎng)站上有相應(yīng)的方法(上面代碼要爬取的網(wǎng)址是http://httpbin.org/post,post就是要處理我們通過data參數(shù)傳輸數(shù)據(jù)的方法),否則會(huì)報(bào)urllib.error.HTTPError: HTTP Error 404: NOT FOUND的錯(cuò)誤。
timeout參數(shù)的用法:
該參數(shù)是用于設(shè)置請(qǐng)求超時(shí)時(shí)間,免得出現(xiàn)網(wǎng)絡(luò)故障或服務(wù)器異常時(shí)我們的爬蟲程序長(zhǎng)時(shí)間等:
import urllib.request as request response = request.urlopen('http://www.bigdata17.com', timeout=1) print(response.read())
如果將timeout設(shè)置為0.01,則會(huì)報(bào)如下的錯(cuò)誤:
socket.timeout: timed out
During handling of the above exception, another exception
設(shè)置請(qǐng)求頭信息:
請(qǐng)求的頭信息一般對(duì)帶有瀏覽器的信息,很多網(wǎng)站根據(jù)請(qǐng)求頭信息來判斷該請(qǐng)求是正常的瀏覽器發(fā)起的還是由爬蟲發(fā)起的。設(shè)置爬蟲頭信息方法:
from urllib import request, parse url = 'http://httpbin.org/post' headers = { 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)', 'Host': 'httpbin.org' } dict = { 'name': 'bigdata17' } data = bytes(parse.urlencode(dict), encoding='utf8') req = request.Request(url=url, data=data, headers=headers, method='POST') response = request.urlopen(req) print(response.read().decode('utf-8'))
設(shè)置代理:
如果一個(gè)ip過于頻繁的訪問某一個(gè)網(wǎng)站時(shí),根據(jù)反爬蟲措施,會(huì)限制該IP的訪問。我們可以通過urllib提供的ProxyHandler方法來設(shè)置代理:
import urllib.request proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.bigdata17.com:3128/'}) proxy_auth_handler = urllib.request.ProxyBasicAuthHandler() proxy_auth_handler.add_password('realm', 'host', 'username', 'password') opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler) # This time, rather than install the OpenerDirector, we use it directly: opener.open('https://accounts.douban.com/login?alias=&redir=https%3A%2F%2Fwww.douban.com%2F&source=index_nav&error=1001')
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
使用Pytorch Geometric進(jìn)行鏈接預(yù)測(cè)的實(shí)現(xiàn)代碼
PyTorch Geometric (PyG)是構(gòu)建圖神經(jīng)網(wǎng)絡(luò)模型和實(shí)驗(yàn)各種圖卷積的主要工具,在本文中我們將通過鏈接預(yù)測(cè)來對(duì)其進(jìn)行介紹,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2023-10-10pytorch實(shí)現(xiàn)ResNet結(jié)構(gòu)的實(shí)例代碼
ResNet網(wǎng)絡(luò)可以達(dá)到很深的層數(shù)的原因就是不斷的堆疊殘差結(jié)構(gòu)而來的,接下來通過本文給大家介紹pytorch實(shí)現(xiàn)ResNet結(jié)構(gòu)的示例代碼,喜歡的朋友跟隨小編一起看看吧2021-05-05Python執(zhí)行ping操作的簡(jiǎn)單方法
本文主要介紹了Python執(zhí)行ping操作的簡(jiǎn)單方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Python中多繼承與菱形繼承問題的解決方案與實(shí)踐
在Python這個(gè)靈活且功能強(qiáng)大的編程語(yǔ)言中,多繼承是一個(gè)既強(qiáng)大又復(fù)雜的概念,它允許一個(gè)類繼承自多個(gè)父類,從而能夠復(fù)用多個(gè)父類的屬性和方法,本文將深入解釋Python中的多繼承概念,詳細(xì)剖析菱形繼承問題,并探討Python是如何解決這一難題的,需要的朋友可以參考下2024-07-07python實(shí)現(xiàn)每天自動(dòng)簽到領(lǐng)積分的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)每天自動(dòng)簽到領(lǐng)積分的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Pycharm直接使用遠(yuǎn)程服務(wù)器代碼并調(diào)試的解決方法
這篇文章主要介紹了Pycharm直接使用遠(yuǎn)程服務(wù)器代碼并調(diào)試的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02numpy.std() 計(jì)算矩陣標(biāo)準(zhǔn)差的方法
今天小編就為大家分享一篇numpy.std() 計(jì)算矩陣標(biāo)準(zhǔn)差的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07Python進(jìn)度條神器tqdm使用實(shí)例詳解
Python進(jìn)度條神器tqdm是一個(gè)快速、可擴(kuò)展的進(jìn)度條工具,可以輕松地為Python腳本添加進(jìn)度條。它可以在循環(huán)中自動(dòng)計(jì)算進(jìn)度,并在終端中顯示進(jìn)度條,讓用戶了解程序的運(yùn)行情況。tqdm還支持多線程和多進(jìn)程,并且可以自定義進(jìn)度條的樣式和顯示方式。2023-06-06