Python2/3中urllib庫的一些常見用法
什么是Urllib庫
Urllib是Python提供的一個用于操作URL的模塊,我們爬取網(wǎng)頁的時候,經(jīng)常需要用到這個庫。
升級合并后,模塊中的包的位置變化的地方較多。
urllib庫對照速查表
Python2.X |
Python3.X |
urllib |
urllib.request, urllib.error, urllib.parse |
urllib2 |
urllib.request, urllib.error |
urllib2.urlopen |
urllib.request.urlopen |
urllib.urlencode |
urllib.parse.urlencode |
urllib.quote |
urllib.request.quote |
urllib2.Request |
urllib.request.Request |
urlparse |
urllib.parse |
urllib.urlretrieve |
urllib.request.urlretrieve |
urllib2.URLError |
urllib.error.URLError |
cookielib.CookieJar |
http.CookieJar |
urllib庫是用于操作URL,爬取頁面的python第三方庫,同樣的庫還有requests、httplib2。
在Python2.X中,分urllib和urllib2,但在Python3.X中,都統(tǒng)一合并到urllib中。通過上表可以看到其中常見的變動,依據(jù)該變動可快速寫出相應(yīng)版本的python程序。
相對來說,Python3.X對中文的支持比Python2.X友好,所以該博客接下來通過Python3.X來介紹urllib庫的一些常見用法。
發(fā)送請求
import urllib.request r = urllib.request.urlopen(http://www.python.org/)
首先導(dǎo)入urllib.request
模塊,使用urlopen()
對參數(shù)中的URL發(fā)送請求,返回一個http.client.HTTPResponse
對象。
在urlopen()
中,使用timeout字段,可設(shè)定相應(yīng)的秒數(shù)時間之后停止等待響應(yīng)。除此之外,還可使用r.info()
、r.getcode()
、r.geturl()
獲取相應(yīng)的當前環(huán)境信息、狀態(tài)碼、當前網(wǎng)頁URL。
讀取響應(yīng)內(nèi)容
import urllib.request url = "http://www.python.org/" with urllib.request.urlopen(url) as r: r.read()
使用r.read()
讀取響應(yīng)內(nèi)容到內(nèi)存,該內(nèi)容為網(wǎng)頁的源代碼(可用相應(yīng)的瀏覽器“查看網(wǎng)頁源代碼”功能看到),并可對返回的字符串進行相應(yīng)解碼decode()
。
傳遞URL參數(shù)
import urllib.request import urllib.parse params = urllib.parse.urlencode({'q': 'urllib', 'check_keywords': 'yes', 'area': 'default'}) url = "https://docs.python.org/3/search.html?{}".format(params) r = urllib.request.urlopen(url)
以字符串字典的形式,通過urlencode()
編碼,為URL的查詢字符串傳遞數(shù)據(jù),
編碼后的params為字符串,字典每項鍵值對以'&'連接:'q=urllib&check_keywords=yes&area=default'
構(gòu)建后的URL:https://docs.python.org/3/search.html?q=urllib&check_keywords=yes&area=default
當然,urlopen()
支持直接構(gòu)建的URL,簡單的get請求可以不通過urlencode()
編碼,手動構(gòu)建后直接請求。上述方法使代碼模塊化,更優(yōu)雅。
傳遞中文參數(shù)
import urllib.request searchword = urllib.request.quote(input("請輸入要查詢的關(guān)鍵字:")) url = "https://cn.bing.com/images/async?q={}&first=0&mmasync=1".format(searchword) r = urllib.request.urlopen(url)
該URL是利用bing圖片接口,查詢關(guān)鍵字q的圖片。如果直接將中文傳入URL中請求,會導(dǎo)致編碼錯誤。我們需要使用quote()
,對該中文關(guān)鍵字進行URL編碼,相應(yīng)的可以使用unquote()
進行解碼。
定制請求頭
import urllib.request url = 'https://docs.python.org/3/library/urllib.request.html' headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36', 'Referer': 'https://docs.python.org/3/library/urllib.html' } req = urllib.request.Request(url, headers=headers) r = urllib.request.urlopen(req)
有時爬取一些網(wǎng)頁時,會出現(xiàn)403錯誤(Forbidden),即禁止訪問。這是因為網(wǎng)站服務(wù)器對訪問者的Headers屬性進行身份驗證,例如:通過urllib庫發(fā)送的請求,默認以”Python-urllib/X.Y”作為User-Agent,其中X為Python的主版本號,Y為副版本號。所以,我們需要通過urllib.request.Request()
構(gòu)建Request對象,傳入字典形式的Headers屬性,模擬瀏覽器。
相應(yīng)的Headers信息,可通過瀏覽器的開發(fā)者調(diào)試工具,”檢查“功能的”Network“標簽查看相應(yīng)的網(wǎng)頁得到,或使用抓包分析軟件Fiddler、Wireshark。
除上述方法外,還可以使用urllib.request.build_opener()
或req.add_header()
定制請求頭,詳見官方樣例。
在Python2.X中,urllib模塊和urllib2模塊通常一起使用,因為urllib.urlencode()
可以對URL參數(shù)進行編碼,而urllib2.Request()
可以構(gòu)建Request對象,定制請求頭,然后統(tǒng)一使用urllib2.urlopen()
發(fā)送請求。
傳遞POST請求
import urllib.request import urllib.parse url = 'https://passport.cnblogs.com/user/signin?' post = { 'username': 'xxx', 'password': 'xxxx' } postdata = urllib.parse.urlencode(post).encode('utf-8') req = urllib.request.Request(url, postdata) r = urllib.request.urlopen(req)
我們在進行注冊、登錄等操作時,會通過POST表單傳遞信息。
這時,我們需要分析頁面結(jié)構(gòu),構(gòu)建表單數(shù)據(jù)post,使用urlencode()
進行編碼處理,返回字符串,再指定'utf-8'的編碼格式,這是因為POSTdata只能是bytes或著file object。最后通過Request()
對象傳遞postdata,使用urlopen()
發(fā)送請求。
下載遠程數(shù)據(jù)到本地
import urllib.request url = "https://www.python.org/static/img/python-logo.png" urllib.request.urlretrieve(url, "python-logo.png")
爬取圖片、視頻等遠程數(shù)據(jù)時,可使用urlretrieve()
下載到本地。
第一個參數(shù)為要下載的url,第二個參數(shù)為下載后的存放路徑。
該樣例下載python官網(wǎng)logo到當前目錄下,返回元組(filename, headers)。
設(shè)置代理IP
import urllib.request url = "https://www.cnblogs.com/" proxy_ip = "180.106.16.132:8118" proxy = urllib.request.ProxyHandler({'http': proxy_ip}) opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler) urllib.request.install_opener(opener) r = urllib.request.urlopen(url)
有時頻繁的爬取一個網(wǎng)頁,會被網(wǎng)站服務(wù)器屏蔽IP。這時,可通過上述方法設(shè)置代理IP。
首先,通過網(wǎng)上代理IP的網(wǎng)站找一個可以用的IP,構(gòu)建ProxyHandler()
對象,將'http'和代理IP以字典形式作為參數(shù)傳入,設(shè)置代理服務(wù)器信息。再構(gòu)建opener對象,將proxy和HTTPHandler類傳入。通過installl_opener()
將opener設(shè)置成全局,當用urlopen()
發(fā)送請求時,會使用之前設(shè)置的信息來發(fā)送相應(yīng)的請求。
異常處理
import urllib.request import urllib.error url = "http://www.balabalabala.org" try: r = urllib.request.urlopen(url) except urllib.error.URLError as e: if hasattr(e, 'code'): print(e.code) if hasattr(e, 'reason'): print(e.reason)
可以使用URLError類,處理一些URL相關(guān)異常。導(dǎo)入urllib.error
,捕獲URLError異常后,因為只有發(fā)生HTTPError異常(URLError子類)時,才會有異常狀態(tài)碼e.code,所以需要判斷異常是否有屬性code。
Cookie的使用
import urllib.request import http.cookiejar url = "http://www.balabalabala.org/" cjar = http.cookiejar.CookieJar() opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar)) urllib.request.install_opener(opener) r = urllib.request.urlopen(url)
通過無狀態(tài)協(xié)議HTTP訪問網(wǎng)頁時,Cookie維持會話間的狀態(tài)。例如:有些網(wǎng)站需要登錄操作,第一次可通過提交POST表單來登錄,當爬取該網(wǎng)站下的其它站點時,可以使用Cookie來保持登錄狀態(tài),而不用每次都通過提交表單來登錄。
首先,構(gòu)建CookieJar()
對象cjar,再使用HTTPCookieProcessor()
處理器,處理cjar,并通過build_opener()
構(gòu)建opener對象,設(shè)置成全局,通過urlopen()
發(fā)送請求。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
- Python urlopen()和urlretrieve()用法解析
- python enumerate內(nèi)置函數(shù)用法總結(jié)
- Python常用模塊sys,os,time,random功能與用法實例分析
- Python數(shù)據(jù)分析中Groupby用法之通過字典或Series進行分組的實例
- Python標準模塊--ContextManager上下文管理器的具體用法
- Python實現(xiàn)的插入排序算法原理與用法實例分析
- Python中super函數(shù)的用法
- 詳解Python map函數(shù)及Python map()函數(shù)的用法
- python ubplot使用方法解析
相關(guān)文章
Python使用ntplib庫同步校準當?shù)貢r間的方法
NTP網(wǎng)絡(luò)時間協(xié)議其實大家平時或多或少都能接觸到,包括Windows在內(nèi)的操作系統(tǒng)中的很多Internet時間同步功能都是在NTP的基礎(chǔ)上來做,這里我們來看一下Python使用ntplib庫同步校準當?shù)貢r間的方法2016-07-07小結(jié)Python用fork來創(chuàng)建子進程注意事項
今天看到別人的源代碼中有 fork 子進程來操作數(shù)據(jù)。但是由于 fork 之后,沒有及時的退出,導(dǎo)致系統(tǒng)中的Python進程越來越多,子進程越來越多了。2014-07-07使用Python和Pillow實現(xiàn)圖片馬賽克功能
在這篇博客中,我們將探討如何使用Python創(chuàng)建一個簡單而有趣的桌面應(yīng)用程序,我們的目標是構(gòu)建一個應(yīng)用,允許用戶選擇一張照片,然后在照片的右下角添加馬賽克效果,感興趣的小伙伴跟著小編一起來看看吧2024-08-08Python的GUI編程之Pack、Place、Grid的區(qū)別說明
這篇文章主要介紹了Python的GUI編程之Pack、Place、Grid的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06tensorflow卷積神經(jīng)Inception?V3網(wǎng)絡(luò)結(jié)構(gòu)代碼解析
這篇文章主要為大家介紹了卷積神經(jīng)Inception?V3網(wǎng)絡(luò)結(jié)構(gòu)代碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05