【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文件操作类操作实例详解
Jul 11 Python
Python性能优化技巧
Mar 09 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
Jun 22 Python
Python list列表中删除多个重复元素操作示例
Feb 27 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
pytorch 使用加载训练好的模型做inference
Feb 20 Python
python爬虫实现获取下一页代码
Mar 13 Python
python sitk.show()与imageJ结合使用常见的问题
Apr 20 Python
使用已经得到的keras模型识别自己手写的数字方式
Jun 29 Python
简单的命令查看安装的python版本号
Aug 28 Python
python实现Thrift服务端的方法
Apr 20 Python
python代码实现扫码关注公众号登录的实战
Nov 01 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/02/14 PHP
php5新改动之短标记启用方法
2008/09/11 PHP
对淘宝URL中ID提取的PHP代码
2013/09/01 PHP
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
jquery禁止回车触发表单提交
2014/12/12 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
实例详解jQuery表单验证插件validate
2016/01/18 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
2016/07/21 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
详解angular2 控制视图的封装模式
2018/12/27 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
Python 实现微信防撤回功能
2019/04/29 Python
opencv实现简单人脸识别
2021/02/19 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
Python基于smtplib协议实现发送邮件
2020/06/03 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
2014年大班元旦活动方案
2014/02/26 职场文书
会务接待方案
2014/02/27 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android
在项目中使用redis做缓存的一些思路
2021/09/14 Redis
vue中使用mockjs配置和使用方式
2022/04/06 Vue.js
Python四款GUI图形界面库介绍
2022/06/05 Python
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript