使用BeautifulSoup从Sidearm平台网站提取URL遇到问题
解决Sidearm平台网站roster链接提取问题
原代码仅适用于首页直接存在roster链接的场景,而owlsports.com这类Sidearm站点的roster入口藏在各体育项目的详情页中,首页无直接入口,因此需要调整爬取逻辑:
调整后的核心思路
- 先访问站点的体育项目汇总页(Sidearm平台通用路径为
/sports),提取所有项目的页面链接 - 遍历每个项目页面,在页面内定位roster入口链接
- 用集合存储链接以自动去重,最后输出结果
实现代码
import requests from bs4 import BeautifulSoup import re headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:16.0) Gecko/20100101 Firefox/16.0'} base_url = "https://owlsports.com" # 1. 获取所有体育项目的页面链接 sports_page_url = f"{base_url}/sports" reqs = requests.get(sports_page_url, headers=headers) soup = BeautifulSoup(reqs.text, 'html.parser') # 匹配Sidearm项目列表的链接class project_links = soup.find_all('a', class_=re.compile("sidearm-sports-list-item-link")) project_urls = [link.get('href') for link in project_links if link.get('href')] # 补全相对链接为完整URL project_urls = [url if url.startswith('http') else f"{base_url}{url}" for url in project_urls] # 2. 遍历项目页提取roster链接 roster_links = set() for url in project_urls: try: req = requests.get(url, headers=headers) project_soup = BeautifulSoup(req.text, 'html.parser') # 查找含roster关键字的链接 links = project_soup.find_all('a', href=re.compile("roster")) for link in links: href = link.get('href') if href: full_href = href if href.startswith('http') else f"{base_url}{href}" roster_links.add(full_href) except Exception as e: print(f"访问项目页 {url} 出错: {e}") # 输出最终结果 for link in roster_links: print(link)
补充说明
- Sidearm平台站点结构有共性,项目汇总页基本都在
/sports路径,项目内导航栏通常包含roster入口 - 若遇到动态加载的项目列表(需点击展开),可改用
selenium模拟浏览器渲染,但多数Sidearm站点的项目列表为静态渲染 - 用集合存储链接可避免同一项目出现多个重复roster链接的情况
内容的提问来源于stack exchange,提问作者vijish madhavan
相关产品推荐
相关产品推荐

