Соскреб в Интернете с использованием Selenium и BeautifulSoup не обновляет извлеченный код после прокрутки - PullRequest
0 голосов
/ 05 декабря 2018

Пытаюсь почистить обзоры некоторых игр в Steam.На странице отзывов доступно только 10 отзывов, если вы не прокрутите страницу вниз, и будет загружено больше отзывов.Я использую селен для прокрутки, но объект BeautifulSoup, который, как ожидается, будет содержать 20 обзоров, все еще имеет только 10. Вот мой код:

from bs4 import BeautifulSoup
from selenium import webdriver
import time

driver = webdriver.Chrome('E:\Download\chromedriver.exe')
driver.get('https://steamcommunity.com/app/466560/reviews/?browsefilter=toprated&snr=1_5_100010_')
SCROLL_PAUSE_TIME = 0.5
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
soup = BeautifulSoup(driver.page_source)

Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Страница обновляется с использованием jquery с пакетами по 10 записей на прокрутку.Он смещается каждый раз, чтобы получить следующий набор.Когда список исчерпан, есть текст, который вы можете использовать для прокрутки до конца.Если вы хотите остановиться в какой-либо конкретной точке, имейте условие выхода из цикла - это желаемое количество отзывов, заданное len(d.find_elements_by_css_selector('.reviewInfo'))

from selenium import webdriver

d  = webdriver.Chrome()
url = 'https://steamcommunity.com/app/466560/reviews/?browsefilter=toprated&snr=1_5_100010_'
d.get(url)

while d.find_element_by_css_selector('.apphub_NoMoreContentText1').text != 'No more content. So sad.':
    d.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    try: 
        d.find_element_by_id('GetMoreContentBtn').click()
    except:
        pass
print(len(d.find_elements_by_css_selector('.reviewInfo')))  #6135
0 голосов
/ 05 декабря 2018

Вам нужно подождать, пока идентификатор элемента action_wait не будет виден, и найти текст, если больше нет обзора, или просто установить максимальное количество просмотров, которое вы хотите.

В этом примере результат, ограниченный 100, вы можете увеличить егоно если вы не хотите ждать дольше, просто Ctrl + C, и данные будут обработаны в Beautifulsoup.

driver.get('https://.....')
maxResult = 100
currentResults = 0
pageSource = ''

try:
    print('press "Ctrl + C" to stop loop and process using beautfulsoup.')
    while currentResults < maxResult:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        WebDriverWait(driver, 10).until(EC.invisibility_of_element_located((By.ID, "action_wait")))
        currentResults = len(driver.find_elements_by_css_selector('.apphub_Card.modalContentLink.interactable'))
        print('currentResults: %s' % currentResults)
        pageSource = driver.page_source
except KeyboardInterrupt:
        print "Cancelled by user"
except: pass

soup = BeautifulSoup(pageSource, 'html.parser')

reviews = soup.select('.apphub_Card.modalContentLink.interactable')

print('reviews count by BeautifulSoup: %s' % len(reviews))
...