首页 > 编程问答 >如何自动从网页下载数据

如何自动从网页下载数据

时间:2024-08-01 07:46:10浏览次数:12  
标签:python selenium-webdriver automation download

我正在尝试使用 Python 和 Selenium 自动从网站下载 excel 文件。我尝试过 XPath,但我认为它比我的代码更复杂。就像按钮中的选择器一样。任何建议都会有用。

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.webdriver.common.keys import Keys
import time

xpath_ship_movements="//*[@id='Traffic']"
# xpath_ship_movements="xpath_full='/html/body/form/div/div[2]/div[1]/div[2]/ul/li[2]/a'"
xpath_days='//*[@id="rptGrid"]/div/div[2]/div[1]/div[2]/a[1]'
xpath_tools='//*[@id="rptGrid"]/div/div[2]/div[1]/div[2]/a[3]'
xpath_export='//*[@id="MSQ-WEB-0001"]'
url="https://qships.tmr.qld.gov.au/webx/#"


driver = webdriver.Edge()

# Open the webpage
driver.get(url)
driver.maximize_window()

wait = WebDriverWait(driver, 20)

# Wait for and click the "Ship Movements" button
ship_movements_button = wait.until(EC.element_to_be_clickable((By.XPATH, xpath_ship_movements)))
ship_movements_button.click()

# Wait for and click the "Next 7 days" button
next_7_days_button = wait.until(EC.element_to_be_clickable((By.XPATH, xpath_days)))
next_7_days_button.click()

# Wait for and click the Tools button
tools_button = wait.until(EC.element_to_be_clickable((By.XPATH, xpath_tools)))
tools_button.click()

# Wait for and click the Export to Excel option
export_to_excel = wait.until(EC.element_to_be_clickable((By.XPATH, xpath_export)))
export_to_excel.click()

# Wait for the export to complete
time.sleep(10)

# Close the browser
driver.quit()

的代码看起来不错,并且应该可以从网站下载 Excel 文件。但是,网站行为或网站结构的某些更改有时会导致问题。

以下是一些关于如何改进代码并使其更强大的建议,以及解决可能遇到的任何问题的故障排除步骤:

改进代码:

  1. 显式等待下载: 不要依赖 time.sleep(10) ,因为它可能不可靠。最好使用 WebDriverWait 来等待文件下载完成。可以通过检查下载目录中的文件或等待浏览器指示下载完成来实现此目的。

```python import os from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC

downloads_folder = os.path.expanduser('~/Downloads') # 获取 Downloads 文件夹的路径 file_endswith = ".xlsx" # 假设文件扩展名为 .xlsx

# ... 的代码 ...

# 等待文件下载 WebDriverWait(driver, 30).until(lambda driver: any( file.endswith(file_endswith) for file in os.listdir(downloads_folder) )) ```

  1. 处理弹出窗口(如果适用): 如果单击“导出到 Excel”按钮打开一个新的弹出窗口或对话框来保存文件,需要切换到该窗口才能处理它。

```python # ... 的代码 ...

# 切换到新的窗口或选项卡 main_window = driver.current_window_handle driver.switch_to.window(driver.window_handles[-1])

# ... 处理下载对话框(如果需要)...

# 切换回主窗口 driver.switch_to.window(main_window) ```

  1. 使用更强大的选择器: 虽然 XPath 可以很强大,但它也可能很脆弱。如果网站结构发生变化,XPath 可能会失效。尝试使用更健壮的选择器,例如 ID、类名或 CSS 选择器。

  2. ID: 如果可用,请使用元素 ID。例如,如果“导出到 Excel”选项具有 ID“exportButton”,可以使用 driver.find_element_by_id("exportButton")

  3. 类名: 如果元素具有唯一的类名,则可以使用它。例如: driver.find_element_by_class_name("export-button")
  4. CSS 选择器: CSS 选择器比 XPath 更灵活且更易于阅读。例如: driver.find_element_by_css_selector(".export-button")

  5. 实施错误处理: 考虑添加 try...except 块以捕获可能发生的任何异常,例如在预期时间内找不到元素或下载失败。这将使的代码更健壮并防止它在出现错误时崩溃。

python try: # ... 的代码 ... except Exception as e: print(f"发生错误:{e}") finally: driver.quit()

故障排除:

  1. 检查 XPath: 确保的 XPath 表达式正确,并且它们与要与之交互的元素相匹配。使用浏览器的开发人员工具(通常通过按 F12 访问)验证 XPath。
  2. 检查网站更新: 该网站可能已更新其结构或功能,这可能会破坏的代码。比较正在使用的 XPath 与网站的当前 HTML 源代码。
  3. 禁用浏览器扩展: 某些浏览器扩展会干扰 Selenium。尝试暂时禁用扩展程序以查看它们是否导致问题。

通过实施这些改进和故障排除步骤,可以使代码更加健壮和可靠,以便从网站自动下载数据。

标签:python,selenium-webdriver,automation,download
From: 78818655

相关文章