【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命名空间详解
Aug 18 Python
Python脚本实现格式化css文件
Apr 08 Python
利用Python如何生成hash值示例详解
Dec 20 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
Apr 19 Python
python对离散变量的one-hot编码方法
Jul 11 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
Python程序打包工具py2exe和PyInstaller详解
Jun 28 Python
如何安装2019Pycharm最新版本(详细教程)
Sep 26 Python
Django2 连接MySQL及model测试实例分析
Dec 10 Python
Python Selenium安装及环境配置的实现
Mar 17 Python
python 模拟登录B站的示例代码
Dec 15 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乱码问题
2012/03/25 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
JQuery+JS实现仿百度搜索结果中关键字变色效果
2011/08/02 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
2013/03/26 Javascript
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
2016/08/24 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
nodejs个人博客开发第三步 载入页面
2017/04/12 NodeJs
详解npm 配置项registry修改为淘宝镜像
2018/09/07 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
JS实现网站吸顶条
2020/01/08 Javascript
python保存字符串到文件的方法
2015/07/01 Python
Python数据结构之单链表详解
2017/09/12 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
python3+selenium自动化测试框架详解
2019/03/17 Python
Python3.5装饰器原理及应用实例详解
2019/04/30 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
2019/10/11 Python
python代码如何注释
2020/06/01 Python
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
全球采购的街头服饰和帽子:Urban Excess
2020/10/28 全球购物
vue实现倒计时功能
2021/03/24 Vue.js
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
工作中个人的自我评价
2013/12/31 职场文书
学习之星事迹材料
2014/05/17 职场文书
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技
mysql中关键词exists的用法实例详解
2022/06/10 MySQL