Python 學習:urllib 簡介

2021-03-02 Linux中國

Python 3 的 urllib 模塊是一堆可以處理 URL 的組件集合。如果你有 Python 2 的知識,那麼你就會注意到 Python 2 中有 urllib 和 urllib2 兩個版本的模塊。這些現在都是 Python 3 的 urllib 包的一部分。當前版本的 urllib 包括下面幾部分:

urllib.request

urllib.error

urllib.parse

urllib.rebotparser

接下來我們會分開討論除了 urllib.error 以外的幾部分。官方文檔實際推薦你嘗試第三方庫, requests,一個高級的 HTTP 客戶端接口。然而我依然認為知道如何不依賴第三方庫打開 URL 並與之進行交互是很有用的,而且這也可以幫助你理解為什麼 requests 包是如此的流行。

urllib.request

urllib.request 模塊期初是用來打開和獲取 URL 的。讓我們看看你可以用函數 urlopen 可以做的事:

>>> import urllib.request

>>> url = urllib.request.urlopen('https://www.google.com/')

>>> url.geturl()

'https://www.google.com/'

>>> url.info()

<http.client.HTTPMessage object at 0x7fddc2de04e0>

>>> header = url.info()

>>> header.as_string()

('Date: Fri, 24 Jun 2016 18:21:19 GMT\n'

'Expires: -1\n'

'Cache-Control: private, max-age=0\n'

'Content-Type: text/html; charset=ISO-8859-1\n'

'P3P: CP="This is not a P3P policy! See '

'https://www.google.com/support/accounts/answer/151657?hl=en for more info."\n'

'Server: gws\n'

'X-XSS-Protection: 1; mode=block\n'

'X-Frame-Options: SAMEORIGIN\n'

'Set-Cookie: '

'NID=80=tYjmy0JY6flsSVj7DPSSZNOuqdvqKfKHDcHsPIGu3xFv41LvH_Jg6LrUsDgkPrtM2hmZ3j9V76pS4K_cBg7pdwueMQfr0DFzw33SwpGex5qzLkXUvUVPfe9g699Qz4cx9ipcbU3HKwrRYA; '

'expires=Sat, 24-Dec-2016 18:21:19 GMT; path=/; domain=.google.com; HttpOnly\n'

'Alternate-Protocol: 443:quic\n'

'Alt-Svc: quic=":443"; ma=2592000; v="34,33,32,31,30,29,28,27,26,25"\n'

'Accept-Ranges: none\n'

'Vary: Accept-Encoding\n'

'Connection: close\n'

'\n')

>>> url.getcode()

200

在這裡我們包含了需要的模塊,然後告訴它打開 Google 的 URL。現在我們就有了一個可以交互的 HTTPResponse 對象。我們要做的第一件事是調用方法 geturl ,它會返回根據 URL 獲取的資源。這可以讓我們發現 URL 是否進行了重定向。

接下來調用 info ,它會返回網頁的元數據,比如請求頭信息。因此,我們可以將結果賦給我們的 headers 變量,然後調用它的方法 as_string 。就可以列印出我們從 Google 收到的頭信息。你也可以通過 getcode 得到網頁的 HTTP 響應碼,當前情況下就是 200,意思是正常工作。

如果你想看看網頁的 HTML 代碼,你可以調用變量 url 的方法 read。我不準備再現這個過程,因為輸出結果太長了。

請注意 request 對象默認發起 GET 請求,除非你指定了它的 data 參數。如果你給它傳遞了 data 參數,這樣 request 對象將會變成 POST 請求。

下載文件

urllib 一個典型的應用場景是下載文件。讓我們看看幾種可以完成這個任務的方法:

>>> import urllib.request

>>> url = 'http://www.blog.pythonlibrary.org/wp-content/uploads/2012/06/wxDbViewer.zip'

>>> response = urllib.request.urlopen(url)

>>> data = response.read()

>>> with open('/home/mike/Desktop/test.zip', 'wb') as fobj:

...     fobj.write(data)

...

這個例子中我們打開一個保存在我的博客上的 zip 壓縮文件的 URL。然後我們讀出數據並將數據寫到磁碟。一個替代此操作的方案是使用 urlretrieve :

>>> import urllib.request

>>> url = 'http://www.blog.pythonlibrary.org/wp-content/uploads/2012/06/wxDbViewer.zip'

>>> tmp_file, header = urllib.request.urlretrieve(url)

>>> with open('/home/mike/Desktop/test.zip', 'wb') as fobj:

...     with open(tmp_file, 'rb') as tmp:

...         fobj.write(tmp.read())

方法 urlretrieve 會把網絡對象拷貝到本地文件。除非你在使用 urlretrieve 的第二個參數指定你要保存文件的路徑,否則這個文件將被拷貝到臨時文件夾的隨機命名的一個文件中。這個可以為你節省一步操作,並且使代碼看起來更簡單:

>>> import urllib.request

>>> url = 'http://www.blog.pythonlibrary.org/wp-content/uploads/2012/06/wxDbViewer.zip'

>>> urllib.request.urlretrieve(url, '/home/mike/Desktop/blog.zip')

('/home/mike/Desktop/blog.zip',

<http.client.HTTPMessage object at 0x7fddc21c2470>)

如你所見,它返回了文件保存的路徑,以及從請求得來的頭信息。

設置你的用戶代理

當你使用瀏覽器訪問網頁時,瀏覽器會告訴網站它是誰。這就是所謂的 user-agent (用戶代理)欄位。Python 的 urllib 會表示它自己為 Python-urllib/x.y , 其中 x 和 y 是你使用的 Python 的主、次版本號。有一些網站不認識這個用戶代理欄位,然後網站可能會有奇怪的表現或者根本不能正常工作。辛運的是你可以很輕鬆的設置你自己的 user-agent 欄位。

>>> import urllib.request

>>> user_agent = ' Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0'

>>> url = 'http://www.whatsmyua.com/'

>>> headers = {'User-Agent': user_agent}

>>> request = urllib.request.Request(url, headers=headers)

>>> with urllib.request.urlopen(request) as response:

...     with open('/home/mdriscoll/Desktop/user_agent.html', 'wb') as out:

...         out.write(response.read())

這裡設置我們的用戶代理為 Mozilla FireFox ,然後我們訪問 http://www.whatsmyua.com/ , 它會告訴我們它識別出的我們的 user-agent 欄位。之後我們將 url 和我們的頭信息傳給 urlopen 創建一個 Request 實例。最後我們保存這個結果。如果你打開這個結果,你會看到我們成功的修改了自己的 user-agent 欄位。使用這段代碼盡情的嘗試不同的值來看看它是如何改變的。

urllib.parse

urllib.parse 庫是用來拆分和組合 URL 字符串的標準接口。比如,你可以使用它來轉換一個相對的 URL 為絕對的 URL。讓我們試試用它來轉換一個包含查詢的 URL :

>>> from urllib.parse import urlparse

>>> result = urlparse('https://duckduckgo.com/?q=python+stubbing&t=canonical&ia=qa')

>>> result

ParseResult(scheme='https', netloc='duckduckgo.com', path='/', params='', query='q=python+stubbing&t=canonical&ia=qa', fragment='')

>>> result.netloc

'duckduckgo.com'

>>> result.geturl()

'https://duckduckgo.com/?q=python+stubbing&t=canonical&ia=qa'

>>> result.port

None

這裡我們導入了函數 urlparse , 並且把一個包含搜索查詢字串的 duckduckgo 的 URL 作為參數傳給它。我的查詢字串是搜索關於 「python stubbing」 的文章。如你所見,它返回了一個 ParseResult 對象,你可以用這個對象了解更多關於 URL 的信息。舉個例子,你可以獲取到埠信息(本例中沒有埠信息)、網絡位置、路徑和很多其它東西。

提交一個 Web 表單

這個模塊還有一個方法 urlencode 可以向 URL 傳輸數據。 urllib.parse 的一個典型使用場景是提交 Web 表單。讓我們通過搜尋引擎 duckduckgo 搜索 Python 來看看這個功能是怎麼工作的。

>>> import urllib.request

>>> import urllib.parse

>>> data = urllib.parse.urlencode({'q': 'Python'})

>>> data

'q=Python'

>>> url = 'http://duckduckgo.com/html/'

>>> full_url = url + '?' + data

>>> response = urllib.request.urlopen(full_url)

>>> with open('/home/mike/Desktop/results.html', 'wb') as f:

...     f.write(response.read())

這個例子很直接。基本上我們是使用 Python 而不是瀏覽器向 duckduckgo 提交了一個查詢。要完成這個我們需要使用 urlencode 構建我們的查詢字符串。然後我們把這個字符串和網址拼接成一個完整的正確 URL ,然後使用 urllib.request 提交這個表單。最後我們就獲取到了結果然後保存到磁碟上。

urllib.robotparser

robotparser 模塊是由一個單獨的類 RobotFileParser 構成的。這個類會回答諸如一個特定的用戶代理是否獲取已經設置了 robot.txt 的網站的 URL。 robot.txt 文件會告訴網絡爬蟲或者機器人當前網站的那些部分是不允許被訪問的。讓我們看一個簡單的例子:

>>> import urllib.robotparser

>>> robot = urllib.robotparser.RobotFileParser()

>>> robot.set_url('http://arstechnica.com/robots.txt')

None

>>> robot.read()

None

>>> robot.can_fetch('*', 'http://arstechnica.com/')

True

>>> robot.can_fetch('*', 'http://arstechnica.com/cgi-bin/')

False

這裡我們導入了 robot 分析器類,然後創建一個實例。然後我們給它傳遞一個表明網站 robots.txt 位置的 URL 。接下來我們告訴分析器來讀取這個文件。完成後,我們給它了一組不同的 URL 讓它找出那些我們可以爬取而那些不能爬取。我們很快就看到我們可以訪問主站但是不能訪問 cgi-bin 路徑。

總結一下

現在你就有能力使用 Python 的 urllib 包了。在這一節裡,我們學習了如何下載文件、提交 Web 表單、修改自己的用戶代理以及訪問 robots.txt。 urllib 還有一大堆附加功能沒有在這裡提及,比如網站身份認證。你可能會考慮在使用 urllib 進行身份認證之前切換到 requests 庫,因為 requests 已經以更易用和易調試的方式實現了這些功能。我同時也希望提醒你 Python 已經通過 http.cookies 模塊支持 Cookies 了,雖然在 request 包裡也很好的封裝了這個功能。你應該可能考慮同時試試兩個來決定那個最適合你。

via: http://www.blog.pythonlibrary.org/2016/06/28/python-101-an-intro-to-urllib/

作者:Mike[1] 譯者:Ezio[2] 校對:wxy[3]

本文由 LCTT[4] 原創翻譯,Linux中國[5] 榮譽推出

[1]: http://www.blog.pythonlibrary.org/author/mld/
[2]: https://github.com/oska874
[3]: https://github.com/wxy
[4]: https://github.com/LCTT/TranslateProject
[5]: https://linux.cn/

推薦文章


將文章分享給朋友是對我們最好的讚賞!

相關焦點

  • Python爬蟲核心模塊urllib的學習
    因為在玩Python challenge的時候,有用過這個模塊,而且學習這個模塊之後也對系統學習網絡爬蟲有用。
  • python 安全之 urllib 模塊
    python 的爬蟲腳本中經常用到的一個模塊,常用的還有 urllib3 ,requests 模塊等等,這裡先介紹 urllib。註:這裡使用的是 python3 的環境,在 python2 中,urllib 被分為 urllib,urllib2 等。用 urllib.request 模塊的 urlopen() 獲取頁面,page 的數據格式為 bytes 類型,需要 decode() 解碼,轉換成 str 類型。
  • Python爬蟲常用庫之urllib詳解
    而當scheme協議加了,而前面的url也包含協議,一般會忽略後面的scheme參數既然後解析url,那當然也有反解析url,就是把元素串連成一個url1from urllib import parse2# 將列表元素拼接成url3url = ['http', 'www', 'baidu', 'com', 'dfdf', 'eddffa'] # 這裡至少需要
  • Python爬蟲之urllib庫—爬蟲的第一步
    第一個爬蟲代碼的實現我想應該是從urllib開始吧,博主開始學習的時候就是使用urllib庫敲了幾行代碼就實現了簡單的爬數據功能,我想大多夥伴們也都是這麼過來的
  • Python爬蟲 | 0x6 - 請求庫:urllib
    兩個庫來實現請求發送,而在Python3中將這兩個庫合併到了一起,統一為urllib。它由下述四個模塊組成:可通過urllib.request模塊提供的urlopen()函數來構造一個HTTP請求,代碼示例如下:import urllib.requestresp = urllib.request.urlopen
  • python爬蟲基礎之urllib的使用
    這篇文章主要介紹了python爬蟲基礎之urllib的使用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下一
  • 接口測試 | urllib篇 18 urllib介紹
    概述本文基於Python3分享urllib模塊的源碼分享,所以不要拿這python2來問我為什麼找不到對應的源碼。對於parse模塊其他的功能,本文就不一一演示了,請參見官網學習。requset模塊這個模塊可以說是urllib最核心的模塊了,其定義了系列函數、類用於實現http/https相關協議功能。
  • Python開發簡單爬蟲【學習資料總結】
    Python的網頁下載器 urllib2 (Python3以後將urllib2替換為urllib.request) requests urllib2 方法1:給定url,使用urllib2模塊的urlopen方法。
  • Python(34)常用指引:使用urllib包獲取網絡資源
    urllib.request 支持多種 "URL 網址方案" (通過 URL中 ":" 之前的字符串加以區分——如 URL 地址 "ftp://python.org/"` 中的 ``"ftp"`) ,使用與之相關的網絡協議(如:FTP、 HTTP)來獲取 URL 資源。本指南重點關注最常用的情形—— HTTP。
  • 初識Python
    Python簡介python --version在Linux或macOS系統的終端中鍵入下面的命令。python3 --version當然也可以先輸入python或python3進入交互式環境,再執行以下的代碼檢查Python的版本。
  • 使用Python下載文件的簡單示例
    在本教程中,您將學習如何使用不同的Python模塊從Web下載文件。此外,您還將下載常規文件、網頁、AmazonS 3和其他來源。最後,您將學習如何克服可能遇到的各種挑戰,例如下載重定向文件、下載大型文件、完成多線程下載以及其他策略。
  • Python新手學習網絡爬蟲要做什麼?
    我們自學一段時間Python後想要學習網絡爬蟲,需要做些什麼嗎?Python網絡爬蟲學習,不需要你深入學習html,只要知道掌握它常用的簡單標籤跟知識點就行。三、urllib、urllib2兩個庫很重要urllib和urllib2個庫是我們在抓取頁面要用的。在python中,urllib和urllib2不可相互替代,雖然urllib2是urllib的增強,但是urllib中有urllib2中所沒有的函數。
  • Python 1 day | 初識Phthon
    Python簡介Python的歷史1989年聖誕節:Guido von Rossum開始寫Python語言的編譯器。1991年2月:第一個Python編譯器(同時也是解釋器)誕生,它是用C語言實現的(後面),可以調用C語言的庫函數。
  • Python網絡爬蟲(二)- urllib爬蟲案例
    # -*- coding:utf-8 -*-#引入需要的模塊import urllib #用於進行中文編碼import urllib2  #用於進行爬蟲核心處理#定義一個函數,用於爬取對應的數據def load_url(url,file_name):    '''    作用:針對指定的
  • Sublime Text3搭建Python環境
    一、下載安裝pythonPython安裝安裝時,一定要勾選上圖所示紅框。cmd 運行python命令,如圖:安裝成功代表安裝成功。二、下載安裝Sublime Text3三、要想Sublime Text3具有python shell那種交互效果,參考以下步驟安裝Package Control ,使用Ctrl+`快捷鍵或者通過View->Show Console菜單打開命令行,粘貼如下代碼:import urllib.request,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee
  • python接口測試之urllib2的應用(十五)
    如果想詳細的了解urllib2庫,建議到官方查看,官方地址:https://docs.python.org/2/library/urllib2.html。查看urllib2庫的詳細的幫助文檔,見執行的代碼:#!
  • Python爬蟲:一些常用的爬蟲技巧總結
    也差不多一年多了,python應用最多的場景還是web快速開發、爬蟲、自動化運維:寫過簡單網站、寫過自動發帖腳本、寫過收發郵件腳本、寫過簡單驗證碼識別腳本。import urllibimport urllib2 url = "http://abcde.com"form = {'name':'abc','password':'1234'}form_data = urllib.urlencode(form)request = urllib2.
  • Python2.6低版本Python如何實現爬蟲功能
    >>> import requestsTraceback (most recent call last):File "<stdin>", line 1, in <module>File "/usr/lib/python2.6/site-packages/requests/__init__.py", line
  • Python 2 與 Python 3 的區別
    加微信群回復公眾號:微信群;QQ群:16004488加微信群或QQ群可免費索取:學習教程教程列表見微信公眾號底部菜單# python2print 1/2>>> 0print 1/2.>>>0.5# python3print(1/2)>>> 0.5print(1//2)>>> 0nonlocal 語句py3 新加入的,可以指定非全局變量。
  • 適合新手學習的Python爬蟲書籍
    點擊藍字「python