翻页URL不变的网页爬取问题:已实现首页爬取,求教多页数据获取
Hey there! 这种URL不变的翻页场景太常见啦,大多是因为页面用了AJAX异步加载或者前端框架渲染(比如React、Vue),数据不是通过刷新页面来获取的。我给你几个实用的方案,你可以根据自己的情况选:
方案1:直接调用AJAX数据接口(效率最高)
这种是最优解,因为不用加载整个页面,直接拿原始数据:
- 打开浏览器开发者工具(按F12),切换到「Network」标签,筛选「XHR/Fetch」分类
- 点击页面的「下一页」按钮,观察新出现的请求,找到返回JSON格式数据的那个接口(一般会包含
page、offset这类参数) - 研究这个请求的参数规则(比如每页多少条、页码怎么递增),还有请求头里的必要信息(比如
User-Agent、Cookie,部分网站需要登录态) - 用代码循环发送请求,修改页码参数来获取所有页的数据
举个Python示例(用requests库):
import requests import time # 替换成你抓包得到的请求头和接口地址 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Cookie": "你的登录Cookie(如果需要)" } base_api_url = "https://example.com/api/list-data" page_num = 1 while True: # 替换成接口实际需要的参数 params = { "page": page_num, "limit": 20, "category": "xxx" } response = requests.get(base_api_url, headers=headers, params=params) data = response.json() # 这里调用你已经写好的「处理单页数据」的函数 process_single_page_data(data) # 判断是否还有下一页:可以看返回的数据长度、或者接口里的has_next字段 if len(data["data"]) == 0 or not data.get("has_next", False): break # 加个小延迟,避免触发反爬 time.sleep(1) page_num += 1
方案2:用浏览器自动化工具模拟点击(适合复杂反爬场景)
如果AJAX接口加密、参数难分析,就直接模拟用户操作:
- 推荐用Playwright(比Selenium更现代、稳定),或者Selenium
- 代码里打开浏览器,加载页面,爬取首页数据后,找到「下一页」按钮点击,等待页面加载完成后再爬取,循环直到按钮不可点击
举个Playwright的Python示例:
from playwright.sync_api import sync_playwright import time with sync_playwright() as p: # 启动浏览器,headless=False可以看到操作过程,上线后改成True browser = p.chromium.launch(headless=False) page = browser.new_page() page.goto("你的目标网页URL") while True: # 调用你已有的「爬取单页数据」逻辑,这里需要用Playwright的元素定位 items = page.query_selector_all(".item-container") for item in items: title = item.query_selector(".item-title").text_content().strip() price = item.query_selector(".item-price").text_content().strip() print(f"标题:{title},价格:{price}") # 定位下一页按钮,判断是否可点击 next_btn = page.query_selector(".next-page-btn") if not next_btn or not next_btn.is_enabled(): print("已爬完所有页面") break # 点击下一页,等待页面加载完成 next_btn.click() page.wait_for_load_state("networkidle") # 等待网络空闲,确保数据加载完毕 time.sleep(0.5) browser.close()
一些额外注意事项
- 别爬太快!加
time.sleep()控制请求间隔,避免被网站封禁IP - 注意网站的
robots.txt规则,不要爬取禁止抓取的内容 - 如果需要登录才能翻页,记得在请求头里带上登录后的Cookie,或者用自动化工具模拟登录
内容的提问来源于stack exchange,提问作者Amine
相关产品推荐
相关产品推荐

