簡體   English   中英

如何使用 autochain selenium 創建循環?

[英]how to create loop with autochain selenium?

我試圖在本網站上使用 selenium 自動鏈創建循環,因為我無法找到分頁按鈕(出現錯誤"JavascriptException" "Message: javascript error: Cannot read properties of undefined )因此我正在尋找使用自動鏈的另一種替代方法。

這是我的代碼。

for i in range(1, 15):

    root1 = driver.find_element(By.XPATH, '//*[@id="topic-list"]/card-topic[{}]'.format(i))
    shadow_root = expand_shadow_element(root1)
    text = shadow_root.find_element(By.CSS_SELECTOR, 'a').click() 
    time.sleep(2)

    qt = tittle_root.find_element(By.CSS_SELECTOR, 'user-topic')
    qt_root = qt.shadow_root
    qt_ele = qt_root.find_element(By.CSS_SELECTOR, 'p')
    qt_text = qt_ele.text
    question_data.append(qt_text)

    time.sleep(2)
    driver.back()
    time.sleep(2)

    paginate = driver.find_element(By.CSS_SELECTOR, 'paginate-button')
    paginate_root = expand_shadow_element(paginate)
    paginate2 = paginate_root.find_element(By.LINK_TEXT, 'Selanjutnya')
    actions = ActionChains(driver)
    actions.move_to_element(paginate2)
    actions.click(paginate2)
    actions.perform()

我遇到的問題是,是的,自動鏈能夠移動到第二頁,但無法抓取頁面。

在第一個默認頁面上時,他們只是抓取第一個問題。 下一頁,他們只是抓取了第二個問題。 等等。 關於如何修復我的代碼有什么建議嗎? 僅供參考,我使用的第一個循環是在網站上獲取完整問題。 這樣我就可以得到所有 15 個問題。

任何幫助將不勝感激謝謝。

我想這就是你想要的:

# Needed libs
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver

driver = webdriver.Chrome()
url = "https://www.alodokter.com/komunitas/diskusi/penyakit"

driver.get(url)
driver.maximize_window()

# Loop for every page we want, in this case 10
for i in range(0, 10):
    # We check how many topics we have in this page
    how_many_topics = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="topic-list"]/card-topic')))
    # Loop for every topic
    for i in range(1, len(how_many_topics)):
        # We click on the topic link
        topic = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, f'(//*[@id="topic-list"]/card-topic)[{i}]')))
        shadow1 = driver.execute_script("return arguments[0].shadowRoot", topic)
        shadow1.find_element(By.CSS_SELECTOR, 'a').click()

        # We get the details we want, in my example only the title, but you can take whatever you want
        detail_topic = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'detail-topic')))
        shadow2 = driver.execute_script("return arguments[0].shadowRoot", detail_topic)
        title = shadow2.find_element(By.CSS_SELECTOR, '.h2').text
        print(title)

        # We click on back button
        driver.back()

    # We search for the next button and we click on it
    pagination = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, f'//paginate-button')))
    shadow_pagination = driver.execute_script("return arguments[0].shadowRoot", pagination)
    next_button = shadow_pagination.find_element(By.CSS_SELECTOR, 'a.page-next')
    actions = ActionChains(driver)
    actions.move_to_element(next_button).click(next_button).perform()

您的問題是您只有一個循環,您需要 2 個,一個用於頁面,另一個用於主題。

  • 在頁面循環中,您計算主題並單擊下一步
  • 在主題循環中,您單擊主題並獲取信息並單擊后退按鈕

暫無
暫無

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

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