python批量爬取图片(超简单教程)

本文提供了一个简单的Python脚本,利用request库抓取指定网址上的图片并保存到本地。脚本包括get_image函数用于抓取单张图片,get_urls函数获取网页中的所有图片URL,从一个包含多个目标网址的HTML文件中读取并遍历,将图片下载到指定文件夹。

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

request的python抓取图片抓取功能:对给入的多个网址:每个网址的所有图片进行抓取并保存指定的文件中。

本版本小白版本拿来即用,作为研究工具。算法学习。

限制:get请求

安装包要求:

pip install requests

话不多说,直接上代码:

首先写一个函数抓取一张图片get_image(url,name)

学习版

(1)文件名:抓取批量图片.py

import requests,re
def get_image(url,name):#抓取一张图片,name为图片文件名称,例如name.png,这个见下面迭代使用
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
    }#爬虫的时候需要headers和url获取数据(人在浏览网页时这些都是浏览器需要做的)
    res=requests.get(url,headers=headers)#requests得到图片内容
    with open("D://pythonProject1//toimage//"+f"{name}.png",'wb') as f:#建立一个空白png文件
        #D://pythonProject1//toimage//是保存路径,一张照片的位置例如D://pythonProject1//toimage//1.png,不要忘了末尾的//,路径格式使用python格式
        f.write(res.content)#将requests得到的图片内容写入空白png文
<think>我们正在讨论Python批量爬取图片的问题。根据用户需求,我们需要实现一个能够从百度图片批量下载图片爬虫程序。注意:爬虫行为应当遵守网站的使用条款,尊重版权,避免对目标网站造成过大压力。步骤:1.分析百度图片的搜索接口2.构造请求URL3.发送请求并解析响应(注意:百度图片的搜索结果页是动态加载的,我们可以通过分析翻页参数来获取图片数据)4.提取图片URL5.下载图片并保存到本地根据引用[3]中提供的URL格式,我们可以构造如下:url= 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%s&pn=%d' %(keyword, page_index*20)其中,keyword是搜索关键词,pn参数表示从第几张图片开始(每页大约20张图片,所以翻页时pn每次增加20)。但是,百度图片的页面是动态加载的,返回的是HTML页面,其中包含图片信息的JSON数据。我们可以通过正则表达式提取JSON数据,然后解析图片URL。另一种方法是分析百度图片的Ajax请求,但百度图片的接口可能会变化。这里我们采用解析HTML中嵌入的JSON数据的方式。具体步骤:1.发送请求,获取网页内容。2.在网页内容中,我们可以找到包含图片信息的JSON字符串(通常在一个名为`data`的变量中),使用正则表达式提取。3.解析JSON,获取图片的URL(注意:百度图片的JSON结构较复杂,图片URL可能位于多个字段中,我们需要找到高清大图的URL)。4.下载图片。但是,百度图片为了防止爬虫,可能会对反爬措施,因此我们需要设置请求头(User-Agent等)。另外,注意引用[1]和[2]中提到的教程,我们可以参考其中的方法。考虑到百度图片的页面结构可能变化,我们这里提供一种常用的方法:通过观察,百度图片的搜索结果页中,图片信息被包含在`<script>`标签中,格式类似于:window.jsonData =...;我们可以通过正则表达式提取这个JSON字符串。但是,实际上百度图片的页面中,图片数据是在一个名为`data`的数组中,我们可以尝试搜索`"thumbURL":"http://...`这样的字符串。然而,更可靠的方法是使用正则表达式匹配整个JSON数组。但这里为了简单,我们直接使用正则匹配图片的原始URL(thumbURL字段)。注意:百度图片返回的图片URL有多个字段,我们通常使用`thumbURL`(缩略图)或者`hoverURL`(鼠标悬停时显示的图片,可能较大),但有时候这些图片不够清晰。我们可以尝试使用`objURL`(原始图片链接,但可能是其他网站的链接,下载时需要注意)或者`middleURL`(中等大小图片)。我们这里选择`thumbURL`作为示例。但是,引用[3]中使用的URL构造方式,我们可以参考其翻页参数。实现代码步骤:1.导入必要的库:requests,re,os,time2.定义搜索关键词和保存路径3.构造请求头,模拟浏览器4.循环翻页,构造每一页的URL5.发送请求,获取响应文本6.使用正则表达式提取图片URL(这里我们提取thumbURL字段)7.遍历图片URL,下载并保存注意:下载图片时,需要设置stream=True以避免大文件一次读入内存。但是,百度图片的搜索结果页中,图片URL是直接可用的吗?实际上,我们提取的thumbURL可以直接用于下载。代码示例:注意:由于百度图片可能有反爬机制,我们可能需要使用代理或增加延迟。另外,如果请求频繁,可能会被限制,因此建议在循环中增加延时。下面我们编写代码:注意:本代码仅供学习参考,请勿用于非法用途或对百度服务器造成压力。</think>我将为您详细介绍如何使用Python批量爬取和下载图片,并提供完整代码示例。 ### Python批量图片爬取方案 #### 核心步骤 1. **分析目标网站结构** 百度图片的搜索接口为: `https://image.baidu.com/search/flip?tn=baiduimage&word=[关键词]&pn=[页码]` 其中`pn`参数控制翻页(每页约20张图片) 2. **提取图片URL** 在返回的HTML中,图片URL隐藏在JSON数据中,可通过正则表达式提取: ```python pattern = re.compile(r'"thumbURL":"(.*?)"') ``` 3. **下载图片** 使用`requests`库实现高效下载: ```python with open(file_path, 'wb') as f: f.write(requests.get(img_url, headers=headers).content) ``` #### 完整代码 ```python import requests import re import os import time def download_baidu_images(keyword, max_count=100, save_dir='images'): """ 批量下载百度图片 :param keyword: 搜索关键词 :param max_count: 最大下载数量 :param save_dir: 保存目录 """ # 创建保存目录 os.makedirs(save_dir, exist_ok=True) # 请求头设置 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } # 图片计数器和页码 count = 0 page = 0 while count < max_count: # 构造请求URL url = f'https://image.baidu.com/search/flip?tn=baiduimage&word={keyword}&pn={page*20}' try: # 发送请求 response = requests.get(url, headers=headers) response.encoding = 'utf-8' html = response.text # 正则提取图片URL img_urls = re.findall(r'"thumbURL":"(.*?)"', html) if not img_urls: print("未找到图片,可能已达限制") break # 下载图片 for img_url in img_urls: if count >= max_count: break try: # 获取图片二进制数据 img_data = requests.get(img_url, headers=headers, timeout=10).content # 生成文件名 file_name = f"{keyword}_{count}.jpg" file_path = os.path.join(save_dir, file_name) # 保存图片 with open(file_path, 'wb') as f: f.write(img_data) print(f"已下载: {file_name}") count += 1 except Exception as e: print(f"下载失败 {img_url}: {str(e)}") # 防止请求过快 time.sleep(0.5) page += 1 except Exception as e: print(f"请求失败: {str(e)}") break # 使用示例 if __name__ == "__main__": download_baidu_images(keyword="风景", max_count=50) ``` #### 关键注意事项 1. **请求频率控制** - 添加`time.sleep(0.5)`避免触发反爬机制 - 随机化等待时间更安全:`time.sleep(random.uniform(0.3, 1.2))` 2. **请求头设置** 必须包含有效的`User-Agent`,模拟浏览器行为 3. **错误处理** - 网络时:`requests.get(..., timeout=10)` - 异常捕获:防止单张图片失败中断整个流程 4. **代理设置(可选)** 如需使用代理: ```python proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080' } requests.get(url, proxies=proxies) ``` #### 优化建议 1. **多线程下载** 使用`concurrent.futures`加速下载: ```python from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(max_workers=5) as executor: executor.map(download_single_image, img_url_list) ``` 2. **断点续传** 记录已下载URL,重启时跳过: ```python if os.path.exists('downloaded.log'): with open('downloaded.log') as f: downloaded = set(f.read().splitlines()) ``` 3. **图片去重** 使用MD5校验重复图片: ```python import hashlib md5 = hashlib.md5(img_data).hexdigest() ``` ### 法律与道德提示 1. 遵守目标网站的`robots.txt`协议 2. 尊重版权,仅下载授权允许的图片 3. 避免高频请求(建议≥0.5秒/请求) 4. 商业用途需获得图片授权
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值