0

0

如何高效爬取花瓣网并获取所有图片?

聖光之護

聖光之護

发布时间:2025-02-20 17:18:21

|

410人浏览过

|

来源于php中文网

原创

花瓣网图片爬取及分页策略详解

本文介绍如何高效爬取花瓣网图片,并重点讲解如何获取后续页面数据,实现完整图片下载。

如何高效爬取花瓣网并获取所有图片?

高效爬取的关键:获取最大值 (max)

花瓣网的API分页机制依赖于max参数,它代表了当前页面最后一个pin的ID。 要实现完整爬取,我们需要在每次爬取页面后,提取该页面的最后一个pin ID,并将其作为下一个页面的max参数,以此循环获取所有数据。

代码改进与详解

谱乐AI
谱乐AI

谱乐AI,集成 Suno、Udio 等顶尖AI音乐模型的一站式AI音乐生成平台。

下载

以下代码实现了这一策略:

import re
import time
import json
import requests
import os

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}

directory = input('请输入要创建的文件夹名称:\n')
fileName = 'huabanimg/' + directory + '/'
if not os.path.exists(fileName):
    os.makedirs(fileName)

board_id = int(input('请输入需要抓取的花瓣board ID:\n'))
url = f'https://api.huaban.com/boards/{board_id}/pins?limit=20'

max_id = None

while True:
    response = requests.get(url, headers=headers)
    text = response.text

    # 使用正则表达式提取pin key,更稳健
    pin_keys = re.findall(r'"key":"([^"]+)"', text)

    if not pin_keys:  # 检查是否获取到数据
        print("未获取到图片数据,可能已到达最后一页或出现错误。")
        break

    last_pin_id = pin_keys[-1]

    for i, key in enumerate(pin_keys):
        img_url = f'https://hbimg.huabanimg.com/{key}_fw658'
        img_name = key[:10]
        print(f'正在下载第 {i+1} 张图片...')

        try:
            img_data = requests.get(img_url, headers=headers, stream=True)
            img_data.raise_for_status() # 检查HTTP状态码,抛出异常处理错误

            with open(fileName + img_name + '.jpeg', 'wb') as f:
                for chunk in img_data.iter_content(chunk_size=8192):
                    f.write(chunk)
        except requests.exceptions.RequestException as e:
            print(f"下载图片 {img_url} 失败: {e}")
            continue # 跳过失败的图片

        time.sleep(2)  # 添加延时,避免请求过快

    max_id = last_pin_id
    url = f'https://api.huaban.com/boards/{board_id}/pins?max={max_id}&limit=20'

    if max_id == '0' or len(pin_keys) < 20: # 更可靠的结束条件
        break

print("图片下载完成!")

代码改进说明:

  • 更健壮的正则表达式: 使用更精确的正则表达式 r'"key":"([^"]+)"' 提取 key 值,避免因HTML结构变化导致的错误。
  • 错误处理: 添加 try...except 块处理 requests 异常,防止因网络问题或其他原因导致程序崩溃。
  • 流式下载: 使用 img_data.iter_content() 进行流式下载,减少内存占用,尤其在下载大图片时非常有效。
  • 更可靠的结束条件: 判断 len(pin_keys) 确保当页面图片数量少于 limit 值时也停止爬取,避免无限循环。
  • 清晰的提示信息: 添加更清晰的提示信息,方便用户理解程序运行状态。
  • 变量命名: 使用更具描述性的变量名,例如 board_id 代替 num

此改进后的代码更加稳健、高效,并具有更好的错误处理能力,能够更可靠地完成花瓣网图片的爬取任务。 请记住遵守花瓣网的 robots.txt 规则,并避免过度频繁的请求。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

247

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

737

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

211

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

349

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

232

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

528

2023.12.06

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.1万人学习

Excel 教程
Excel 教程

共162课时 | 11.8万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号