Python 简单爬虫程序 以及 urllib.urlretrieve()方法 改变文件存放文件位置

本文介绍如何使用Python的urllib库批量下载网页中的图片,并保存到指定目录。通过正则表达式匹配图片链接,再利用for循环结合urllib.urlretrieve()方法实现图片的下载与重命名。

把筛选的图片地址通过for循环遍历并保存到本地,代码如下:

 

复制代码
#coding=utf-8
import urllib
import re

def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

def getImg(html):
    reg = r'src="(.+?\.jpg)" pic_ext'
    imgre = re.compile(reg)
    imglist = re.findall(imgre,html)
    x = 0
    for imgurl in imglist:
        urllib.urlretrieve(imgurl,'%s.jpg' % x)
        x+=1


html = getHtml("http://tieba.baidu.com/p/2460150866")

print getImg(html)
复制代码

 

  这里的核心是用到了urllib.urlretrieve()方法,直接将远程数据下载到本地。

  通过一个for循环对获取的图片连接进行遍历,为了使图片的文件名看上去更规范,对其进行重命名,命名规则通过x变量加1。保存的位置默认为程序的存放目录。

程序运行完成,将在目录下看到下载到本地的文件。


其中

urlretrieve(url, filename=None, reporthook=None, data=None)

  1. 参数 finename 指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
  2. 参数 reporthook 是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
  3. 参数 data 指 post 到服务器的数据,该方法返回一个包含两个元素的(filename, headers)元组,filename 表示保存到本地的路径,header 表示服务器的响应头。

比如我想把保存的文件命名为LALA1 LALA2 LALA3 。。。保存在 C:\ImageSave\ 文件夹内

urllib.urlretrieve(imgurl,'%s.jpg' % x)
        x+=1
改成
urllib.urlretrieve(imgurl,'C:\ImageSave\LALA%s.jpg' % x)
        x+=1
即可


参考:http://www.cnblogs.com/fnng/p/3576154.html

<think>在回答用户关于`urllib.request.urlretrieve`的问题,我需要结合引用内容,并提供全面的信息。用户明确要求使用方法、功能、注意事项等。根据引用[1],这是一个简单的示例,展示了如何导入模块、指定URL和文件名,然后调用函数下载图片。引用[2]说明`urllib`是内置,提到了`urlopen`和`urlretrieve`两个主要函数。引用[3]提到了可能遇到的403错误及其原因,引用[4]则显示了一个错误示例。 首先,我会介绍`urlretrieve`的基本功能:它用于将远程文件直接下载到本地。然后,详细说明其参数:第一个是URL,第二个是本地路径(可选),以及可选的回调函数用于显示进度等。接着,通过代码示例演示具体用法。 注意事项部分特别重要。引用[3]提到403错误,我需要解释原因和解决方法,例如设置User-Agent头模拟浏览器访问。此外,还需补充其他常见问题,如下载文件内存效率高、不支持认证机制、可能被反爬策略拦截等。最后,强调该函数已被标记为“legacy”,建议在新代码中使用更现代的替代方案如`requests`。 为了确保回答可靠,我会基于标准文档和常见实践扩展引用内容,例如详细说明回调函数参数和错误处理方法。相关问题设计需围绕函数使用场景、错误排查和替代方案展开。 </think>以下是关于`urllib.request.urlretrieve()`的详细指南及相关介绍,结合引用内容进行说明: ### 一、功能与用途 `urllib.request.urlretrieve()`是Python标准中用于**直接下载网络资源到本地文件**的函数,主要特点: 1. **简单高效**:无需手动处理网络请求和文件写入流程 2. **适用场景**:下载图片、文档、媒体文件等静态资源 3. **内存友好**:大文件下载不会占用过多内存(流式写入) ### 二、基本语法 ```python import urllib.request urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None) ``` - **`url`**:资源地址(字符串,必需) - **`filename`**:本地保存路径(字符串,可选) - 缺省生成临文件,返回临文件路径 - **`reporthook`**:进度回调函数(用于显示下载进度) - **`data`**:POST请求发送的数据(字典或字节流) ### 三、使用示例 ```python import urllib.request # 示例1:基本下载(引用[1]示例) url = 'https://example.com/image.jpg' urllib.request.urlretrieve(url, "local_image.jpg") # 示例2:获取临文件路径 temp_file, headers = urllib.request.urlretrieve(url) print("临文件路径:", temp_file) ``` ### 四、注意事项 1. **403 Forbidden错误处理**(引用[3]) - **原因**:服务器检测到爬虫行为(缺少User-Agent/Cookie等) - **解决方案**:添加请求头模拟浏览器访问 ```python opener = urllib.request.build_opener() opener.addheaders = [('User-Agent', 'Mozilla/5.0')] urllib.request.install_opener(opener) # 全局生效 urllib.request.urlretrieve(url, "file.png") ``` 2. **进度监控** ```python def progress_hook(count, block_size, total_size): percent = int(count * block_size * 100 / total_size) print(f"下载进度: {percent}%") urllib.request.urlretrieve(url, "file.zip", reporthook=progress_hook) ``` 3. **遗留状态警告** - 官方文档标注为"legacy",可能在将来版本弃用 - 替代方案:使用更灵活的`requests`或`urlopen()+shutil.copyfileobj()` ```python import requests response = requests.get(url) with open("file.pdf", "wb") as f: f.write(response.content) ``` 4. **异常处理** ```python try: urllib.request.urlretrieve(url, "data.txt") except urllib.error.HTTPError as e: print(f"HTTP错误: {e.code} - {e.reason}") except urllib.error.URLError as e: print(f"URL错误: {e.reason}") ``` ### 五、适用场景 1. 快速下载公开静态资源 2. 简单脚本中的小文件下载 3. 无需会话保持(Cookie)的下载任务 > **关键建议**:重要项目建议使用`requests`,提供更完善的错误处理和HTTP功能。对于需要Cookie/Session验证的下载(引用[3]),`requests`可简化流程: > ```python > session = requests.Session() > session.get(login_url) # 先登录 > response = session.get(protected_url) > ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值