杰瑞科技汇

Python网页图片如何获取?

当人们提到 "Python 网页图片" 时,他们可能想做以下几件事之一:

Python网页图片如何获取?-图1
(图片来源网络,侵删)
  1. 从网页上下载图片:这是最常见的需求,即编写一个 Python 脚本,自动访问某个网页,并找到其中的图片链接,然后将图片下载到本地。
  2. 分析网页中图片的信息:获取图片的 URL、文件名、尺寸、alt 文本等元数据。
  3. 为网页生成缩略图:将网页保存为图片,或者将网页中的图片处理成缩略图。

下面我将重点讲解第一种和第二种情况,因为它们最为实用。


从网页上批量下载图片

这是最经典的网络爬虫任务,我们将使用两个非常流行的 Python 库:

  • requests: 用于发送 HTTP 请求,获取网页的 HTML 内容。
  • BeautifulSoup: 用于解析 HTML 内容,轻松地找到我们需要的元素(比如图片标签)。

步骤 1:安装必要的库

如果你还没有安装这两个库,可以通过 pip 来安装:

pip install requests
pip install beautifulsoup4

步骤 2:编写 Python 脚本

下面是一个完整的示例,它会访问一个示例网页(这里用 unsplash.com 作为例子,因为它图片质量高且结构相对简单),并下载所有它找到的图片。

Python网页图片如何获取?-图2
(图片来源网络,侵删)
import requests
from bs4 import BeautifulSoup
import os
import time
def download_images_from_webpage(url, folder_name='downloaded_images'):
    """
    从指定URL的网页上下载所有图片。
    """
    # 1. 创建保存图片的文件夹
    if not os.path.exists(folder_name):
        os.makedirs(folder_name)
        print(f"文件夹 '{folder_name}' 已创建。")
    # 2. 发送 HTTP 请求获取网页内容
    try:
        # 添加 User-Agent 模拟浏览器访问,避免被某些网站阻止
        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'
        }
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()  # 如果请求失败 (404, 500),则抛出异常
    except requests.exceptions.RequestException as e:
        print(f"无法获取网页内容: {e}")
        return
    # 3. 使用 BeautifulSoup 解析 HTML
    soup = BeautifulSoup(response.text, 'html.parser')
    # 4. 查找所有的 <img> 标签
    img_tags = soup.find_all('img')
    if not img_tags:
        print("在网页上没有找到任何图片。")
        return
    print(f"找到 {len(img_tags)} 张图片,开始下载...")
    # 5. 遍历所有图片标签并下载
    for index, img_tag in enumerate(img_tags):
        # 获取图片的 src 属性
        img_url = img_tag.get('src')
        # 有些图片可能是相对路径,需要转换为绝对路径
        if img_url and not img_url.startswith('http'):
            img_url = requests.compat.urljoin(url, img_url)
        if not img_url:
            continue
        # 获取图片的文件名,如果URL中没有,则使用一个默认名
        try:
            filename = os.path.basename(img_url.split('?')[0]) # 去掉URL中的查询参数
            if not filename or '.' not in filename:
                filename = f"image_{index + 1}.jpg"
        except:
            filename = f"image_{index + 1}.jpg"
        filepath = os.path.join(folder_name, filename)
        try:
            # 下载图片
            img_response = requests.get(img_url, headers=headers, stream=True, timeout=10)
            img_response.raise_for_status()
            # 保存图片到文件
            with open(filepath, 'wb') as f:
                for chunk in img_response.iter_content(8192):
                    f.write(chunk)
            print(f"已成功下载: {filename}")
        except requests.exceptions.RequestException as e:
            print(f"下载图片失败 {img_url}: {e}")
        # 添加一个小的延时,避免请求过于频繁
        time.sleep(0.5)
# --- 使用示例 ---
if __name__ == "__main__":
    # 替换成你想要爬取的网页URL
    # 注意:爬取他人网站前,请务必查看其 'robots.txt' 和 '服务条款'
    target_url = "https://unsplash.com/t/nature"
    download_images_from_webpage(target_url)

代码解释:

  1. 创建文件夹:使用 os.makedirs() 创建一个用于存放下载图片的文件夹,如果文件夹不存在的话。
  2. 发送请求requests.get() 用于获取网页的 HTML,我们设置了 headers 来模拟浏览器,这是很多网站反爬虫的简单策略。timeout 设置了请求超时时间。
  3. 解析 HTMLBeautifulSoup(response.text, 'html.parser') 将获取到的 HTML 文本解析成一个对象,方便我们后续查找元素。
  4. 查找图片soup.find_all('img') 会找到页面中所有的 <img> 标签,并返回一个列表。
  5. 处理图片 URL
    • img_tag.get('src') 获取 <img> 标签中的 src 属性,这个属性就是图片的链接。
    • requests.compat.urljoin(url, img_url) 用于处理相对路径,如果 src/images/logo.pngurljoin 会自动把它补全成 https://example.com/images/logo.png
    • 我们从 URL 中提取文件名,并处理一些特殊情况(如没有后缀名)。
  6. 下载并保存
    • requests.get(..., stream=True) 使用流式下载,对于大文件更节省内存。
    • with open(...) 以二进制写入模式 ('wb') 打开文件。
    • iter_content(8192) 分块读取下载内容,并写入文件。
    • time.sleep(0.5) 是一个礼貌的延时,避免对目标服务器造成过大压力。

获取网页中图片的元数据

有时候我们不想下载图片,只是想获取它们的 URL、alt 文本等信息,这非常简单,只需修改上面的代码,去掉下载部分即可。

import requests
from bs4 import BeautifulSoup
def get_image_info_from_webpage(url):
    """
    获取网页中所有图片的URL和alt文本。
    """
    try:
        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'
        }
        response = requests.get(url, headers=headers)
        response.raise_for_status()
    except requests.exceptions.RequestException as e:
        print(f"无法获取网页内容: {e}")
        return
    soup = BeautifulSoup(response.text, 'html.parser')
    img_tags = soup.find_all('img')
    image_data = []
    for img_tag in img_tags:
        img_info = {
            'src': img_tag.get('src'),
            'alt': img_tag.get('alt', 'N/A'), # 获取alt文本,如果不存在则返回'N/A'
            'title': img_tag.get('title', 'N/A') # 获取title文本
        }
        image_data.append(img_info)
    return image_data
# --- 使用示例 ---
if __name__ == "__main__":
    target_url = "https://www.python.org/"
    image_info_list = get_image_info_from_webpage(target_url)
    if image_info_list:
        print(f"在网页上找到 {len(image_info_list)} 张图片的信息:")
        for i, info in enumerate(image_info_list):
            print(f"--- 图片 {i+1} ---")
            print(f"URL: {info['src']}")
            print(f"Alt文本: {info['alt']}")
            print(f"Title文本: {info['title']}")
            print("-" * 20)
    else:
        print("未找到图片信息。")

⚠️ 重要提醒:合法性与道德规范

在编写爬虫脚本时,请务必遵守以下几点:

  1. 检查 robots.txt:几乎所有网站都有一个 robots.txt 文件(https://www.example.com/robots.txt),它规定了哪些页面可以爬取,哪些不可以,请尊重网站的规定。
  2. 查看服务条款:有些网站的服务条款明确禁止自动化访问,在爬取前,最好快速浏览一下。
  3. 不要过于频繁地请求:过高的请求频率会给目标服务器带来巨大压力,可能导致你的 IP 被封禁,在脚本中加入 time.sleep() 是一个好习惯。
  4. 注明身份:在 headers 中可以加入一个联系邮箱,表明你的身份和用途,'From': 'your_email@example.com'

希望这个详细的解答能帮助你解决问题!如果你有更具体的需求(比如处理 JavaScript 渲染的页面),可以再提问,我们可以使用 SeleniumPlaywright 等更强大的工具来解决。

Python网页图片如何获取?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇