如何解决Selenium爬取币安新币上线公告的翻页问题?
币安新币上线公告爬取翻页问题解决方案
原代码核心问题
- 翻页按钮定位错误:币安公告页的翻页按钮并非
id="next-page",实际是带有「Next」文本的按钮,原选择器无法匹配目标元素。 - 未返回列表页:进入公告详情页后直接执行翻页操作,此时页面为详情页,不存在翻页按钮,逻辑完全错误。
- 等待条件不准确:用全局
<a>标签作为页面加载判断条件,会匹配大量无关链接,无法确保公告列表真正加载完成。 - 静态等待效率低:
time.sleep(5)既耗时又不稳定,无法适配不同网络环境下的加载速度。
修正后的完整代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import NoSuchElementException, TimeoutException import csv driver = webdriver.Chrome() wait = WebDriverWait(driver, 20) # 目标公告列表页URL base_url = "https://www.binance.com/en/support/announcement/new-cryptocurrency-listing?c=48&navId=48" driver.get(base_url) with open('announcements.csv', mode='w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(['Title', 'Released On', 'Content', 'Links']) announcement_count = 0 processed_links = set() # 存储已抓取链接,避免重复 while True: try: # 等待公告列表容器加载完成(精准定位列表区域) wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "css-1q8dd3e"))) except TimeoutException: print("页面加载超时,退出循环") break # 提取当前页的公告详情链接,过滤已抓取过的链接 announcement_links = driver.find_elements(By.CSS_SELECTOR, "div.css-1q8dd3e a") current_page_links = [ link.get_attribute("href") for link in announcement_links if link.get_attribute("href") and link.get_attribute("href") not in processed_links ] if not current_page_links: print("当前页无新公告,退出循环") break for link in current_page_links: processed_links.add(link) driver.get(link) try: # 等待详情页标题加载完成 wait.until(EC.visibility_of_element_located((By.TAG_NAME, "h1"))) title = driver.find_element(By.TAG_NAME, "h1").text release_time = driver.find_element(By.CSS_SELECTOR, "div.css-1563tgu").text content_area = driver.find_element(By.CLASS_NAME, "css-1muhu5j") content = content_area.text content_links = " | ".join([a.get_attribute("href") for a in content_area.find_elements(By.TAG_NAME, "a")]) writer.writerow([title, release_time, content, content_links]) announcement_count += 1 print(f"已抓取第 {announcement_count} 条公告") except NoSuchElementException as e: print(f"抓取公告 {link} 时出错: {str(e)}") finally: # 返回公告列表页,确保后续操作在正确页面执行 driver.back() # 等待列表页重新加载完成 wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "css-1q8dd3e"))) # 处理翻页逻辑 try: # 定位Next按钮(通过文本匹配,适配页面元素结构) next_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Next')]"))) # 检查按钮是否禁用(最后一页时按钮会带有disabled属性) if next_button.get_attribute("disabled"): print("已到最后一页,退出循环") break next_button.click() # 等待页面切换完成(通过列表元素失效判断页面已更新) wait.until(EC.staleness_of(driver.find_element(By.CLASS_NAME, "css-1q8dd3e"))) except (TimeoutException, NoSuchElementException): print("找不到下一页按钮或已到最后一页") break driver.quit() print(f"抓取完成,共保存 {announcement_count} 条公告到 announcements.csv")
关键修改说明
- 修正翻页定位:用XPATH匹配带有「Next」文本的按钮,并通过
disabled属性判断是否到达最后一页,确保翻页逻辑正确。 - 添加返回列表页操作:每次抓取完详情页后调用
driver.back()回到列表页,保证翻页操作在正确的页面执行。 - 精准等待条件:等待公告列表容器加载,而非全局
<a>标签,避免误判页面加载状态。 - 去重机制:用
processed_links集合存储已抓取链接,防止重复抓取同一公告。 - 替换静态等待:全部使用显式等待,提升脚本稳定性和执行效率。
内容的提问来源于stack exchange,提问作者Lewis Revel
相关产品推荐
相关产品推荐

