簡體   English   中英

如何在python的硒中進行網頁抓取時單擊鏈接?

[英]How to click on a link while webscraping in python's selenium?

我在 python 中使用硒。 當我使用 xpath 單擊鏈接時。 我收到錯誤 TimeoutException: Message:.Ive 嘗試使用 by.ID 和 by.tag 但似乎此鏈接已隱藏。 我怎樣才能點擊這兩個鏈接。

這是我的第一個鏈接的代碼:

btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,"/html/body/div[3]/div/div/div[2]/div/div/div/div[2]/div/div/div[1]/div/div/div[2]/div/div/div")))
btn.click()


<div class="lib_33_IXqu lib_10OTPLG lib_rljvxxj lib_2bmVxh4 lib_AWe8PWK lib_NH5Lx3B lib_AWe8PWK"><div class="">Most Active<div class="lib_gdMpTuS lib_3Wb397t lib_QVji0M8 lib_1dwKEN3 lib_2IaUGOQ" aria-hidden="true">Most Active</div></div></div>

<div class="" data-selected="false"><div class="lib_33_IXqu lib_10OTPLG lib_rljvxxj lib_2bmVxh4 lib_AWe8PWK lib_NH5Lx3B lib_AWe8PWK"><div class="">Watchers<div class="lib_gdMpTuS lib_3Wb397t lib_QVji0M8 lib_1dwKEN3 lib_2IaUGOQ" aria-hidden="true">Watchers</div></div></div></div>

這段代碼應該可以工作。 此外,我注意到有一個覆蓋會在幾秒鍾后彈出,可能會中斷您的鼠標點擊。 我也添加了一行代碼來點擊它。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time

# location of chromedriver.exe
driver = webdriver.Chrome("D:/chromedriver/94/chromedriver.exe")

driver.get("https://stocktwits.com/rankings/trending")

# waiting for the links to be available
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '//div[@class="lib_33_IXqu lib_10OTPLG lib_rljvxxj lib_2bmVxh4 lib_AWe8PWK lib_NH5Lx3B lib_AWe8PWK"]')))

# capturing the links
links = driver.find_elements(By.XPATH, '//div[@class="lib_33_IXqu lib_10OTPLG lib_rljvxxj lib_2bmVxh4 lib_AWe8PWK lib_NH5Lx3B lib_AWe8PWK"]')

# get rid of the overlay message
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '//button[@class="ub-emb-close"]'))).click()

# looping through the links since they all have the same class
for link in links:
    link.click()
    # do something
    time.sleep(2)

您還可以通過 URL 直接訪問這些鏈接:

  • stocktwits.com/rankings/most-active
  • stocktwits.com/rankings/watchers

我看到覆蓋層在大約一分鍾后彈出了幾次。 您可以使用函數來創建腳本:

def close_overlay():
    return """
setInterval(()=>{{var overlay = document.querySelector('button[class="ub-emb-close"]');
if(overlay){{overlay.click();}} }}, 5000);
"""

稍后,在您的腳本中這樣調用它:

driver.execute_script(close_overlay())

這個小腳本將每 5 秒檢查一次覆蓋層上的關閉按鈕並關閉它。

注意:此腳本可能會在您的主機器人嘗試單擊的同時嘗試單擊關閉按鈕。 這將導致ElementClickInterceptedException 您可以在代碼中處理此異常。

雖然這不是必需的,但稍后可能會派上用場。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM