花瓣网图片爬取:高效获取下一页图片
本文介绍如何高效爬取花瓣网图片,特别是解决新版花瓣网下一页max值获取的问题。
挑战: 新版花瓣网的图片API返回的JSON数据结构变化,直接获取下一页所需max值变得困难。
解决方案: 利用正则表达式解析JSON数据,提取最后一个pin_id作为下一页的max值。
代码实现: 以下代码基于Python,利用requests库获取数据,re库进行正则匹配,并处理图片下载。
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('请输入文件夹名称: ') fileName = 'huabanimg/' + directory + '/' if not os.path.exists(fileName): os.makedirs(fileName) board_id = int(input('请输入花瓣board ID: ')) url = f'https://api.huaban.com/boards/{board_id}/pins?limit=20' while True: response = requests.get(url, headers=headers) jsondata = response.json() # 直接使用json.loads()解析json数据,避免使用正则表达式 pins = jsondata['pins'] if not pins: # 检查是否有图片数据 break for pin in pins: key = pin['key'] img_url = f'https://hbimg.huabanimg.com/{key}_fw658' img_name = key[:10] print(f'正在下载:{img_name}.jpeg') try: img_data = requests.get(img_url, headers=headers).content with open(fileName + img_name + '.jpeg', 'wb') as f: f.write(img_data) except Exception as e: print(f"下载图片{img_name}失败: {e}") time.sleep(2) # 获取下一页的max值, 使用更简洁的JSON解析方式 if jsondata['next']: url = jsondata['next'] else: break print('图片下载完成!')
改进说明:
- 直接JSON解析: 代码改进了max值获取方式,直接使用response.json()解析JSON数据,并从jsondata['next']中获取下一页URL,避免了使用正则表达式,提高了代码的可读性和健壮性。
- 错误处理: 添加了try...except块来处理潜在的网络错误或图片下载失败的情况。
- 更清晰的代码结构: 代码结构更加清晰,更易于理解和维护。
- 更友好的用户交互: 提示信息更加友好。
此改进后的代码更稳健,更易于理解和维护,推荐使用。 记住替换board_id为你想要爬取的花瓣board的ID。 请遵守花瓣网的robots.txt和使用规范,避免对服务器造成过大压力。