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

Python2.X/Python3.X中urllib庫區(qū)別講解

 更新時(shí)間:2017年12月19日 14:01:41   作者:返回主頁 sherlockChen  
本篇文章通過對比給大家詳細(xì)講解了在Python2和Python3中urllib庫區(qū)別以及用法講解,有需要的朋友跟著學(xué)習(xí)下吧。

本文介紹urllib庫在不同版本的Python中的變動(dòng),并以Python3.X講解urllib庫的相關(guān)用法。

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中。通過上表可以看到其中常見的變動(dòng),依據(jù)該變動(dòng)可快速寫出相應(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ā)送請求,返回一個(gè)http.client.HTTPResponse對象。

在urlopen()中,使用timeout字段,可設(shè)定相應(yīng)的秒數(shù)時(shí)間之后停止等待響應(yīng)。除此之外,還可使用r.info()、r.getcode()、r.geturl()獲取相應(yīng)的當(dāng)前環(huán)境信息、狀態(tài)碼、當(dāng)前網(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)頁源代碼”功能看到),并可對返回的字符串進(jìn)行相應(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為字符串,字典每項(xiàng)鍵值對以'&'連接:'q=urllib&check_keywords=yes&area=default'

構(gòu)建后的URL:https://docs.python.org/3/search.html?q=urllib&check_keywords=yes&area=default

當(dāng)然,urlopen()支持直接構(gòu)建的URL,簡單的get請求可以不通過urlencode()編碼,手動(dòng)構(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的圖片。如果直接將中文傳入U(xiǎn)RL中請求,會導(dǎo)致編碼錯(cuò)誤。我們需要使用quote(),對該中文關(guān)鍵字進(jìn)行URL編碼,相應(yīng)的可以使用unquote()進(jìn)行解碼。

定制請求頭

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)

有時(shí)爬取一些網(wǎng)頁時(shí),會出現(xiàn)403錯(cuò)誤(Forbidden),即禁止訪問。這是因?yàn)榫W(wǎng)站服務(wù)器對訪問者的Headers屬性進(jìn)行身份驗(yàn)證,例如:通過urllib庫發(fā)送的請求,默認(rèn)以”Python-urllib/X.Y”作為User-Agent,其中X為Python的主版本號,Y為副版本號。所以,我們需要通過urllib.request.Request()構(gòu)建Request對象,傳入字典形式的Headers屬性,模擬瀏覽器。

相應(yīng)的Headers信息,可通過瀏覽器的開發(fā)者調(diào)試工具,”檢查“功能的”Network“標(biāo)簽查看相應(yīng)的網(wǎng)頁得到,或使用抓包分析軟件Fiddler、Wireshark。

除上述方法外,還可以使用urllib.request.build_opener()或req.add_header()定制請求頭,詳見官方樣例。

在Python2.X中,urllib模塊和urllib2模塊通常一起使用,因?yàn)閡rllib.urlencode()可以對URL參數(shù)進(jìn)行編碼,而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)

我們在進(jìn)行注冊、登錄等操作時(shí),會通過POST表單傳遞信息。

這時(shí),我們需要分析頁面結(jié)構(gòu),構(gòu)建表單數(shù)據(jù)post,使用urlencode()進(jìn)行編碼處理,返回字符串,再指定'utf-8'的編碼格式,這是因?yàn)镻OSTdata只能是bytes或著file object。最后通過Request()對象傳遞postdata,使用urlopen()發(fā)送請求。

下載遠(yuǎn)程數(shù)據(jù)到本地

import urllib.request
url = "https://www.python.org/static/img/python-logo.png"
urllib.request.urlretrieve(url, "python-logo.png")

爬取圖片、視頻等遠(yuǎn)程數(shù)據(jù)時(shí),可使用urlretrieve()下載到本地。

第一個(gè)參數(shù)為要下載的url,第二個(gè)參數(shù)為下載后的存放路徑。

該樣例下載python官網(wǎng)logo到當(dāng)前目錄下,返回元組(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)

有時(shí)頻繁的爬取一個(gè)網(wǎng)頁,會被網(wǎng)站服務(wù)器屏蔽IP。這時(shí),可通過上述方法設(shè)置代理IP。

首先,通過網(wǎng)上代理IP的網(wǎng)站找一個(gè)可以用的IP,構(gòu)建ProxyHandler()對象,將'http'和代理IP以字典形式作為參數(shù)傳入,設(shè)置代理服務(wù)器信息。再構(gòu)建opener對象,將proxy和HTTPHandler類傳入。通過installl_opener()將opener設(shè)置成全局,當(dāng)用urlopen()發(fā)送請求時(shí),會使用之前設(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異常后,因?yàn)橹挥邪l(fā)生HTTPError異常(URLError子類)時(shí),才會有異常狀態(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)頁時(shí),Cookie維持會話間的狀態(tài)。例如:有些網(wǎng)站需要登錄操作,第一次可通過提交POST表單來登錄,當(dāng)爬取該網(wǎng)站下的其它站點(diǎn)時(shí),可以使用Cookie來保持登錄狀態(tài),而不用每次都通過提交表單來登錄。

首先,構(gòu)建CookieJar()對象cjar,再使用HTTPCookieProcessor()處理器,處理cjar,并通過build_opener()構(gòu)建opener對象,設(shè)置成全局,通過urlopen()發(fā)送請求。

相關(guān)文章

  • 兒童編程python入門

    兒童編程python入門

    很多家長都想讓孩子學(xué)習(xí)編程,今天我們給大家分享一下關(guān)于兒童python的入門以及簡單的代碼,有興趣的朋友閱讀下吧。
    2018-05-05
  • Python基礎(chǔ)之語法錯(cuò)誤和異常詳解

    Python基礎(chǔ)之語法錯(cuò)誤和異常詳解

    Python有兩種錯(cuò)誤很容易辨認(rèn):語法錯(cuò)誤和異常.本文就給大家詳細(xì)介紹一下Python錯(cuò)誤和異常,對正在學(xué)習(xí)python的小伙伴們很有幫助哦,需要的朋友可以參考下
    2021-05-05
  • python基于遞歸解決背包問題詳解

    python基于遞歸解決背包問題詳解

    這篇文章主要介紹了python基于遞歸解決背包問題,遞歸是個(gè)好東西,任何具有遞歸性質(zhì)的問題通過函數(shù)遞歸調(diào)用會變得很簡單。一個(gè)很復(fù)雜的問題,幾行代碼就能搞定,需要的朋友可以參考下
    2019-07-07
  • Python中os.path.join函數(shù)的用法示例詳解

    Python中os.path.join函數(shù)的用法示例詳解

    這篇文章主要給大家介紹了關(guān)于Python中os.path.join函數(shù)用法的相關(guān)資料,os.path.join函數(shù)是Python標(biāo)準(zhǔn)庫中的一個(gè)函數(shù),用于將多個(gè)路徑組合成一個(gè)有效的路徑,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • pandas的Series類型與基本操作詳解

    pandas的Series類型與基本操作詳解

    這篇文章主要介紹了pandas的Series類型與基本操作詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 詳解python中requirements.txt的一切

    詳解python中requirements.txt的一切

    最近學(xué)習(xí)到了python中的requirements.txt,或許是因?yàn)樘唵瘟耍W(wǎng)上沒有搜到比較完整的介紹,所以這篇文章主要介紹了關(guān)于python中requirements.txt的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • Python中的split()、rsplit()、splitlines()的區(qū)別解析

    Python中的split()、rsplit()、splitlines()的區(qū)別解析

    Python提供了三種字符串分割的方法:split()、rsplit()和splitlines(),本文主要通過案例介紹這三種字符串分割函數(shù)的區(qū)別,感興趣的朋友一起看看吧
    2023-12-12
  • Python實(shí)現(xiàn)PS濾鏡中馬賽克效果示例

    Python實(shí)現(xiàn)PS濾鏡中馬賽克效果示例

    這篇文章主要介紹了Python實(shí)現(xiàn)PS濾鏡中馬賽克效果,涉及Python基于skimage庫的圖形馬賽克效果相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-01-01
  • Pycharm新手教程(只需要看這篇就夠了)

    Pycharm新手教程(只需要看這篇就夠了)

    這篇文章主要介紹了Pycharm新手教程(只需要看這篇就夠了),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • python機(jī)器學(xué)習(xí)之決策樹分類詳解

    python機(jī)器學(xué)習(xí)之決策樹分類詳解

    這篇文章主要介紹了python機(jī)器學(xué)習(xí)之決策樹分類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論

宁都县| 峡江县| 泽库县| 清流县| 雅安市| 黎平县| 晋中市| 滦平县| 满洲里市| 普定县| 余庆县| 湛江市| 凤山县| 江门市| 郧西县| 桓台县| 定陶县| 双峰县| 西青区| 乐业县| 桂阳县| 大兴区| 兴义市| 响水县| 镇雄县| 甘肃省| 曲靖市| 永定县| 芒康县| 墨竹工卡县| 珲春市| 道真| 枣阳市| 拜城县| 德安县| 辛集市| 彰武县| 东至县| 厦门市| 永安市| 淮安市|