无需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
相关产品推荐
相关产品推荐

