You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需Selenium,如何用BeautifulSoup爬取IPLT20所有比赛报告链接?

无需Selenium爬取IPLT20比赛报告所有链接的解决方案

你的代码只能获取页面初始加载的少量链接,因为「Load More」按钮触发的是异步AJAX请求,后续内容是动态加载的,静态HTML里没有这些内容。不用Selenium的核心思路是找到页面加载更多内容时调用的API接口,直接请求该API获取所有分页数据。


1. 定位动态加载的API接口

打开浏览器开发者工具(F12),切换到「Network」标签页,点击页面的「Load More」按钮,观察新出现的XHR/Fetch请求。找到返回比赛报告数据的API,这类请求通常带有分页参数(比如page=1、page=2),返回HTML片段或JSON格式内容。

2. 编写代码循环请求API分页

根据找到的API结构,编写代码循环请求每一页数据,直到没有更多内容为止。以下是两种常见场景的示例代码:

场景一:API返回HTML片段(和初始页面结构一致)

import requests
from bs4 import BeautifulSoup

# 模拟浏览器请求头,避免被反爬拦截
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',
    'Referer': 'https://www.iplt20.com/news/match-reports'
}

base_url = 'https://www.iplt20.com/news/match-reports'
page = 1
all_links = []

while True:
    # 构造分页请求URL
    request_url = f"{base_url}?page={page}"
    response = requests.get(request_url, headers=headers)
    soup = BeautifulSoup(response.text, 'lxml')

    # 提取比赛报告容器
    match_containers = soup.find_all('div', class_='latest-slider-wrap position-relative')
    if not match_containers:
        # 没有更多内容,终止循环
        break

    # 提取每个容器内的链接
    for container in match_containers:
        link_tag = container.find('a')
        if link_tag and 'href' in link_tag.attrs:
            link = link_tag['href']
            # 拼接完整URL(处理相对路径)
            full_link = f"https://www.iplt20.com{link}" if link.startswith('/') else link
            all_links.append(full_link)

    page += 1

# 输出所有收集到的链接
for link in all_links:
    print(link)

场景二:API返回JSON格式数据

如果观察到API返回的是JSON结构(比如包含articles列表),可以直接解析JSON提取链接:

import requests

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',
    'X-Requested-With': 'XMLHttpRequest'  # 部分API需要此头标识AJAX请求
}

base_api_url = 'https://www.iplt20.com/api/match-reports'  # 替换为实际找到的API地址
page = 1
all_links = []

while True:
    request_url = f"{base_api_url}?page={page}"
    response = requests.get(request_url, headers=headers)
    data = response.json()

    # 假设返回数据中articles字段存储比赛报告列表
    articles = data.get('articles', [])
    if not articles:
        break

    for article in articles:
        link = article.get('url')
        if link:
            full_link = f"https://www.iplt20.com{link}" if link.startswith('/') else link
            all_links.append(full_link)

    page += 1

for link in all_links:
    print(link)

3. 注意事项

  • 确保请求头尽可能模拟真实浏览器(比如User-Agent、Referer),避免被网站反爬机制拦截。
  • 如果API需要额外参数(比如limit、offset)或请求方式为POST,需根据实际请求调整代码。
  • 若遇到请求失败,可查看浏览器中对应请求的完整头信息,复制到代码中。

内容的提问来源于stack exchange,提问作者DJG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:47:46