【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中的生成器和yield详细介绍
Jan 09 Python
Python中装饰器高级用法详解
Dec 25 Python
Python键盘输入转换为列表的实例
Jun 23 Python
如何安装多版本python python2和python3共存以及pip共存
Sep 18 Python
python 定时器,实现每天凌晨3点执行的方法
Feb 20 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
详解numpy.meshgrid()方法使用
Aug 01 Python
Python多线程模块Threading用法示例小结
Nov 09 Python
Python文字截图识别OCR工具实例解析
Mar 05 Python
Python selenium键盘鼠标事件实现过程详解
Jul 28 Python
Pycharm github配置实现过程图解
Oct 13 Python
python中把元组转换为namedtuple方法
Dec 09 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基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
jquery 简单的进度条实现代码
2010/03/11 Javascript
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
深入理解python中的atexit模块
2017/03/07 Python
python爬取网易云音乐评论
2018/11/16 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
python退出循环的方法
2020/06/18 Python
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
党支部书记岗位责任制
2014/02/11 职场文书
升国旗仪式主持词
2014/03/19 职场文书
公务员保密承诺书
2014/03/27 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
学校政风行风评议心得体会
2014/10/21 职场文书
淘宝好评语句大全
2014/12/31 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
升学宴家长致辞
2015/07/27 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
聊聊Lombok中的@Builder注解使用教程
2021/11/17 Java/Android