python爬蟲請求頁面urllib庫詳解
基本庫urllib
學(xué)習(xí)爬蟲,最初的操作便是模擬瀏覽器向服務(wù)端發(fā)出請求,這里我們就學(xué)習(xí)使用urlib庫的用法
使用urllib
首先,我們需要了解urllib庫,它是python內(nèi)置的HTTP請求庫,也就是說不需要額外安裝即可使用,它包含4個(gè)模塊
- request:它是最基本的HTTP請求模塊,可以用來模擬發(fā)送請求。
- error:異常處理模塊。
- parse:一個(gè)工具模塊,提供了許多URL處理方法。
- robotparser:主要時(shí)用來識別網(wǎng)站的robot.txt文件然后判斷那些網(wǎng)站是否可以爬。
發(fā)送請求
urllib.request模塊提供了最基本的構(gòu)造HTTP請求的方法,urllib.request.urlopen(),若在獲取請求對象時(shí),不需要過多的參數(shù)傳遞,可以直接選擇urllib.request.urlopen();
如果需要加入Headers等信息請求則使用urllib.request.Request()。
1.urlopen()
這里我們以www.baidu.com為例,把這個(gè)網(wǎng)頁抓取下來. 代碼如下:
import urllib.request response = urllib.request.urlopen('http://www.baidu.com') print(response.read().decode('utf-8'))
添加data(附加數(shù)據(jù))參數(shù)
data參數(shù)是可選的。如果要添加該參數(shù),需要使用bytes()方法將參數(shù)轉(zhuǎn)化為bytes類型。
另外,如果傳遞了這個(gè)參數(shù),則它的請求方式就不再是GET方式,而是POST方式。
實(shí)例:
import urllib.request import urllib.parse data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf-8') response = urllib.request.urlopen('http://httpbin.org/post', data=data) print(response.read())
我們傳遞的參數(shù)出現(xiàn)在了form字段中,這表明是模擬了以表單提交的方式,以POST方式傳輸數(shù)據(jù),這里的 //httpbin.org是一個(gè)提供HTTP請求測試的站點(diǎn)。
添加timeout(超時(shí)時(shí)間)參數(shù)
timeout參數(shù)用于設(shè)置超時(shí)時(shí)間,單位為s,如果請求超出了設(shè)置的這個(gè)時(shí)間還未響應(yīng),就會拋出異常。 實(shí)例:
import urllib.request response = urllib.request.urlopen('http://httpbin.org/post', timeout=1) print(response.read())
在爬取頁面的過程中,若一個(gè)頁面長時(shí)間無法響應(yīng)將導(dǎo)致后續(xù)工作無法進(jìn)行,所以設(shè)置timeout超時(shí)時(shí)間很有必要。
2.Request()
實(shí)例:
import urllib.request request = urllib.request.Request('https://www.baidu.com') response = urllib.request.urlopen(request) print(response.read().decode('utf-8'))
Request的構(gòu)造方法如下:
class urllib.request.Request(url,date=None,headers={},origin_req_host=None,unverifiable=False,method=None)
Request參數(shù)
- url 第一個(gè)參數(shù),必傳參數(shù),其他都是可選參數(shù)。
- data 第二個(gè)參數(shù),如果要傳,必須傳bytes類型,如果是字典可先用urllib.parse模快里的urlencode()編碼。
- headers 第三個(gè)參數(shù),可以在構(gòu)造請求時(shí)通過header參數(shù)直接構(gòu)造,也可通過調(diào)用請求實(shí)例的add_header()方法添加。
- origin_req_host 第四個(gè)參數(shù)指的是請求方的host名稱或IP地址。
- unverifiable 第五個(gè)參數(shù)表示這個(gè)請求時(shí)否時(shí)無法驗(yàn)證的默認(rèn)時(shí)False,意思就是說用戶沒有足夠的權(quán)限來選擇接收這個(gè)請求的結(jié)果。
- methon 第六個(gè)參數(shù)是一個(gè)字符串,指示請求使用的方法,比如GET POST和PUT等。
多參數(shù)實(shí)例:
import urllib.request import urllib.parse url = 'http://httpbin.org/post' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', 'Host':'httpbin.org' } dict = { 'name': 'zhangsan' } data = bytes(urllib.parse.urlencode(dict), encoding='utf-8') request = urllib.request.Request(url, data=data, headers=headers, method='POST') response = urllib.request.urlopen(request) print(response.read().decode('utf-8'))
高級用法
1.驗(yàn)證
出現(xiàn)情景:有些網(wǎng)站在打開時(shí)就會彈出提示框,提示你輸入用戶名和密碼,驗(yàn)證成功后才能查看頁面,如果要請求這樣的頁面,該怎么辦呢?借助HTTPBasicAuthHandler就可以完成。 代碼如下:
from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener from urllib.error import URLError username = '用戶名' password = '密碼' url = '你要請求的url' #構(gòu)建一個(gè)密碼管理對象,用來保存需要處理的用戶名和密碼 passwdmgr = HTTPPasswordMgrWithDefaultRealm() # 添加賬戶信息,第一個(gè)參數(shù)realm是與遠(yuǎn)程服務(wù)器相關(guān)的域信息,一般沒人管它都是寫None,后面三個(gè)參數(shù)分別是 代理服務(wù)器、用戶名、密碼 passwdmgr.add_password(None, url , username, password) auth_handler = HTTPBasicAuthHandler(passwdmgr) opener = build_opener(auth_handler) try: result = opener.open(url) html = result.read().decode('utf-8) print(html) except URLError as e: print(e.reason)
2.代理
添加代理
from urllib.error import URLError from urllib.request import ProxyHandler, build_opener proxy_handler = ProxyHandler({ 'http': 'http://127.0.0.1:9743', 'https': 'http://127.0.0.1:9743' }) opener = build_opener(proxy_handler) try: response = opener.open('https://www.baidu.com') print(response.read().decode('utf-8')) except URLError as e: print(e.reason)
3.Cookies
從網(wǎng)站中獲取Cookies
代碼:
import http.cookiejar import urllib.request 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)
為什么要獲取Cookies?
維持同一個(gè)對話。例如:你用post方式登入了某個(gè)網(wǎng)站,又使用了get方式來獲取網(wǎng)站個(gè)人頁面信息,這相當(dāng)于打開了兩個(gè)瀏覽器,是兩個(gè)會話,不能成功獲取個(gè)人信息。所以可以在get方式添加cookies參數(shù)來維持對話。
保存Cookies
將CookieJar換成MozillaCookieJar,它在生成文件時(shí)會用到,是CookieJar的子類,用來處理Cookie和文件相關(guān)的事件。 代碼:
import http.cookiejar import urllib.request filename = 'cookies.txt' cookie = http.cookiejar.MozillaCookieJar(filename) handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) response = opener.open('http://www.baidu.com') cookie.save(ignore_discard=True, ignore_expires=True)
運(yùn)行之后,可以發(fā)現(xiàn)項(xiàng)目文件夾中生成了一個(gè)cookies.txt文件,另外LWPCookieJar可以保存LWP格式的Cookies文件。
如果想獲取更多高級用法,可查看官方文檔
處理異常
為何要處理異常? 在請求過程中,可能會出現(xiàn)多種多樣的錯(cuò)誤,如果 爬取多個(gè)頁面,其中一個(gè)頁面出現(xiàn)錯(cuò)誤會使程序報(bào)錯(cuò)而終止運(yùn)行,所以異常處理是十分有必要的。這里我們學(xué)習(xí)處理HTTP請求錯(cuò)誤異常。
HTTPError
屬性:
code:返回HTTP狀態(tài)碼
reason:返回錯(cuò)誤原因
headers:返回請求頭
實(shí)例:
import urllib.error import urllib.request try: response = urllib.request.urlopen('https://www.baidu.com', timeout=0.01) except urllib.error.HTTPError as e: print(e.reason, e.code, e.headers, sep='\n')
這里為了實(shí)現(xiàn)異常將超時(shí)間設(shè)置為0.01,拋出了time out異常。
解析鏈接
為什么要解析鏈接?
當(dāng)你在爬取網(wǎng)頁時(shí),可能會需要搜索此網(wǎng)頁的其他信息。這時(shí)就需要解析鏈接,構(gòu)造鏈接。
URL由6個(gè)部分構(gòu)成: (://)符號前的是協(xié)議scheme,第一個(gè)/符號前是域名netloc,后面是path路徑,分號(;)后面是參數(shù)params,問號(?)后面是查詢條件query,一般用作GET類型的URL,井號(#)后面是錨點(diǎn),用于直接定位頁面內(nèi)部下拉位置。
標(biāo)準(zhǔn)鏈接格式: scheme://netloc/path;params?query#fragment
urlparse()
該方法可以實(shí)現(xiàn)URL的識別和分段
參數(shù):
urlstring:這是必填項(xiàng)。待解析的URL。
scheme:默認(rèn)協(xié)議。
allow_fragments:是否忽略fragment。如果被設(shè)置為False,fragment部分就會被忽略,被解析為path,parameters,query的一部分。
實(shí)例:
from urllib.parse import urlparse result = urlparse('https://docs.python.org/3/library/urllib.request.html#urllib.request.OpenerDirector') print(type(result), result)
到此這篇關(guān)于python爬蟲請求頁面urlib庫詳解的文章就介紹到這了,更多相關(guān)python爬蟲urlib庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python字符串字母大小寫轉(zhuǎn)換的各種情況詳析
在使用python語言開發(fā)中經(jīng)常會碰到,需要大寫轉(zhuǎn)小寫,小寫轉(zhuǎn)換大寫,甚至字符串中的單詞首字母大寫,以及字符串手字字母大寫的問題,下面這篇文章主要給大家介紹了關(guān)于Python字符串字母大小寫轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下2022-05-05Python中WatchDog的使用經(jīng)驗(yàn)總結(jié)
在?python?中文件監(jiān)視主要有兩個(gè)庫,一個(gè)是?pyinotify,一個(gè)是?watchdog,本文主要為大家詳細(xì)介紹一下Python中WatchDog的使用相關(guān)經(jīng)驗(yàn),感興趣的小伙伴可以了解下2023-12-12python實(shí)現(xiàn)時(shí)間序列自相關(guān)圖(acf)、偏自相關(guān)圖(pacf)教程
這篇文章主要介紹了python實(shí)現(xiàn)時(shí)間序列自相關(guān)圖(acf)、偏自相關(guān)圖(pacf)教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python?threading和Thread模塊及線程的實(shí)現(xiàn)
這篇文章主要介紹了Python?threading和Thread模塊及線程的實(shí)現(xiàn),Python通過兩個(gè)標(biāo)準(zhǔn)庫thread和threading提供對線程的支持,threading對thread進(jìn)行了封裝,具體實(shí)現(xiàn)介紹需要的朋友可以參考一下下面文章內(nèi)容2022-06-06時(shí)間序列預(yù)測中的數(shù)據(jù)滑窗操作實(shí)例(python實(shí)現(xiàn))
滑動窗口操作非常普遍,非常有用,它們也很容易在Python中實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于時(shí)間序列預(yù)測中的數(shù)據(jù)滑窗操作python實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2022-03-03Python數(shù)據(jù)庫的連接實(shí)現(xiàn)方法與注意事項(xiàng)
這篇文章主要介紹了Python數(shù)據(jù)庫的連接實(shí)現(xiàn)方法與注意事項(xiàng),需要的朋友可以參考下2016-02-02python字典根據(jù)key排序的實(shí)現(xiàn)
本文主要介紹了python字典根據(jù)key排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01