【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之入门(二)基本数据类型
May 25 Python
跟老齐学Python之传说中的函数编写条规
Oct 11 Python
Python中用memcached来减少数据库查询次数的教程
Apr 07 Python
python在指定目录下查找gif文件的方法
May 04 Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 Python
Python3最长回文子串算法示例
Mar 04 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
这可能是最好玩的python GUI入门实例(推荐)
Jul 19 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
Sep 16 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
关于pytorch中全连接神经网络搭建两种模式详解
Jan 14 Python
django前端页面下拉选择框默认值设置方式
Aug 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生成月历代码
2007/06/14 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
PHP安全上传图片的方法
2015/03/21 PHP
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
js里怎么取select标签里的值并修改
2012/12/10 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
2013/08/29 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
浅谈Vue.nextTick 的实现方法
2017/10/25 Javascript
vue-cli项目中使用Mockjs详解
2018/05/14 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
element-ui组件table实现自定义筛选功能的示例代码
2019/03/15 Javascript
ES6中Set和Map用法实例详解
2020/03/02 Javascript
详解node.js 事件循环
2020/07/22 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
Linux环境下MySQL-python安装过程分享
2015/02/02 Python
python笔记:mysql、redis操作方法
2017/06/28 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
2018/02/08 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
德国网上药房:Apotal
2017/04/04 全球购物
巴西食品补充剂在线零售商:Músculos na Web
2017/08/07 全球购物
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
描述RIP和OSPF区别以及特点
2015/01/17 面试题
优秀应届毕业生自荐信
2013/11/16 职场文书
18岁生日感言
2014/01/12 职场文书
小学教师国培感言
2014/02/08 职场文书
高三毕业典礼主持词
2014/03/27 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
初中家长评语和期望
2014/12/26 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
情感电台广播稿
2015/08/18 职场文书
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL
Python基本知识点总结
2022/04/07 Python