【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 相关文章推荐
python函数形参用法实例分析
Aug 04 Python
python动态网页批量爬取
Feb 14 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
Python实现针对给定字符串寻找最长非重复子串的方法
Apr 21 Python
pandas 按照特定顺序输出的实现代码
Jul 10 Python
python numpy 按行归一化的实例
Jan 21 Python
Python简易版图书管理系统
Aug 12 Python
python动态文本进度条的实例代码
Jan 22 Python
python 实现多维数组(array)排序
Feb 28 Python
PyQt5实现画布小程序
May 30 Python
python3代码输出嵌套式对象实例详解
Dec 03 Python
如何用Python搭建gRPC服务
Jun 30 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的大小写敏感问题整理
2011/12/29 PHP
PHP逐行输出(ob_flush与flush的组合)
2012/02/04 PHP
如何在php中正确的使用json
2013/08/06 PHP
laravel框架之数据库查出来的对象实现转化为数组
2019/10/23 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
细说浏览器特性检测(2)-通用事件检测
2010/11/05 Javascript
js获取TreeView控件选中节点的Text和Value值的方法
2012/11/24 Javascript
日历查询的算法 如何计算某一天是星期几
2012/12/12 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
2014/12/29 Javascript
javascript鼠标滑动评分控件完整实例
2015/05/13 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
2016/11/21 Javascript
浅析Jquery操作select
2016/12/13 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
checkbox:click事件触发span元素内容改变的方法
2017/09/11 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
2018/09/28 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
python 简易计算器程序,代码就几行
2009/08/29 Python
Python文件操作,open读写文件,追加文本内容实例
2016/12/14 Python
Python+OpenCV实现车牌字符分割和识别
2018/03/31 Python
Python单元测试实例详解
2018/05/25 Python
对python读取CT医学图像的实例详解
2019/01/24 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
璀璨的珍珠、密钉和个性化珠宝:Lily & Roo
2021/01/21 全球购物
网络教育自我鉴定
2013/11/01 职场文书
大学校园生活自我鉴定
2014/01/13 职场文书
《梅兰芳学艺》教学反思
2014/02/24 职场文书
毕业大学生自荐信
2014/06/17 职场文书
美容院合作经营协议书
2014/10/10 职场文书
2016应届毕业生就业指导课心得体会
2016/01/15 职场文书
浅谈Redis缓冲区机制
2022/06/05 Redis