【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 ddt实现数据驱动
Mar 14 Python
基于Python中求和函数sum的用法详解
Jun 28 Python
编写多线程Python服务器 最适合基础
Sep 14 Python
flask session组件的使用示例
Dec 25 Python
Python Django 实现简单注册功能过程详解
Jul 29 Python
python3 反射的四种基本方法解析
Aug 26 Python
python中栈的原理及实现方法示例
Nov 27 Python
使用python实现多维数据降维操作
Feb 24 Python
利用Vscode进行Python开发环境配置的步骤
Jun 22 Python
Django后端分离 使用element-ui文件上传方式
Jul 12 Python
在终端启动Python时报错的解决方案
Nov 20 Python
用python-webdriver实现自动填表的示例代码
Jan 13 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默认安装产生系统漏洞
2006/10/09 PHP
php下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
非常实用的php弹出错误警告函数扩展性强
2014/01/17 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
经典的解除许多网站无法复制文字的绝招
2006/12/31 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
js返回顶部实例分享
2016/12/21 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
详解IOS微信上Vue单页面应用JSSDK签名失败解决方案
2018/11/14 Javascript
利用vue-i18n实现多语言切换效果的方法
2019/06/19 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
python3判断url链接是否为404的方法
2018/08/10 Python
树莓派实现移动拍照
2019/06/22 Python
浅析使用Python搭建http服务器
2019/10/27 Python
numpy.transpose()实现数组的转置例子
2019/12/02 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
TensorBoard 计算图的查看方式
2020/02/15 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
经贸日语专业个人求职信
2013/12/13 职场文书
建筑班组长岗位职责
2014/01/02 职场文书
活动总结怎么写
2014/04/28 职场文书
服务行业口号
2014/06/11 职场文书
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android