【Python】Python的urllib模塊、urllib2模塊批量進(jìn)行網(wǎng)頁下載文件
由于需要從某個網(wǎng)頁上下載一些PDF文件,但是需要下載的PDF文件有幾百個,所以不可能用人工點擊來下載。正好Python有相關(guān)的模塊,所以寫了個程序來進(jìn)行PDF文件的下載,順便熟悉了Python的urllib模塊和ulrllib2模塊。
1、問題描述
需要從http://www.cvpapers.com/cvpr2014.html上下載幾百個論文的PDF文件,該網(wǎng)頁如下圖所示:
2、問題解決
通過結(jié)合Python的urllib模塊和urllib2模塊來實現(xiàn)自動下載。代碼如下:
test.py
#!/usr/bin/python # -*- coding:utf-8 -*- import urllib #導(dǎo)入urllib模塊 import urllib2 #導(dǎo)入urllib2模塊 import re #導(dǎo)入正則表達(dá)式模塊:re模塊 def getPDFFromNet(inputURL): req = urllib2.Request(inputURL) f = urllib2.urlopen(req) #打開網(wǎng)頁 localDir = 'E:\downloadPDF\\' #下載PDF文件需要存儲在本地的文件夾 urlList = [] #用來存儲提取的PDF下載的url的列表 for eachLine in f: #遍歷網(wǎng)頁的每一行 line = eachLine.strip() #去除行首位的空格,習(xí)慣性寫法 if re.match('.*PDF.*', line): #去匹配含有“PDF”字符串的行,只有這些行才有PDF下載地址 wordList = line.split('\"') #以"為分界,將該行分開,這樣就將url地址單獨分開了 for word in wordList: #遍歷每個字符串 if re.match('.*\.pdf$', word): #去匹配含有“.pdf”的字符串,只有url中才有 urlList.append(word) #將提取的url存入列表 for everyURL in urlList: #遍歷列表的每一項,即每一個PDF的url wordItems = everyURL.split('/') #將url以/為界進(jìn)行劃分,為了提取該PDF文件名 for item in wordItems: #遍歷每個字符串 if re.match('.*\.pdf$', item): #查找PDF的文件名 PDFName = item #查找到PDF文件名 localPDF = localDir + PDFName #將本地存儲目錄和需要提取的PDF文件名進(jìn)行連接 try: urllib.urlretrieve(everyURL, localPDF) #按照url進(jìn)行下載,并以其文件名存儲到本地目錄 except Exception,e: continue getPDFFromNet('http://www.cvpapers.com/cvpr2014.html')
注意:
(1)第1、6、8、23行分別多謝了一個“\”來進(jìn)行轉(zhuǎn)義;
(2)第27行的urlretrieve函數(shù)有3個參數(shù):第一個參數(shù)就是目標(biāo)url;第二個參數(shù)是保存的文件絕對路徑(含文件名),該函數(shù)的返回值是一個tuple(filename,header),其中的filename就是第二個參數(shù)filename。如果urlretrieve僅提供1個參數(shù),返回值的filename就是產(chǎn)生的臨時文件名,函數(shù)執(zhí)行完畢后該臨時文件會被刪除參數(shù)。第3個參數(shù)是一個回調(diào)函數(shù),當(dāng)連接上服務(wù)器、以及相應(yīng)的數(shù)據(jù)塊傳輸完畢的時候會觸發(fā)該回調(diào)。其中回調(diào)函數(shù)名稱可任意,但是參數(shù)必須為三個。一般直接使用reporthook(block_read,block_size,total_size)定義回調(diào)函數(shù),block_size是每次讀取的數(shù)據(jù)塊的大小,block_read是每次讀取的數(shù)據(jù)塊個數(shù),taotal_size是一一共讀取的數(shù)據(jù)量,單位是byte??梢允褂胷eporthook函數(shù)來顯示讀取進(jìn)度。
如果想顯示讀取進(jìn)度,則可以講第三個參數(shù)加上,將上述程序第27行改為如下:
urllib.urlretrieve(everyURL, localPDF, reporthook=reporthook)
而reporthook回調(diào)函數(shù)的代碼如下:
def reporthook(block_read,block_size,total_size): if not block_read: print "connection opened"; return if total_size<0: #unknown size print "read %d blocks (%dbytes)" %(block_read,block_read*block_size); else: amount_read=block_read*block_size; print 'Read %d blocks,or %d/%d' %(block_read,block_read*block_size,total_size);
綜上所述,這就是一個簡單的從網(wǎng)頁抓取數(shù)據(jù)、下載文件的小程序,希望對正在學(xué)習(xí)Python的同學(xué)有幫助。謝謝!
相關(guān)文章
Python編程使用有限狀態(tài)機(jī)識別地址有效性
這篇文章主要介紹了Python編程中如何使用有限狀態(tài)機(jī)識別地址有效性,如何識別一個地址是否有效,確切的講,如何編程識別一個中國地址是否有效2021-09-09Django微信小程序后臺開發(fā)教程的實現(xiàn)
這篇文章主要介紹了Django微信小程序后臺開發(fā)教程的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06python中[[]] * (n)和[[] for _ in 
本文主要介紹了python中[[]] * (n)和[[] for _ in range(n)]的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02Python的Django框架中的select_related函數(shù)對QuerySet 查詢的優(yōu)化
這篇文章主要介紹了Python的Django框架中的select_related函數(shù)對QuerySet查詢的優(yōu)化,以減少數(shù)據(jù)庫的查詢次數(shù)為目的,需要的朋友可以參考下2015-04-04Python開發(fā)之射擊闖關(guān)游戲的實現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何利用Python實現(xiàn)射擊闖關(guān)游戲,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定的幫助,感興趣的小伙伴可以了解一下2023-01-01Python的Django框架中的數(shù)據(jù)過濾功能
這篇文章主要介紹了Python的Django框架中的數(shù)據(jù)過濾功能,為更新數(shù)據(jù)庫數(shù)據(jù)時的數(shù)據(jù)查找提供了方便,需要的朋友可以參考下2015-07-07