You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动