【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 itchat实现微信好友头像拼接图的示例代码
Aug 14 Python
使用python爬虫实现网络股票信息爬取的demo
Jan 05 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 Python
python实现简单flappy bird
Dec 24 Python
python Dijkstra算法实现最短路径问题的方法
Sep 19 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
在jupyter notebook 添加 conda 环境的操作详解
Apr 10 Python
python中upper是做什么用的
Jul 20 Python
Python 实现一个计时器
Jul 28 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
Nov 11 Python
Django开发RESTful API实现增删改查(入门级)
May 10 Python
利用Matlab绘制各类特殊图形的实例代码
Jul 16 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
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
一个自定义位数的php多用户计数器代码
2007/03/11 PHP
PHP中文乱码解决方案
2015/03/05 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
2017/06/20 PHP
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
JQuery入门—编写一个简单的JQuery应用案例
2013/01/03 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
2014/06/16 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
React Native 截屏组件的示例代码
2017/12/06 Javascript
vue结合axios与后端进行ajax交互的方法
2018/07/06 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
2019/01/18 Javascript
vue3实现v-model原理详解
2019/10/09 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
举例介绍Python中的25个隐藏特性
2015/03/30 Python
Python中特殊函数集锦
2015/07/27 Python
Python爬虫代理IP池实现方法
2017/01/05 Python
Django中多种重定向方法使用详解
2019/07/17 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
python对文件的操作方法汇总
2020/02/28 Python
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
仪器仪表检测毕业生自荐信
2013/10/31 职场文书
商场经理竞聘演讲稿
2014/01/01 职场文书
企业内部培训方案
2014/02/04 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
基层党组织整改方案
2014/10/25 职场文书
2014年个人工作总结报告
2014/11/27 职场文书
2015教师年度考核评语
2015/03/25 职场文书
2016教师廉洁从教心得体会
2016/01/13 职场文书
干部外出学习心得体会
2016/01/18 职场文书
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle
DE1107机评
2022/04/05 无线电