国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

【Python】Python的urllib模塊、urllib2模塊批量進行網頁下載文件

2019-11-25 16:29:18
字體:
來源:轉載
供稿:網友

由于需要從某個網頁上下載一些PDF文件,但是需要下載的PDF文件有幾百個,所以不可能用人工點擊來下載。正好Python有相關的模塊,所以寫了個程序來進行PDF文件的下載,順便熟悉了Python的urllib模塊和ulrllib2模塊。

1、問題描述

需要從http://www.cvpapers.com/cvpr2014.html上下載幾百個論文的PDF文件,該網頁如下圖所示:

2、問題解決

通過結合Python的urllib模塊和urllib2模塊來實現自動下載。代碼如下:

test.py

#!/usr/bin/python # -*- coding:utf-8 -*-  import urllib              #導入urllib模塊 import urllib2             #導入urllib2模塊 import re               #導入正則表達式模塊:re模塊  def getPDFFromNet(inputURL):   req = urllib2.Request(inputURL)   f = urllib2.urlopen(req)         #打開網頁   localDir = 'E:/downloadPDF//'        #下載PDF文件需要存儲在本地的文件夾   urlList = []            #用來存儲提取的PDF下載的url的列表   for eachLine in f:          #遍歷網頁的每一行     line = eachLine.strip()       #去除行首位的空格,習慣性寫法     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以/為界進行劃分,為了提取該PDF文件名     for item in wordItems:       #遍歷每個字符串       if re.match('.*/.pdf$', item):   #查找PDF的文件名         PDFName = item     #查找到PDF文件名     localPDF = localDir + PDFName      #將本地存儲目錄和需要提取的PDF文件名進行連接     try:                  urllib.urlretrieve(everyURL, localPDF) #按照url進行下載,并以其文件名存儲到本地目錄     except Exception,e:       continue  getPDFFromNet('http://www.cvpapers.com/cvpr2014.html') 

注意:

(1)第1、6、8、23行分別多謝了一個“/”來進行轉義;

(2)第27行的urlretrieve函數有3個參數:第一個參數就是目標url;第二個參數是保存的文件絕對路徑(含文件名),該函數的返回值是一個tuple(filename,header),其中的filename就是第二個參數filename。如果urlretrieve僅提供1個參數,返回值的filename就是產生的臨時文件名,函數執行完畢后該臨時文件會被刪除參數。第3個參數是一個回調函數,當連接上服務器、以及相應的數據塊傳輸完畢的時候會觸發該回調。其中回調函數名稱可任意,但是參數必須為三個。一般直接使用reporthook(block_read,block_size,total_size)定義回調函數,block_size是每次讀取的數據塊的大小,block_read是每次讀取的數據塊個數,taotal_size是一一共讀取的數據量,單位是byte。可以使用reporthook函數來顯示讀取進度。
如果想顯示讀取進度,則可以講第三個參數加上,將上述程序第27行改為如下:

urllib.urlretrieve(everyURL, localPDF, reporthook=reporthook) 

而reporthook回調函數的代碼如下:

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); 

綜上所述,這就是一個簡單的從網頁抓取數據、下載文件的小程序,希望對正在學習Python的同學有幫助。謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 九龙县| 启东市| 凤翔县| 慈利县| 广南县| 龙口市| 武鸣县| 邵阳县| 祥云县| 江城| 怀集县| 湘乡市| 长寿区| 峨眉山市| 乌什县| 改则县| 新津县| 博客| 高州市| 万荣县| 锦屏县| 潜江市| 定州市| 崇义县| 和硕县| 奉节县| 佛山市| 永寿县| 原阳县| 惠水县| 石城县| 全南县| 健康| 宾川县| 新津县| 皋兰县| 夏河县| 定兴县| 香格里拉县| 山阳县| 蕉岭县|