Python爬取8页足球比分出现首页重复、末页缺失问题求助
问题根因
- 核心问题是你用了不可靠的硬等待
time.sleep(5),没有等单页应用的路由跳转和内容渲染完成就提取页面源码,导致前两次请求拿到的都是第一页内容,最后一次请求没拿到对应内容。
你原来的range(1,9)会生成i=1到8的8次请求,实际抓取内容对应:i=1返回第1页、i=2因未完成跳转还是返回第1页、i=3到8对应返回第2到7页,刚好出现第一页重复、最后一页(第8页)遗漏的问题。 - 为什么改成
range(2,10)能生效?属于歪打正着:修改后生成i=2到9的8次请求,i=2时拿到第1页内容,i=3到9刚好对应拿到第2到8页的内容,刚好凑齐了你需要的8页数据,本质是用偏移的页码覆盖了等待逻辑的缺陷,并不是目标网站的真实页码是2到9。 - 额外问题:你贴出的原始代码存在缩进错误,缺少遍历行的
for row in rows_of_interest:循环,score = row.find(...)这行没有对应的父循环,运行会直接报错。
正确修复方案
不要依赖硬等待和页码偏移,改用Selenium显式等待确认页面已经跳转到目标页码、内容加载完成后再解析数据,参考实现代码如下:
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By import numpy as np chrome_options = Options() chrome_options.add_argument('headless') # 可选添加参数避免被反爬识别 chrome_options.add_argument('--disable-blink-features=AutomationControlled') driver = webdriver.Chrome(options=chrome_options) wait = WebDriverWait(driver, 15) scores = [] for target_page in range(1, 9): url = f'https://www.oddsportal.com/soccer/england/premier-league-2020-2021/results/#/page/{target_page}/' driver.get(url) # 等待当前激活页码和目标页码一致,确认路由跳转完成 wait.until( lambda d: d.find_element(By.CSS_SELECTOR, 'a.active.page-link').text.strip() == str(target_page) ) # 等待比分表格加载完成 wait.until( lambda d: d.find_element(By.CSS_SELECTOR, 'table.table-main') ) soup = BeautifulSoup(driver.page_source, 'lxml') main_table = soup.find('table', class_ ='table-main') rows_of_interest = main_table.find_all('tr', class_ = ['odd deactivate', 'deactivate']) # 补全行遍历逻辑 for row in rows_of_interest: score_elem = row.find('td', class_ = 'center bold table-odds table-score') if score_elem: # 加判断避免个别行无比分字段报错 scores.append(score_elem.text) driver.quit()
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

