使用BeautifulSoup抓取滚动加载页面:如何获取更多文章?
解决滚动加载页面的Web Scraping问题
你遇到的情况太常见了——这类网站用无限滚动(Infinite Scroll)加载内容,初始页面只渲染固定数量的文章,滚动到底部时会通过AJAX请求偷偷获取更多数据。直接爬取初始HTML自然只能拿到首次加载的8条,要抓取更多内容,得先找到它的动态加载接口。
步骤1:定位动态加载的API接口
打开浏览器开发者工具(按F12),切换到「Network」标签页,然后手动滚动页面加载更多文章。你会看到一个新的XHR请求跳出来,这就是网站用来拉取后续文章的接口。比如这个网站的接口大概长这样:https://readwrite.com/wp-json/rw/v1/posts?category=fintech&offset=8&posts_per_page=8
(参数offset是偏移量,每次增加8;posts_per_page是每页返回的文章数量)
步骤2:编写批量请求代码
推荐用requests库来发送请求,比urllib更简洁好用。下面是完整的示例代码:
import requests from bs4 import BeautifulSoup # 基础API地址,替换成你实际找到的接口 base_url = "https://readwrite.com/wp-json/rw/v1/posts?category=fintech&posts_per_page=8" titles = [] offset = 0 while True: # 构造带偏移量的请求URL url = f"{base_url}&offset={offset}" # 设置请求头,模拟浏览器访问,避免被拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) # 检查请求是否成功 if response.status_code != 200: print(f"请求失败,状态码:{response.status_code}") break # 解析返回的JSON数据 data = response.json() # 如果返回空数据,说明已经没有更多文章了,停止循环 if not data: break # 提取每个文章的标题 for item in data: # 接口返回的标题可能带HTML标签,用BeautifulSoup提取纯文本 title_soup = BeautifulSoup(item['title']['rendered'], 'html.parser') titles.append(title_soup.get_text(strip=True)) # 偏移量增加8,准备请求下一页 offset += 8 # 可以加个1秒的延迟,避免请求太频繁被网站封禁 # import time # time.sleep(1) print(f"总共抓取到{len(titles)}个文章标题:") for idx, title in enumerate(titles, 1): print(f"{idx}. {title}")
几个关键注意点
- 确认接口参数:不同网站的分页逻辑可能不一样,有的用
page(页码),有的用offset,要根据实际请求调整参数。 - 模拟浏览器请求:一定要加
User-Agent请求头,很多网站会直接拦截没有标识的爬虫请求。 - 控制请求频率:添加适当的延迟,避免短时间内发送大量请求导致IP被封禁。
- 异常处理:可以给代码加上超时处理、JSON解析异常捕获,让爬虫更健壮。
内容的提问来源于stack exchange,提问作者tarek hassan




