Как загрузить все комментарии сайта через селен в python - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу очистить все комментарии (~ 7000) от https://www.focus.de/gesundheit/news/coronavirus-news-trump-prahlt-mit-allumfassender-macht_id_11576018.html. Поскольку веб-сайт отображает не все комментарии, а дает возможность загружать только 10 комментариев за раз, я стараюсь загрузить все комментарии с селеном в python, а затем выводить их в BeautifulSoup.

Сегмент HTML веб-сайта, который соответствует кнопке «Weitere Kommentare (10)» и загружает следующие 10 комментариев:

<div id="further_comments" class="getMoreComments">                 
    <a rel="1" class="moreComments bluebutton">
         <span>Weitere Kommentare (10)</span>
    </a>                        
</div>

Загружает следующие десять комментариев (второй div ниже, только один показан здесь вместо десяти) и новая кнопка для загрузки еще 10 комментариев (a):

<div class="moreComments">
    <div class="comment clearfix open oid-15051615"</div>
    <div class="getMoreComments">
        <a class="moreCommentsAjx bluebutton" rel="1"></a>
    </div>
</div>

Мой подход состоял в том, чтобы написать скрипт, который автоматически нажимает «Weitere Kommentare» (10). ) ", ожидает до следующих 10 комментариев и загрузки следующей кнопки" Weitere Kommentare (10) ", находит кнопку, нажимает ее снова ... до тех пор, пока не будут загружены все комментарии. Моя попытка была следующей (я центрирую кнопку, чтобы избежать всплывающего окна внизу страницы, которое могло бы скрыть кнопку):

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
from selenium.common.exceptions import StaleElementReferenceException, NoSuchElementException

ignored_exceptions = (NoSuchElementException, StaleElementReferenceException)

driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get('https://www.focus.de/gesundheit/news/coronavirus-news-trump-prahlt-mit-allumfassender-macht_id_11576018.html')
driver.fullscreen_window()

button = driver.find_element_by_class_name("moreComments.bluebutton")
driver.execute_script('arguments[0].scrollIntoView({block: "center", inline: "center"})', button)
driver.execute_script("arguments[0].click();", button)

while driver.find_element_by_class_name("moreCommentsAjx.bluebutton"):
    element = WebDriverWait(driver, 10, ignored_exceptions=ignored_exceptions).until(EC.visibility_of_element_located((By.CLASS_NAME, "moreCommentsAjx.bluebutton")))
    driver.execute_script('arguments[0].scrollIntoView({block: "center", inline: "center"})', element)
    element.click()

page_source = driver.page_source

К сожалению, этот код никогда не проходит. В какой-то момент кнопка «Weitere Kommentare (10)» просто больше не появляется, и выдается «NoSuchElementException: невозможно найти элемент: .moreCommentsAjx.bluebutton» (странно, несмотря на то, что предполагается его игнорировать). Что меня озадачивает, так это не систематичность c. Иногда ему удается загрузить пару сотен комментариев до того, как он потерпит неудачу, иногда только 30 et c. Иногда выдается исключение StaleElementReferenceException (опять же, это не должно, но это происходит), когда прокрутка кажется неудачной и не центрирует кнопку, но это редко.

Заранее благодарим за любую помощь.

1 Ответ

0 голосов
/ 15 апреля 2020

Возможно, вы ожидаете "неправильно"

После нажатия вы ждете, пока кнопка не появится, но, возможно, она все еще там и еще не вышла.

После требуемого щелчка подождать, пока кнопка не исчезнет (но не потерпит неудачу и имеет очень короткий тайм-аут), а затем вы захотите подождать, пока кнопка не появится снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...