4.5

本文介绍了如何使用Python的urllib库进行网络资源的下载及管理,包括如何指定本地保存路径、使用回调函数显示下载进度等。同时,还探讨了requests库在处理大文件下载时的stream模式,并给出了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from urllib.request import urlretrieve

urlretrieve(xxx)

/

urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)

将URL表示的网络对象复制到本地文件。如果URL指向本地文件,则对象将不会被复制,除非提供文件名。返回一 个 元组()(filename,header),其中filename是可以找到对象的本地文件名,header是urlopen()返回的对象的info()

方法(用于远程对象)。第二个参数(如果存在)指定要复制到的文件位置(如果没有,该位置将是一个生成名称的temp

file)。第三个参数,如果存在,则是一个回调函数,它将在建立网络连接时调用一次,并且在此后每个块读取后调

用一次。这个回调函数将传递三个参数;到目前为止传输的块计数,以字节为单位的块大小,以及文件的总大小。第

三个参数可能是-1,在旧的FTP服务器上,它不返回文件大小以响应检索请求。

url:外部或者本地urlfilename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来

保存数据);reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调

。我们可以利用这个回调函数来显示当前的下载进度。data:指post到服务器的数据。该方法返回一个包含两个

元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。

import os

import urllib

import sys

import requests

DATA_URL = 'www.python.org/ftp/python/…'

filename = DATA_URL.split('/')[-1]

def _progress(block_num, block_size, total_size):

'''回调函数

   @block_num: 已经下载的数据块

   @block_size: 数据块的大小

   @total_size: 远程文件的大小

'''

sys.stdout.write('\r>> Downloading %s %.1f%%' % (filename,

                 float(block_num * block_size) / float(total_size) * 100.0))

sys.stdout.flush()
复制代码

filepath, _ = urllib.request.urlretrieve(DATA_URL, filename, _progress)

print()

例子中的sys.stdout.write和print差不多是输出的意思,sys.stdout.flush()函数的作用是刷新输出

  • python模块中requests参数stream

当下载大的文件的时候,建议使用streaM模式.

默认情况下是false,他会立即开始下载文件并存放到内存当中,倘若文件过大就会导致内存不足的情况.

当把get函数的stream参数设置成True时,它不会立即开始下载,当你使用iter_content或iter_lines遍历内容或

访问内容属性时才开始下载。需要注意一点:文件没有下载之前,它也需要保持连接。

iter_content:一块一块的遍历要下载的内容

iter_lines:一行一行的遍历要下载的内容

使用上面两个函数下载大文件可以防止占用过多的内存,因为每次只下载小部分数据。

示例代码:

r = requests.get(url_file, stream=True)

f = open("file_path", "wb")

for chunk in r.iter_content(chunk_size=512):

 if chunk:

     f.write(chunk)
复制代码

urlopen返回的应答对象response(或者HTTPError实例)有两个很有用的方法info()和geturl()

1.geturl():

这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许会有重定向。获取的URL或许

跟请求URL不同。

time

time .sleep() 间歇休息

time.ctime() 返回当前时间的字符串版本

random 随机数生成器

random.seed(5) 随机数种子为5

取样random模块里

shuffle(a)洗牌 打乱顺序 无返回值,原地修改原始列表顺序。

choice(a) 随机选择列表一个值

sample(a,3)随机选取几个值

一些快捷键:

ctrl+shift+i=F12啊…

ctrl+F 查找

抓包

当你要抓的包是需要按F5刷新才出来的,一般我们需要的请求都在DOC里面(整个页面有刷新)

当你要抓的包是点击按钮"加载更多"(或者拖到页面最下面会自动加载的,整个页面并没有刷新)一般我们需要的请求都在XHR里面

简单来讲就是如果整个页面没有刷新的话,那就是在XHR里面,否则在DOC里面

因为本次抓包整个页面有刷新,所以,我们需要找的请求在DOC下面,可以看到只有一个请求

headers 里面我们都有介绍过(请求头,返回头)

preview和response里面的内容是相同的(preview里面的内容格式化了,输出的好看一些),里面的内容是html返回值

cookies 里面是cookie的值,只不过分成了key value的形式

当你要抓的网页是会自动跳转的话,那么你需要选中“proserve log”

OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。

PUT:向指定资源位置上传其最新内容。

DELETE:请求服务器删除Request-URI所标识的资源。

TRACE:回显服务器收到的请求,主要用于测试或诊断。 trace

CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。 connect

常见状态代码、状态描述、说明:

200 OK //请求成功

400 Bad Request //客户端请求有语法错误,不能被服务器所理解

401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用

403 Forbidden //服务器收到请求,但是拒绝提供服务

404 Not Found //请求资源不存在,eg:输入了错误的URL

500 Internal Server Error //服务器发生不可预期的错误

503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值