1. 程式人生 > >python之urllib模組urlretrieve()函式初窺

python之urllib模組urlretrieve()函式初窺

    今天在使用python的庫urllib做實驗的時候接觸到了urlretrieve()這個函式,個人感覺很有意思,可能是因為之前一直都沒有使用過這樣簡潔的函式,urllib模組可以很容易的獲取網際網路上頁面的html內容,之後可以利用re模組提供的正則表示式來提取自己需要的資訊,在需要從網上下載資料或者材料的時候需要編寫專門的程式來儲存檔案。

    urlretrieve()這個函式可以直接從網際網路上下載檔案儲存到本地路徑下,下面簡單來介紹一下這個函式的用法。

    在python shell中輸入:

help(urllib.urlretrieve)

得到關於這個函式的基本用法資訊為:

Help on function urlretrieve in module urllib:

urlretrieve(url, filename=None, reporthook=None, data=None)
(END)

在這裡介紹一下各個引數的意義,進入python官網檢視的關於urllib模組的官網文件得到如下解釋:
  • 引數 finename 指定了儲存本地路徑(如果引數未指定,urllib會生成一個臨時檔案儲存資料。)
  • 引數 reporthook 是一個回撥函式,當連線上伺服器、以及相應的資料塊傳輸完畢時會觸發該回調,我們可以利用這個回撥函式來顯示當前的下載進度。
  • 引數 data 指 post 到伺服器的資料,該方法返回一個包含兩個元素的(filename, headers)元組,filename 表示儲存到本地的路徑,header 表示伺服器的響應頭。
在這裡借用python爬蟲課程中的一個程式例子來簡單介紹一下urlretrieve()函式的使用:
#!/usr/bin/python  
# -*- coding: utf-8 -*-  

import os
from urllib import urlretrieve
from urllib import urlopen
from bs4 import BeautifulSoup

downloadDirectory = "downloaded"
baseUrl = "http://pythonscraping.com"

def getAbsoluteURL(baseUrl, source):
    if source.startswith("http://www."):
        url = "http://"+source[11:]
    elif source.startswith("http://"):
        url = source
    elif source.startswith("www."):
        url = source[4:]
        url = "http://"+source
    else:
        url = baseUrl+"/"+source
    if baseUrl not in url:
        return None
    return url

def getDownloadPath(baseUrl, absoluteUrl, downloadDirectory):
    path = absoluteUrl.replace("www.", "")
    path = path.replace(baseUrl, "")
    path = downloadDirectory+path
    directory = os.path.dirname(path)

    if not os.path.exists(directory):
        os.makedirs(directory)

    return path

html = urlopen("http://www.pythonscraping.com")
bsObj = BeautifulSoup(html, "html.parser")
downloadList = bsObj.findAll(src=True)
print '________________________________________________________________________________________________'
print downloadList
print len(downloadList)

for download in downloadList:
    fileUrl = getAbsoluteURL(baseUrl, download["src"])
    if fileUrl is not None:
        print '********************************************************************************'
        print(fileUrl)
        urlretrieve(fileUrl, getDownloadPath(baseUrl, fileUrl, downloadDirectory))

實驗結果如下:
[<script src="http://www.pythonscraping.com/misc/jquery.js?v=1.4.4" type="text/javascript"></script>, <script src="http://www.pythonscraping.com/misc/jquery.once.js?v=1.2" type="text/javascript"></script>, <script src="http://www.pythonscraping.com/misc/drupal.js?nhx1dd" type="text/javascript"></script>, <script src="http://www.pythonscraping.com/sites/all/themes/skeletontheme/js/jquery.mobilemenu.js?nhx1dd" type="text/javascript"></script>, <script src="http://www.pythonscraping.com/sites/all/modules/google_analytics/googleanalytics.js?nhx1dd" type="text/javascript"></script>, <img alt="Home" src="http://www.pythonscraping.com/sites/default/files/lrg_0.jpg"/>, <iframe frameborder="0" height="500px" scrolling="no" src="http://www.oreilly.com/authors/widgets/669.html" width="200px"></iframe>, <img alt="" src="http://pythonscraping.com/img/lrg%20(1).jpg" style="height:394px; width:300px"/>]
8
http://pythonscraping.com/misc/jquery.js?v=1.4.4
http://pythonscraping.com/misc/jquery.once.js?v=1.2
http://pythonscraping.com/misc/drupal.js?nhx1dd
http://pythonscraping.com/sites/all/themes/skeletontheme/js/jquery.mobilemenu.js?nhx1dd
http://pythonscraping.com/sites/all/modules/google_analytics/googleanalytics.js?nhx1dd
http://pythonscraping.com/sites/default/files/lrg_0.jpg
http://pythonscraping.com/img/lrg%20(1).jpg

執行之後在程式同級的目錄下面出現了downloaded目錄檔案,開啟一看可以看到檔案都儲存成功,程式很簡單,感興趣的同學也可以拿去執行試試。

接下來使用urlretrieve()來下載幾個網頁儲存到指定路徑中去,程式如下:

#!/usr/bin/python  
# -*- coding: utf-8 -*-  

import os
import urllib

def callback(dbnum, dbsize, size):
    '''回撥函式
    dbnum: 已經下載的資料塊
    dbsize: 資料塊的大小
    size: 遠端檔案的大小
    '''
    percent = 100.0 * dbnum * dbsize / size
    if percent > 100:
        percent = 100
    print "%.2f%%"% percent

#將輸入的url處理為標準格式,否則會發生解析出錯的問題
def url_handle(url):
    if url.startswith('http://www.'):
        pass
    else:
        url = 'http://www.' + url
    return url 

if __name__ == '__main__':
    if not os.path.exists('downloaddata'):
        os.mkdir('downloaddata')
    url_list = ['http://www.baidu.com', 'taobao.com', 'http://www.vmall.com']
    for one_url in url_list:
    	print '*****************************downloading************************************'
        url = url_handle(one_url)
        local = 'downloaddata' + '/' + url.split('.')[-2] + '.html'
        urllib.urlretrieve(url, local, callback)

得到如下結果:

*****************************downloading************************************
-0.00%
-819200.00%
-1638400.00%
-2457600.00%
-3276800.00%
-4096000.00%
-4915200.00%
-5734400.00%
-6553600.00%
-7372800.00%
-8192000.00%
-9011200.00%
-9830400.00%
-10649600.00%
*****************************downloading************************************
-0.00%
-819200.00%
-1638400.00%
-2457600.00%
-3276800.00%
-4096000.00%
-4915200.00%
-5734400.00%
-6553600.00%
-7372800.00%
-8192000.00%
-9011200.00%
-9830400.00%
-10649600.00%
-11468800.00%
-12288000.00%
-13107200.00%
-13926400.00%
*****************************downloading************************************
-0.00%
-819200.00%
-1638400.00%
-2457600.00%
-3276800.00%
-4096000.00%
-4915200.00%
-5734400.00%
-6553600.00%
-7372800.00%
-8192000.00%
-9011200.00%
-9830400.00%
-10649600.00%
-11468800.00%
-12288000.00%
-13107200.00%
-13926400.00%
-14745600.00%
-15564800.00%

同時在本地看到了儲存成功的三個頁面的檔案,大小分別為:100KB、133KB、150KB

簡單的一個小嚐試,之後繼續學習,歡迎一起交流學習!

相關推薦

pythonurllib模組urlretrieve函式

    今天在使用python的庫urllib做實驗的時候接觸到了urlretrieve()這個函式,個人感覺很有意思,可能是因為之前一直都沒有使用過這樣簡潔的函式,urllib模組可以很容易的獲取網際網路上頁面的html內容,之後可以利用re模組提供的正則表示式來提取自己

Python 3.6模組學習urlliburllib.request.urlopen函式學習

urllib提供了一系列用於操作URL的功能。包含urllib.request,urllib.error,urllib.parse,urllib.robotparser四個子模組。 官網資料如下:

Python學習【第9篇】:Python常用模組時間模組,序列化模組 常用模組2

常用模組2 一、time模組 表示時間的三種方式:   時間戳:數字(計算機能認識的)   時間字串:t='2012-12-12'

Python學習【第8篇】:Python常用模組主要是正則以及collections模組 python--------------常用模組正則

python--------------常用模組之正則 一、認識模組     什麼是模組:一個模組就是一個包含了python定義和宣告的檔案,檔名就是加上.py的字尾,但其實import載入的模組分為四個通用類別 :

pythonconfigparser模組(配置檔案

該模組主要是針對於配置檔案的生成 以及生成後的增刪改查操作 第一步生成 import configparser config = configparser.ConfigParser() config["DEFAULT"] = {'ServerAliveInterval': '45

python裡使用cv2.goodFeaturesToTrack函式追蹤影象裡的關鍵點

    首先需要對cv2.goodFeaturesToTrack函式有一個基本的瞭解:     詳細的介紹在這裡:http://baike.baidu.com/link?url=zPK3iMJJfkKO0k2bniENAvksIRY0-Ci7weIcpE9AdFybc5ty

pythonre模組正則表示式常用函式

1、compile() 編譯正則表示式模式,返回一個物件的模式。(可以把那些常用的正則表示式編譯成正則表示式物件,這樣可以提高一點效率。) 格式: re.compile(pattern,flags=0) pattern: 編譯時用的表示式字串。 flags 編譯標誌位,用於修改正

【轉】Python正則表示式re模組

【轉】Python之正則表示式(re模組) 本節內容 re模組介紹 使用re模組的步驟 re模組簡單應用示例 關於匹配物件的說明 說說正則表示式字串前的r字首 re模組綜合應用例項 參考文件 提示: 由於該站對MARKDOWN的表格支援的不是很好,所以本文中的表

Pythontime模組的時間戳、時間字串格式化與轉換13位時間戳

Python處理時間和時間戳的內建模組就有time,和datetime兩個,本文先說time模組。 關於時間戳的幾個概念 時間戳,根據1970年1月1日00:00:00開始按秒計算的偏移量。 時間元組(struct_time),包含9個元素。 t

python 使用 urllib.urlretrieve下載網路圖片,在本地開啟提示檔案損壞無法開啟

程式碼如下: url = ‘http://www.xiaohuar.com/d/file/20170318/a5e3460073df58ed208ae3ec2ff46d07.jpg’ path_name ='xx' urllib.urlretrieve(url, 'D:\i

python pickle模組--輸出儲存到文字基本的資料序列和反序列化

字典輸出到文字該如何輸出呢?遍歷字典,輸出也麻煩了,而且字典沒有按順序儲存,讀起來也麻煩。這個需求,導致的結果就是發現了這個好用的模組。 下面是一個字典的例項: #!/usr/bin/env python #-*- coding: utf-8 -*- #filename:

Pythonstruct模組處理二進位制

有的時候需要用python處理二進位制資料,比如,存取檔案,socket操作時.這時候,可以使用python的struct模組來完成.可以用 struct來處理c語言中的結構體. struct模組中最重要的三個函式是pack(), unpack(), calcsize(

Python 3.6urllib的變化1

語法區別: python3之後就沒有了urllib和urllib2之說 urllib和urllib2合併後統稱為urllib,其中包含urllib.request/urllib.erro/urllib

Python基礎總結第九天開始【pythonOS模組對目錄的操作、以及操作檔案】新手可相互督促

年薪20萬的夢想。。。         python對檔案、目錄能做什麼?或者說我們需要python替我們做什麼?最經常的操作就是對檔案的:開啟、關閉、讀取、寫入、修改、儲存等等對目錄的操作,無非就是:建立目錄、刪除目錄、更改目錄名字等等。我們先認識一下OS模組,os

python路——第二塊裝飾器、生成器、叠代器

技術 調用 效果 替換 循環 while 數據類型 exit 新功能 裝飾器 def deco(count): def func(num): if num < 10: count(num) else:

python面向對象接口和抽象類

抽取 高層 per 常常 typeerror app 具體細節 同仁 接口 一、接口 什麽是接口 繼承有兩種用途: 1:繼承基類的方法,並且做出自己的改變或者擴展(代碼重用)。 2:聲明某個子類兼容於某基類,定義一個接口類Interface,接口類中定義了一些接口名(就是函

python面向對象繼承的實現原理及封裝

let 基類 什麽 isp odi speed utf-8 賦值 類名 一、繼承的實現原理 繼承的順序 class A(object): def test(self): print(‘from A‘) class B(A): def t

Python字符編碼Day10

方式 encode 編輯器 字符串類型 python文件 介質 odin 進制 mage 1. python解釋器執行py文件的原理 ,例如python test.py      第一階段:python解釋器啟動,此時就相當於啟動了一個文本編輯器     第二階段:p

菜鳥的Python路--基礎知識列表的基本操作

python列表list1 = [,,,,,]list2 = [,,] t = [,,,,,] t.sort(=)(t)本文出自 “11316806” 博客,請務必保留此出處http://11326806.blog.51cto.com/11316806/1959140菜鳥的Python之路--基礎知識(列表的

Python面向對象初級篇

one 這一 調用 現實生活 ram 每次 open java 自我 面向過程:根據業務邏輯從上到下寫壘代碼 函數式:將某功能代碼封裝到函數中,日後便無需重復編寫,僅調用函數即可 面向對象:對函數進行分類和封裝,讓開發“更快更好更強...” 面向過程編程最易被初學者接受