【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
作者:xiaoguaihai 发布时间:2021-04-26 18:19:14
由于需要从某个网页上下载一些PDF文件,但是需要下载的PDF文件有几百个,所以不可能用人工点击来下载。正好Python有相关的模块,所以写了个程序来进行PDF文件的下载,顺便熟悉了Python的urllib模块和ulrllib2模块。
1、问题描述
需要从http://www.cvpapers.com/cvpr2014.html上下载几百个论文的PDF文件,该网页如下图所示:
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的同学有帮助。谢谢!
来源:http://blog.csdn.net/xiaoguaihai/article/details/36016387
猜你喜欢
- 什么是性能分析?性能分析是衡量应用程序在代码级别的相对性能。性能分析将捕捉的事件包括:CPU的使用,内存的使用,函数的调用时长和次数,以及调
- 一、语法while 条件:执行代码while就是当的意思,它指当其后面的条件成立,就执行while下面的代码。例:写一个从0打印到10的程序
- 实例是具象化的类,它可以作为类访问所有静态绑定到类上的属性,包括类变量与方法,也可以作为实例访问动态绑定到实例上的属性。实例1:class
- 今天用Python提取了Linux内核源代码的目录树结构,没有怎么写过脚本程序,我居然折腾了2个小时,先是如何枚举出给定目录下的所有文件和文
- Array.prototype中定义了很多操作数组的方法,下面介绍ECMAScript3中的一些方法1.Array.join()方法该方法将
- fileinput模块提供处理一个或多个文本文件的功能,可以通过使用for循环来读取一个或多个文本文件的所有行。它的工作方式和readlin
- 一、变量创建过程首先,当我们定义了一个变量name = 'Kwan'的时候,在内存中其实是做了这样一件事:程序开辟了一块内存
- 如何让你的CSS代码更具有组织性和易维护性,为什么你的样式表总是臃肿和混乱的?有些时候是源于一开始书写时的混乱和草率,有时候也是因为后期的维
- 针对很普遍的每个元素的操作会遍历每个元素进行操作。这里给出了几种写法,列表每个元素自增等数学操作同理;示例:整形列表ilist加1个数、元素
- 一个3层嵌套列表mm=["a",["b","c",["inner&qu
- 1 问题在使用pyecharts绘制可视化地图信息时候,默认出现的图像是带有圆点标记,比如官网代码运行输出如下:2 问题解决方式一: sho
- 1、django搜索路径使用 import 语句时,Python 所查找的系统目录清单。查看方式:import sysprint
- 主要代码如下: total = application("All
- pydantic是一个Python的数据验证和转换库,它的特点是轻量、快速、可扩展、可配置。笔者常用的用于数据接口schema定义与检查。具
- 本文通过Python3+pyqt5实现了python Qt GUI 快速编程的16章的excise例子。#!/usr/bin/env pyt
- 本文实例讲述了PHP的HTTP客户端Guzzle简单使用方法。分享给大家供大家参考,具体如下:首先来一段官方文档对Guzzle的介绍:然后c
- 第一招、mysql服务的启动和停止net stop mysqlnet start mysql第二招、登陆mysql语法如下: mysql -
- 决定数据类型的第一步是定义所存数数据的分类: 数值型, 字符串型还是临时型等;除了一些特别的并不是那么直观的外, 这通常是很直观的。接下来是
- 当我们定义一个类的时候,有时候会定义一个私有属性来辅助开发。在其它语言中经常会用到 private 来修饰这个属性为私有属性。可是你知道么?
- 单目标跟踪:直接调用opencv中封装的tracker即可。#!/usr/bin/env python3# -*- coding: utf-