欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

本文介紹urllib庫在不同版本的Python中的變動,并以Python3.X講解urllib庫的相關用法。

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中。通過上表可以看到其中常見的變動,依據該變動可快速寫出相應版本的python程序。

相對來說,Python3.X對中文的支持比Python2.X友好,所以該博客接下來通過Python3.X來介紹urllib庫的一些常見用法。

發(fā)送請求

import urllib.request
r = urllib.request.urlopen(http://www.python.org/)

首先導入urllib.request模塊,使用urlopen()對參數中的URL發(fā)送請求,返回一個http.client.HTTPResponse對象。

在urlopen()中,使用timeout字段,可設定相應的秒數時間之后停止等待響應。除此之外,還可使用r.info()、r.getcode()、r.geturl()獲取相應的當前環(huán)境信息、狀態(tài)碼、當前網頁URL。

讀取響應內容

import urllib.request
url = "http://www.python.org/"
with urllib.request.urlopen(url) as r:
r.read()

使用r.read()讀取響應內容到內存,該內容為網頁的源代碼(可用相應的瀏覽器“查看網頁源代碼”功能看到),并可對返回的字符串進行相應解碼decode()。

傳遞URL參數

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的查詢字符串傳遞數據,

編碼后的params為字符串,字典每項鍵值對以'&'連接:'q=urllib&check_keywords=yes&area=default'

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

當然,urlopen()支持直接構建的URL,簡單的get請求可以不通過urlencode()編碼,手動構建后直接請求。上述方法使代碼模塊化,更優(yōu)雅。

傳遞中文參數

import urllib.request
searchword = urllib.request.quote(input("請輸入要查詢的關鍵字:"))
url = "https://cn.bing.com/images/async?q={}&first=0&mmasync=1".format(searchword)
r = urllib.request.urlopen(url)

該URL是利用bing圖片接口,查詢關鍵字q的圖片。如果直接將中文傳入URL中請求,會導致編碼錯誤。我們需要使用quote(),對該中文關鍵字進行URL編碼,相應的可以使用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)

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

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

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

在Python2.X中,urllib模塊和urllib2模塊通常一起使用,因為urllib.urlencode()可以對URL參數進行編碼,而urllib2.Request()可以構建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表單傳遞信息。

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

下載遠程數據到本地

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

爬取圖片、視頻等遠程數據時,可使用urlretrieve()下載到本地。

第一個參數為要下載的url,第二個參數為下載后的存放路徑。

該樣例下載python官網logo到當前目錄下,返回元組(filename, headers)。

設置代理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)

有時頻繁的爬取一個網頁,會被網站服務器屏蔽IP。這時,可通過上述方法設置代理IP。

首先,通過網上代理IP的網站找一個可以用的IP,構建ProxyHandler()對象,將'http'和代理IP以字典形式作為參數傳入,設置代理服務器信息。再構建opener對象,將proxy和HTTPHandler類傳入。通過installl_opener()將opener設置成全局,當用urlopen()發(fā)送請求時,會使用之前設置的信息來發(fā)送相應的請求。

異常處理

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相關異常。導入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訪問網頁時,Cookie維持會話間的狀態(tài)。例如:有些網站需要登錄操作,第一次可通過提交POST表單來登錄,當爬取該網站下的其它站點時,可以使用Cookie來保持登錄狀態(tài),而不用每次都通過提交表單來登錄。

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

相關文章

  • 詳解Python 循環(huán)嵌套

    詳解Python 循環(huán)嵌套

    這篇文章主要介紹了Python 循環(huán)嵌套的相關資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • Python處理重復字符

    Python處理重復字符

    在文本處理的時候,我們時常會遇到需要處理重復字樣的情況,Python提供了很多方法來處理這種情況,下面就來詳細的介紹幾種方法,感興趣的可以了解一下
    2024-02-02
  • Python基于Flask框架配置依賴包信息的項目遷移部署

    Python基于Flask框架配置依賴包信息的項目遷移部署

    這篇文章主要介紹了Python基于Flask框架配置依賴包信息的項目遷移部署小技巧,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-03-03
  • Python中的三目(元)運算符詳解

    Python中的三目(元)運算符詳解

    這篇文章主要介紹了python 三元運算符使用解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-09-09
  • Python爬蟲DNS解析緩存方法實例分析

    Python爬蟲DNS解析緩存方法實例分析

    這篇文章主要介紹了Python爬蟲DNS解析緩存方法,結合具體實例形式分析了Python使用socket模塊解析DNS緩存的相關操作技巧與注意事項,需要的朋友可以參考下
    2017-06-06
  • python使用requests庫提交multipart/form-data請求的方法詳解

    python使用requests庫提交multipart/form-data請求的方法詳解

    multipart/form-data的基礎是post請求,即基于post請求來實現的 ,下面這篇文章主要給大家介紹了關于python使用requests庫提交multipart/form-data請求的相關資料,需要的朋友可以參考下
    2023-01-01
  • 詳解python之異步編程

    詳解python之異步編程

    這篇文章主要為大家介紹了python之異步編程,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>
    2021-12-12
  • Scrapy中詭異xpath的匹配內容失效問題及解決

    Scrapy中詭異xpath的匹配內容失效問題及解決

    這篇文章主要介紹了Scrapy中詭異xpath的匹配內容失效問題及解決方案,具有很好的價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Python類中使用cursor.execute()時語法錯誤的解決方法

    Python類中使用cursor.execute()時語法錯誤的解決方法

    在 Python 類中使用 cursor.execute() 時,出現語法錯誤(如 SyntaxError 或 SQL 語法相關錯誤)通常是因為 SQL 語句格式不正確、占位符使用不當,或參數傳遞方式不符合預期,以下是解決此類問題的常見方法和建議,需要的朋友可以參考下
    2024-09-09
  • python分數表示方式和寫法

    python分數表示方式和寫法

    在本篇文章里小編給大家整理的是關于python分數怎么表示的相關知識點內容,有需要的朋友們學習下吧。
    2019-06-06

最新評論