偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Python學(xué)習(xí):urllib 簡(jiǎn)介

開發(fā) 開發(fā)工具
Python 3 的 urllib 模塊是一堆可以處理 URL 的組件集合。如果你有 Python 2 的知識(shí),那么你就會(huì)注意到 Python 2 中有 urllib 和 urllib2 兩個(gè)版本的模塊。這些現(xiàn)在都是 Python 3 的 urllib 包的一部分。

[[169751]]

Python 3 的 urllib 模塊是一堆可以處理 URL 的組件集合。如果你有 Python 2 的知識(shí),那么你就會(huì)注意到 Python 2 中有 urllib 和 urllib2 兩個(gè)版本的模塊。這些現(xiàn)在都是 Python 3 的 urllib 包的一部分。當(dāng)前版本的 urllib 包括下面幾部分:

  • urllib.request
  • urllib.error
  • urllib.parse
  • urllib.rebotparser

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

urllib.request

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

  1. >>> import urllib.request 
  2. >>> url = urllib.request.urlopen('https://www.google.com/'
  3. >>> url.geturl() 
  4. 'https://www.google.com/' 
  5. >>> url.info() 
  6. <http.client.HTTPMessage object at 0x7fddc2de04e0> 
  7. >>> header = url.info() 
  8. >>> header.as_string() 
  9. ('Date: Fri, 24 Jun 2016 18:21:19 GMT\n' 
  10.  'Expires: -1\n' 
  11.  'Cache-Control: private, max-age=0\n' 
  12.  'Content-Type: text/html; charset=ISO-8859-1\n' 
  13.  'P3P: CP="This is not a P3P policy! See ' 
  14.  'https://www.google.com/support/accounts/answer/151657?hl=en for more info."\n' 
  15.  'Server: gws\n' 
  16.  'X-XSS-Protection: 1; mode=block\n' 
  17.  'X-Frame-Options: SAMEORIGIN\n' 
  18.  'Set-Cookie: ' 
  19.  'NID=80=tYjmy0JY6flsSVj7DPSSZNOuqdvqKfKHDcHsPIGu3xFv41LvH_Jg6LrUsDgkPrtM2hmZ3j9V76pS4K_cBg7pdwueMQfr0DFzw33SwpGex5qzLkXUvUVPfe9g699Qz4cx9ipcbU3HKwrRYA; ' 
  20.  'expires=Sat, 24-Dec-2016 18:21:19 GMT; path=/; domain=.google.com; HttpOnly\n' 
  21.  'Alternate-Protocol: 443:quic\n' 
  22.  'Alt-Svc: quic=":443"; ma=2592000; v="34,33,32,31,30,29,28,27,26,25"\n' 
  23.  'Accept-Ranges: none\n' 
  24.  'Vary: Accept-Encoding\n' 
  25.  'Connection: close\n' 
  26.  '\n'
  27. >>> url.getcode() 
  28. 200 

在這里我們包含了需要的模塊,然后告訴它打開 Google 的 URL?,F(xiàn)在我們就有了一個(gè)可以交互的 HTTPResponse 對(duì)象。我們要做的***件事是調(diào)用方法 geturl ,它會(huì)返回根據(jù) URL 獲取的資源。這可以讓我們發(fā)現(xiàn) URL 是否進(jìn)行了重定向。

接下來調(diào)用 info ,它會(huì)返回網(wǎng)頁的元數(shù)據(jù),比如請(qǐng)求頭信息。因此,我們可以將結(jié)果賦給我們的 headers 變量,然后調(diào)用它的方法 as_string 。就可以打印出我們從 Google 收到的頭信息。你也可以通過 getcode 得到網(wǎng)頁的 HTTP 響應(yīng)碼,當(dāng)前情況下就是 200,意思是正常工作。

如果你想看看網(wǎng)頁的 HTML 代碼,你可以調(diào)用變量 url 的方法 read。我不準(zhǔn)備再現(xiàn)這個(gè)過程,因?yàn)檩敵鼋Y(jié)果太長(zhǎng)了。

請(qǐng)注意 request 對(duì)象默認(rèn)發(fā)起 GET 請(qǐng)求,除非你指定了它的 data 參數(shù)。如果你給它傳遞了 data 參數(shù),這樣 request 對(duì)象將會(huì)變成 POST 請(qǐng)求。

下載文件

urllib 一個(gè)典型的應(yīng)用場(chǎng)景是下載文件。讓我們看看幾種可以完成這個(gè)任務(wù)的方法:

  1. >>> import urllib.request 
  2. >>> url = 'http://www.blog.pythonlibrary.org/wp-content/uploads/2012/06/wxDbViewer.zip' 
  3. >>> response = urllib.request.urlopen(url) 
  4. >>> data = response.read() 
  5. >>> with open('/home/mike/Desktop/test.zip''wb'as fobj: 
  6. ...     fobj.write(data) 
  7. ... 

這個(gè)例子中我們打開一個(gè)保存在我的博客上的 zip 壓縮文件的 URL。然后我們讀出數(shù)據(jù)并將數(shù)據(jù)寫到磁盤。一個(gè)替代此操作的方案是使用 urlretrieve :

  1. >>> import urllib.request 
  2. >>> url = 'http://www.blog.pythonlibrary.org/wp-content/uploads/2012/06/wxDbViewer.zip' 
  3. >>> tmp_file, header = urllib.request.urlretrieve(url) 
  4. >>> with open('/home/mike/Desktop/test.zip''wb'as fobj: 
  5. ...     with open(tmp_file, 'rb'as tmp: 
  6. ...         fobj.write(tmp.read()) 

方法 urlretrieve 會(huì)把網(wǎng)絡(luò)對(duì)象拷貝到本地文件。除非你在使用 urlretrieve 的第二個(gè)參數(shù)指定你要保存文件的路徑,否則這個(gè)文件將被拷貝到臨時(shí)文件夾的隨機(jī)命名的一個(gè)文件中。這個(gè)可以為你節(jié)省一步操作,并且使代碼看起來更簡(jiǎn)單:

  1. >>> import urllib.request 
  2. >>> url = 'http://www.blog.pythonlibrary.org/wp-content/uploads/2012/06/wxDbViewer.zip' 
  3. >>> urllib.request.urlretrieve(url, '/home/mike/Desktop/blog.zip'
  4. ('/home/mike/Desktop/blog.zip'
  5.  <http.client.HTTPMessage object at 0x7fddc21c2470>) 

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

設(shè)置你的用戶代理

當(dāng)你使用瀏覽器訪問網(wǎng)頁時(shí),瀏覽器會(huì)告訴網(wǎng)站它是誰。這就是所謂的 user-agent (用戶代理)字段。Python 的 urllib 會(huì)表示它自己為 Python-urllib/x.y , 其中 x 和 y 是你使用的 Python 的主、次版本號(hào)。有一些網(wǎng)站不認(rèn)識(shí)這個(gè)用戶代理字段,然后網(wǎng)站可能會(huì)有奇怪的表現(xiàn)或者根本不能正常工作。辛運(yùn)的是你可以很輕松的設(shè)置你自己的 user-agent 字段。

  1. >>> import urllib.request 
  2. >>> user_agent = ' Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0' 
  3. >>> url = 'http://www.whatsmyua.com/' 
  4. >>> headers = {'User-Agent': user_agent} 
  5. >>> request = urllib.request.Request(url, headers=headers) 
  6. >>> with urllib.request.urlopen(request) as response: 
  7. ...     with open('/home/mdriscoll/Desktop/user_agent.html''wb'as out
  8. ...         out.write(response.read()) 

這里設(shè)置我們的用戶代理為 Mozilla FireFox ,然后我們?cè)L問 http://www.whatsmyua.com/ , 它會(huì)告訴我們它識(shí)別出的我們的 user-agent 字段。之后我們將 url 和我們的頭信息傳給 urlopen 創(chuàng)建一個(gè) Request 實(shí)例。***我們保存這個(gè)結(jié)果。如果你打開這個(gè)結(jié)果,你會(huì)看到我們成功的修改了自己的 user-agent 字段。使用這段代碼盡情的嘗試不同的值來看看它是如何改變的。

urllib.parse

urllib.parse 庫是用來拆分和組合 URL 字符串的標(biāo)準(zhǔn)接口。比如,你可以使用它來轉(zhuǎn)換一個(gè)相對(duì)的 URL 為絕對(duì)的 URL。讓我們?cè)囋囉盟鼇磙D(zhuǎn)換一個(gè)包含查詢的 URL :

  1. >>> from urllib.parse import urlparse 
  2. >>> result = urlparse('https://duckduckgo.com/?q=python+stubbing&t=canonical&ia=qa'
  3. >>> result 
  4. ParseResult(scheme='https', netloc='duckduckgo.com', path='/', params='', query='q=python+stubbing&t=canonical&ia=qa', fragment=''
  5. >>> result.netloc 
  6. 'duckduckgo.com' 
  7. >>> result.geturl() 
  8. 'https://duckduckgo.com/?q=python+stubbing&t=canonical&ia=qa' 
  9. >>> result.port 
  10. None 

這里我們導(dǎo)入了函數(shù) urlparse , 并且把一個(gè)包含搜索查詢字串的 duckduckgo 的 URL 作為參數(shù)傳給它。我的查詢字串是搜索關(guān)于 “python stubbing” 的文章。如你所見,它返回了一個(gè) ParseResult 對(duì)象,你可以用這個(gè)對(duì)象了解更多關(guān)于 URL 的信息。舉個(gè)例子,你可以獲取到端口信息(本例中沒有端口信息)、網(wǎng)絡(luò)位置、路徑和很多其它東西。

提交一個(gè) Web 表單

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

  1. >>> import urllib.request 
  2. >>> import urllib.parse 
  3. >>> data = urllib.parse.urlencode({'q''Python'}) 
  4. >>> data 
  5. 'q=Python' 
  6. >>> url = 'http://duckduckgo.com/html/' 
  7. >>> full_url = url + '?' + data 
  8. >>> response = urllib.request.urlopen(full_url) 
  9. >>> with open('/home/mike/Desktop/results.html''wb'as f: 
  10. ...     f.write(response.read()) 

這個(gè)例子很直接?;旧衔覀兪鞘褂?Python 而不是瀏覽器向 duckduckgo 提交了一個(gè)查詢。要完成這個(gè)我們需要使用 urlencode 構(gòu)建我們的查詢字符串。然后我們把這個(gè)字符串和網(wǎng)址拼接成一個(gè)完整的正確 URL ,然后使用 urllib.request 提交這個(gè)表單。***我們就獲取到了結(jié)果然后保存到磁盤上。

urllib.robotparser

robotparser 模塊是由一個(gè)單獨(dú)的類 RobotFileParser 構(gòu)成的。這個(gè)類會(huì)回答諸如一個(gè)特定的用戶代理是否獲取已經(jīng)設(shè)置了 robot.txt 的網(wǎng)站的 URL。 robot.txt 文件會(huì)告訴網(wǎng)絡(luò)爬蟲或者機(jī)器人當(dāng)前網(wǎng)站的那些部分是不允許被訪問的。讓我們看一個(gè)簡(jiǎn)單的例子:

  1. >>> import urllib.robotparser 
  2.  
  3. >>> robot = urllib.robotparser.RobotFileParser() 
  4. >>> robot.set_url('http://arstechnica.com/robots.txt'
  5. None 
  6. >>> robot.read() 
  7. None 
  8. >>> robot.can_fetch('*''http://arstechnica.com/'
  9. True 
  10. >>> robot.can_fetch('*''http://arstechnica.com/cgi-bin/'
  11. False 

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

總結(jié)一下

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

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2021-03-15 11:35:28

人工智能機(jī)器學(xué)習(xí)

2009-11-30 16:42:27

2010-07-21 11:17:30

2011-08-11 16:19:11

iPhoneCocoa

2010-03-30 14:46:56

CentOS學(xué)習(xí)

2010-07-15 18:04:20

Perl模式

2010-01-18 10:53:26

2010-07-19 16:47:54

Perl

2022-03-09 09:56:14

深度學(xué)習(xí)算法人工智能

2010-06-08 15:59:38

UML建模工具

2010-09-26 14:01:10

JVM Log

2010-02-02 10:33:51

Python

2010-06-28 17:14:20

UML類圖符號(hào)

2009-09-25 10:10:52

Linux學(xué)習(xí)Linux目錄簡(jiǎn)介

2011-07-08 16:47:07

SEAM

2010-07-05 15:15:25

UML9種圖

2023-06-13 15:35:36

2012-08-08 10:31:41

IBMdW

2009-02-25 10:34:57

異常處理體系Python

2010-02-01 10:04:25

Python模板函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)