2023年kenpom.com大学篮球数据爬取问题求助
爬取kenpom.com大学篮球数据的问题
我一直在网上查找如何使用BeautifulSoup和Pandas爬取kenpom.com的大学篮球数据。由于没有该网站的账号,无法使用kenpompy库。我见过一些往年的爬取示例,包括使用pracpred库(声明:我对该库毫无经验)或用curlconverter获取requests.get请求所需的请求头、Cookie和参数,但如今该网站对主数据表的爬取限制更严格了。我目前已写出以下代码:
import requests from bs4 import BeautifulSoup url ='https://kenpom.com/index.php?y=2023' cookies = { 'PHPSESSID': 'f04463ec42584dbd1bf7a480098947d1', '_ga': 'GA1.2.120164513.1673124870', '_gid': 'GA1.2.622021765.1673496414', '__stripe_mid': '71a4117b-cbef-4d3c-b31b-9d18e5c99a33183485', '__stripe_sid': '99b77b80-1222-4f7a-b2a8-acf5cf19c7d18a637f', 'kenpomtry': 'https%3A%2F%2Fkenpom.com%2Fsummary.php%3Fs%3DRankAPL_Off%26y%3D2021', '_gat_gtag_UA_11558853_1': '1', } headers = { 'authority': 'kenpom.com', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'accept-language': 'en-US,en;q=0.9', # 'cookie': 'PHPSESSID=f04463ec42584dbd1bf7a480098947d1; _ga=GA1.2.120164513.1673124870; _gid=GA1.2.622021765.1673496414; __stripe_mid=71a4117b-cbef-4d3c-b31b-9d18e5c99a33183485; __stripe_sid=99b77b80-1222-4f7a-b2a8-acf5cf19c7d18a637f; kenpomtry=https%3A%2F%2Fkenpom.com%2Fsummary.php%3Fs%3DRankAPL_Off%26y%3D2021; _gat_gtag_UA_11558853_1=1', 'sec-ch-ua': '"Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'none', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', } params = { 'y': '2023', } response = requests.get('https://kenpom.com/index.php', params=params, cookies=cookies, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # table = soup.find('table',{'id':'ratings-table'}).tbody
解决建议
- Cookie时效性处理:你当前用的Cookie属于临时会话,很快会失效。建议每次爬取前从浏览器开发者工具的Network面板里,复制最新的请求Cookie替换掉代码里的旧值。
- 应对动态渲染:kenpom可能用JavaScript动态加载表格数据,单纯requests拿的静态HTML可能不含完整数据。可以用selenium或playwright模拟真实浏览器,等页面加载完成后再提取源码。
- 请求头优化:确保请求头里的
sec-ch-ua、sec-ch-ua-platform等参数和你当前浏览器一致,避免被识别为爬虫;可以添加referer字段,模拟站内跳转请求。 - 表格提取容错:提取表格时先判断是否找到目标元素,不要直接访问
.tbody,避免报错,示例代码:
table = soup.find('table', id='ratings-table') if table: tbody = table.tbody # 后续遍历行和列处理数据 else: print("未找到目标表格,请检查请求是否成功")
- 控制请求速率:每次请求后加
time.sleep(2)之类的延迟,避免频繁请求被封IP。 - 验证请求状态:先打印
response.status_code确认请求是否成功(200为正常),再打印response.text查看返回内容,如果是登录页或验证页,说明需要处理反爬验证。
内容的提问来源于stack exchange,提问作者BLuta
相关产品推荐
相关产品推荐

