如何对含两层下一页分页结构的图片网站实现scrape图片采集?
两层分页爬取实现思路及参考代码
核心实现思路
- 外层列表页循环:每次请求当前列表页,先提取页面中所有专辑的访问链接,再查找是否存在
class="next page-numbers"的下一页按钮标签。如果存在则拼接为完整URL作为下一次请求的列表页地址,重复上述流程;如果找不到下一页标签,说明列表页已全部遍历完成,终止外层循环。 - 内层专辑页循环:拿到单个专辑的首页地址后,请求当前专辑页,提取该页所有图片地址进行保存,再查找页面中是否存在文本为「下一页」的
span标签对应的父级a标签。如果存在则拼接为完整URL作为下一次请求的专辑页地址,重复提取图片+判断下一页的流程;如果找不到下一页标签,说明当前专辑已全部遍历完成,终止内层循环。 - 基础适配说明:请求时需要添加
User-Agent请求头模拟浏览器访问,避免被站点拦截;两次请求之间添加适当的延时,降低站点服务器压力,同时也避免触发反爬限制。
参考代码示例(Python)
以下代码基于requests+BeautifulSoup实现核心逻辑,你可根据页面实际结构调整选择器、补充图片下载逻辑即可使用:
import requests from bs4 import BeautifulSoup import time # 基础配置 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } base_domain = "http://img.imyimy.com" def crawl_single_album(album_first_url): """单个专辑的爬取逻辑(内层分页循环)""" current_album_url = album_first_url while True: resp = requests.get(current_album_url, headers=headers) resp.encoding = "utf-8" soup = BeautifulSoup(resp.text, "html.parser") # ========== 待补充:调整选择器提取当前页所有图片地址 ========== img_tags = soup.select("article img") # 示例选择器,需按实际页面修改 for img in img_tags: img_full_url = base_domain + img["src"] if img["src"].startswith("/") else img["src"] # 此处添加图片下载逻辑即可 print(f"待下载图片:{img_full_url}") # 判断专辑是否有下一页 next_span = soup.find("span", string="下一页") if not next_span or not next_span.find_parent("a"): break next_album_relative = next_span.find_parent("a")["href"] current_album_url = base_domain + next_album_relative time.sleep(0.5) if __name__ == "__main__": # 外层列表页分页循环 current_list_url = "http://img.imyimy.com/mengmeizi/" while True: resp = requests.get(current_list_url, headers=headers) resp.encoding = "utf-8" soup = BeautifulSoup(resp.text, "html.parser") # ========== 待补充:调整选择器提取当前页所有专辑链接 ========== album_tags = soup.select("h2.title a") # 示例选择器,需按实际页面修改 for tag in album_tags: album_relative = tag["href"] album_full_url = base_domain + album_relative crawl_single_album(album_full_url) time.sleep(1) # 判断列表页是否有下一页 next_list_tag = soup.select_one("a.next.page-numbers") if not next_list_tag: break next_list_relative = next_list_tag["href"] current_list_url = base_domain + next_list_relative time.sleep(1)
内容的提问来源于stack exchange,提问作者Peters7
相关产品推荐
相关产品推荐

