滚动加载页面Web Scraping问题:如何一次性获取全部896条数据?
解决滚动加载页面的全量爬取问题
这个论坛的滚动加载是通过AJAX异步请求实现的,直接爬取静态页面只能拿到初始20条。要获取全部896条,得找到后台提供数据的API接口,循环请求所有分页数据。
步骤1:定位数据接口
打开浏览器按F12进入开发者工具,切换到「Network」标签页,滚动页面加载新内容,观察XHR/fetch请求。你会发现每次滚动都会发送一个带分页参数的请求,格式类似:https://www.sarbanes-oxley-forum.com/api/category/20/general-sarbanes-oxley-discussion/topics?page=2&limit=20
其中page是页码,limit是每页条数,初始页为page=1。
步骤2:编写批量爬取代码
用requests循环请求所有页码,解析返回的JSON数据提取标题和链接。注意带上浏览器请求头,避免被拦截:
import requests main_titles = [] main_links = [] base_url = "https://www.sarbanes-oxley-forum.com/api/category/20/general-sarbanes-oxley-discussion/topics" 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", "Accept": "application/json, text/plain, */*" } total_items = 896 per_page = 20 total_pages = (total_items + per_page - 1) // per_page # 计算总页数:896/20≈45页 for page in range(1, total_pages + 1): params = {"page": page, "limit": per_page} response = requests.get(base_url, headers=headers, params=params) if response.status_code != 200: print(f"请求第{page}页失败,状态码:{response.status_code}") continue data = response.json() # 按实际返回的JSON结构提取数据,以下为示例 for topic in data.get("topics", []): main_titles.append(topic["title"]) main_links.append(f"https://www.sarbanes-oxley-forum.com/topic/{topic['id']}/{topic['slug']}") print(f"已获取第{page}页,累计{len(main_links)}条数据") print(f"最终获取{len(main_links)}条数据")
注意事项
- 实际接口的参数和返回字段可能需要你通过抓包确认,比如部分接口用
offset代替page,或字段命名不同 - 可加入
time.sleep(1)延迟请求,避免因频率过高被网站拦截 - 如果论坛需登录才能查看全量内容,需先模拟登录获取有效Cookie并加入请求头
内容的提问来源于stack exchange,提问作者Ahmed Mustafa
相关产品推荐
相关产品推荐

