python爬虫抓取网页图片教程


前言

以下是一个使用 Python 编写爬虫来抓取网页图片的详细教程,将以requests库发送 HTTP 请求,BeautifulSoup库解析 HTML 页面为例进行介绍。


1. 环境准备

1.1Python安装

访问 Python 官方网站,根据你的操作系统(Windows、Mac 或 Linux)下载并安装 Python 3.x 版本。安装时勾选 “Add Python to PATH”,方便在命令行中使用 Python。

Python 3.11安装教程:https://blog.csdn.net/u014164303/article/details/145549489
Python 3.13安装教程:https://blog.csdn.net/u014164303/article/details/146024500

Python 3.11下载地址:https://pan.quark.cn/s/9c44793cb24c
Python 3.13下载地址:https://pan.quark.cn/s/bce37ebd7f70

1.2选择Python开发环境

PyCharm 社区版(免费)或专业版(需付费或申请教育版)。安装完成后,打开 PyCharm,创建一个新的项目,在项目设置中选择之前创建的虚拟环境作为项目的 Python 解释器。PyCharm 功能强大,提供代码自动补全、调试等功能,适合开发大型项目。

Pycharm安装教程:https://blog.csdn.net/u014164303/article/details/145674773
PyCharm下载地址:https://pan.quark.cn/s/5756c8cf8b2a

1.3安装必要库

在开始之前,你需要安装requests和beautifulsoup4库。可以使用以下命令进行安装:

pip install requests beautifulsoup4

2. 编写爬虫代码

import requests
from bs4 import BeautifulSoup
import os

# 定义要抓取的网页 URL
url = 'https://example.com'  # 替换为实际要抓取的网页 URL

# 定义保存图片的文件夹
save_folder = 'downloaded_images'
if not os.path.exists(save_folder):
    os.makedirs(save_folder)

# 发送 HTTP 请求获取网页内容
try:
    response = requests.get(url)
    response.raise_for_status()  # 检查请求是否成功
except requests.RequestException as e:
    print(f"请求网页时出错: {e}")
else:
    # 使用 BeautifulSoup 解析 HTML 内容
    soup = BeautifulSoup(response.text, 'html.parser')

    # 查找所有的图片标签
    img_tags = soup.find_all('img')

    for img in img_tags:
        # 获取图片的 src 属性
        img_url = img.get('src')

        if img_url:
            # 处理相对 URL
            if not img_url.startswith('http'):
                img_url = url.rsplit('/', 1)[0] + '/' + img_url

            try:
                # 发送请求下载图片
                img_response = requests.get(img_url)
                img_response.raise_for_status()

                # 提取图片文件名
                img_filename = os.path.join(save_folder, img_url.split('/')[-1])

                # 保存图片到本地
                with open(img_filename, 'wb') as f:
                    f.write(img_response.content)
                print(f"成功下载图片: {img_filename}")
            except requests.RequestException as e:
                print(f"下载图片 {img_url} 时出错: {e}")
                

3. 代码解释

  • 导入必要的库:requests库用于发送 HTTP 请求,BeautifulSoup库用于解析 HTML 页面,os库用于处理文件和文件夹操作。
    定义要抓取的网页 URL 和保存图片的文件夹:将url替换为你实际要抓取的网页 URL,代码会自动创建一个名为downloaded_images的文件夹来保存下载的图片。
  • 发送 HTTP 请求:使用requests.get()方法发送 GET 请求获取网页内容,并使用raise_for_status()方法检查请求是否成功。
  • 解析 HTML 内容:使用BeautifulSoup解析 HTML 内容,查找所有的标签。
    处理图片 URL:获取每个标签的src属性,处理相对 URL 使其成为完整的 URL。
    下载图片:发送请求下载图片,并将图片内容保存到本地文件中。

4. 注意事项

反爬虫机制:许多网站都有反爬虫机制,可能会对频繁的请求进行限制或封禁 IP。为了避免这种情况,可以设置合适的请求头(如User-Agent),模拟浏览器行为,或者设置适当的请求间隔时间。

headers = {
    
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)

图片链接有效性:有些图片链接可能是无效的或者指向其他资源,代码中已经进行了简单的错误处理,但在实际应用中可能需要更完善的处理逻辑。
法律合规:在进行网页抓取时,要确保遵守相关法律法规和网站的使用条款,不要进行非法或未经授权的抓取行为。

5. 进阶优化

如果需要处理动态加载的图片(例如使用 JavaScript 动态加载的图片),可以使用Selenium库结合浏览器驱动来模拟浏览器行为,获取完整的页面内容。以下是一个简单的示例:

from selenium import webdriver
from bs4 import BeautifulSoup
import requests
import os

# 定义要抓取的网页 URL
url = 'https://example.com'  # 替换为实际要抓取的网页 URL

# 定义保存图片的文件夹
save_folder = 'downloaded_images'
if not os.path.exists(save_folder):
    os.makedirs(save_folder)

# 创建浏览器驱动实例
driver = webdriver.Chrome()  # 需要安装 Chrome 浏览器和对应的 ChromeDriver

try:
    # 打开网页
    driver.get(url)

    # 获取页面源代码
    page_source = driver.page_source

    # 使用 BeautifulSoup 解析 HTML 内容
    soup = BeautifulSoup(page_source, 'html.parser')

    # 查找所有的图片标签
    img_tags = soup.find_all('img')

    for img in img_tags:
        # 获取图片的 src 属性
        img_url = img.get('src')

        if img_url:
            # 处理相对 URL
            if not img_url.startswith('http'):
                img_url = url.rsplit('/', 1)[0] + '/' + img_url

            try:
                # 发送请求下载图片
                img_response = requests.get(img_url)
                img_response.raise_for_status()

                # 提取图片文件名
                img_filename = os.path.join(save_folder, img_url.split('/')[-1])

                # 保存图片到本地
                with open(img_filename, 'wb') as f:
                    f.write(img_response.content)
                print(f"成功下载图片: {img_filename}")
            except requests.RequestException as e:
                print(f"下载图片 {img_url} 时出错: {e}")
except Exception as e:
    print(f"发生错误: {e}")
finally:
    # 关闭浏览器
    driver.quit()

以上代码使用Selenium库打开网页,获取完整的页面源代码,然后再进行图片的抓取和下载。需要注意的是,使用Selenium需要安装对应的浏览器驱动(如 ChromeDriver)。

猜你喜欢

转载自blog.csdn.net/u014164303/article/details/146052450
今日推荐