如何用Python自动抓取澳大利亚移民局多页签证费用表格?
多页表格抓取解决方案
核心思路
页面的分页是前端动态加载(点击页码/Next后,页面局部刷新表格内容),所以需要用Selenium模拟点击分页按钮,等待页面更新后再抓取对应页的表格数据。结合你提供的分页HTML结构,我们可以通过定位「Next」按钮或直接点击页码来实现翻页。
修改后的完整代码
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 bs4 import BeautifulSoup as bs # 目标URL url = "https://immi.homeaffairs.gov.au/visas/getting-a-visa/fees-and-charges/current-visa-pricing" # 初始化浏览器 driver = webdriver.Chrome() driver.get(url) # 等待页面核心表格加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "table")) ) # 存储所有页的表格数据 all_table_data = [] # 已知总页数为3,循环处理每一页 for page_num in range(3): # 解析当前页表格 html_str = driver.page_source soup = bs(html_str, "html.parser") table = soup.find("table") if table: all_table_data.append(table) print(f"已抓取第{page_num+1}页表格") # 非最后一页则执行翻页 if page_num < 2: try: # 等待Next按钮可点击并点击 next_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.LINK_TEXT, "Next")) ) next_btn.click() # 等待旧表格失效,确保新页面内容加载完成 WebDriverWait(driver, 10).until( EC.staleness_of(table) ) except Exception as e: print(f"翻页失败: {e}") break # 关闭浏览器 driver.quit() # 后续可按需处理数据,示例:打印各页表格内容 for idx, table in enumerate(all_table_data): print(f"\n--- 第{idx+1}页表格内容 ---") print(table.prettify())
关键说明
- 显式等待替代固定sleep:用
WebDriverWait等待元素状态变化,避免网络延迟导致的定位失败,比time.sleep()更稳定。 - 翻页逻辑:
- 已知总页数为3,直接循环3次更高效;若不确定总页数,可通过判断「Next」按钮是否存在/可点击来终止循环。
- 点击Next后,通过
staleness_of等待旧表格元素失效,确保新表格已加载。
- 元素定位备选方案:如果「Next」按钮文本变化,可改用CSS选择器定位:
driver.find_element(By.CSS_SELECTOR, "ul.pagination li:last-child a")。
常见问题处理
- 按钮点击无反应:添加滚动代码让按钮可见:
driver.execute_script("arguments[0].scrollIntoView();", next_btn),再执行点击。 - 页面加载缓慢:延长显式等待的超时时间(比如从10秒改为15秒)。
内容的提问来源于stack exchange,提问作者zlbi
相关产品推荐
相关产品推荐

