【Python】Python的urllib模块、urllib2模块批量进行网页下载文件


Posted in Python onNovember 19, 2016

由于需要从某个网页上下载一些PDF文件,但是需要下载的PDF文件有几百个,所以不可能用人工点击来下载。正好Python有相关的模块,所以写了个程序来进行PDF文件的下载,顺便熟悉了Python的urllib模块和ulrllib2模块。

1、问题描述

需要从http://www.cvpapers.com/cvpr2014.html上下载几百个论文的PDF文件,该网页如下图所示:【Python】Python的urllib模块、urllib2模块批量进行网页下载文件

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的同学有帮助。谢谢!

Python 相关文章推荐
Python3.x版本中新的字符串格式化方法
Apr 24 Python
Python中格式化format()方法详解
Apr 01 Python
详解python里使用正则表达式的分组命名方式
Oct 24 Python
图解Python变量与赋值
Apr 03 Python
pandas中去除指定字符的实例
May 18 Python
pandas将numpy数组写入到csv的实例
Jul 04 Python
python使用PIL给图片添加文字生成海报示例
Aug 17 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
基于h5py的使用及数据封装代码
Dec 26 Python
Python处理mysql特殊字符的问题
Mar 02 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
Apr 22 Python
Python 解析库json及jsonpath pickle的实现
Aug 17 Python
Python基础中所出现的异常报错总结
Nov 19 #Python
轻松掌握python设计模式之策略模式
Nov 18 #Python
轻松掌握python设计模式之访问者模式
Nov 18 #Python
Win10下Python环境搭建与配置教程
Nov 18 #Python
Python Paramiko模块的安装与使用详解
Nov 18 #Python
Python数据分析之真实IP请求Pandas详解
Nov 18 #Python
Python切换pip安装源的方法详解
Nov 18 #Python
You might like
php中in_array函数用法分析
2014/11/15 PHP
php安装swoole扩展的方法
2015/03/19 PHP
php把大写命名转换成下划线分割命名
2015/04/27 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
扩展String功能方法
2006/09/22 Javascript
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
JS 图片缩放效果代码
2010/06/09 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
利用JS来控制键盘的上下左右键(示例代码)
2013/12/14 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
jQuery实现jQuery-form.js实现异步上传文件
2017/04/28 jQuery
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
Django  ORM 练习题及答案
2019/07/19 Python
python中return的返回和执行实例
2019/12/24 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
美国流行背包品牌:JanSport(杰斯伯)
2018/03/02 全球购物
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
金山毒霸系列的笔试题
2013/04/13 面试题
《夏夜多美》教学反思
2014/02/17 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
追悼会答谢词范文
2015/09/29 职场文书
SQL SERVER存储过程用法详解
2022/02/24 SQL Server