Очистка динамического сайта с помощью Selenium / BeautifulSoup - PullRequest
2 голосов
/ 13 мая 2019

Я пытаюсь почистить комментарии с сайта, используя Selinium и Beutifulsoup. Сайт, который я пытаюсь вычистить, динамически генерируется Javascript, и это мало чем отличается от того, что я изучил в уроках, которые я видел (я очень мало знаком с javascript). Мое лучшее рабочее решение на данный момент:

browser = webdriver.Chrome(executable_path=chromedriver_path)
browser.get('https://nationen.ebcomments.dk/embed/stream?asset_id=7627366')
def load_data():
    time.sleep(1) # The site needs to load
    browser.execute_script("document.querySelector('#stream > div.talk-stream-tab-container.Stream__tabContainer___2trkn > div:nth-child(2) > div > div > div > div > div:nth-child(3) > button').click()") # Click on load more comments button

htmlSource = browser.page_source
soup = BeautifulSoup(browser.page_source, 'html.parser')
load_data() # i should call this few times to load all comments, but in this example i only do it once.
for text in soup.findAll(class_="talk-plugin-rich-text-text"):
    print(text.get_text(), "\n") # Print the comments

Это работает - но это очень медленно, и я уверен, что есть лучшее решение, особенно если я хочу почистить несколько сотен статей с комментариями.

Я думаю, что все комментарии представлены в формате JSON (я посмотрел на вкладку Chromes dev в сети, и я вижу, что есть ответ, содержащий JSON с комментарием - см. Рис.). Затем я попытался использовать SeliniumRequest для получения данных, но совершенно не знал, что я делаю, и это не работает. Там написано "тело b'POST отсутствует. Вы забыли использовать промежуточное программное обеспечение анализатора тела? '". Может быть, я смогу получить JSON из API комментариев, но я не уверен, возможно ли это?

pic

from seleniumrequests import Chrome
chromedriver_path = 'C:/chromedriver.exe'
webdriver = Chrome(executable_path=chromedriver_path)
response = webdriver.request('POST', 'https://nationen.ebcomments.dk/api/v1/graph/ql/', data={"assetId": "7627366", "assetUrl": "", "commentId": "","excludeIgnored": "false","hasComment": "false", "sortBy": "CREATED_AT", "sortOrder": "DESC"})

1 Ответ

1 голос
/ 13 мая 2019

Если только комментарии, за которыми вы следите, то следующая реализация доставит вас туда:

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

link = "https://nationen.ebcomments.dk/embed/stream?asset_id=7627366"

with webdriver.Chrome() as driver:
    wait = WebDriverWait(driver,10)
    driver.get(link)
    while True:
        try:
            wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,".talk-load-more > button"))).click()
        except Exception: break

    for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,"[data-slot-name='commentContent'] > .CommentContent__content___ZGv1q"))):
        print(item.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...