【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 正在毁灭 Python的原因分析
Nov 28 Python
Python中用于检查英文字母大写的isupper()方法
May 19 Python
python简单实现旋转图片的方法
May 30 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
在Pandas中处理NaN值的方法
Jun 25 Python
Django中如何使用sass的方法步骤
Jul 09 Python
Python实现计算对象的内存大小示例
Jul 10 Python
OpenCV python sklearn随机超参数搜索的实现
Jan 17 Python
matplotlib基础绘图命令之errorbar的使用
Aug 13 Python
分享Python获取本机IP地址的几种方法
Mar 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
第五节--克隆
2006/11/16 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
通过AngularJS实现图片上传及缩略图展示示例
2017/01/03 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
JavaScript事件对象深入详解
2018/12/30 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
2019/10/17 Javascript
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
Python and、or以及and-or语法总结
2015/04/14 Python
Python自动重试HTTP连接装饰器
2015/04/28 Python
Python接收手机短信的代码整理
2020/08/02 Python
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
学术会议欢迎词
2014/01/09 职场文书
高三学习决心书
2014/03/11 职场文书
超市仓管员岗位职责
2014/04/07 职场文书
2014年党小组工作总结
2014/12/20 职场文书
避暑山庄导游词
2015/02/04 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers