Я пытаюсь почистить комментарии с сайта, используя 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 комментариев, но я не уверен, возможно ли это?
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"})