You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:38:18