Почему мой скребок с селеном python пропускает текст? - PullRequest
0 голосов
/ 22 марта 2019

Я делаю простой скребок для извлечения информации о продажах Steam из steamDB (https://steamdb.info/sales/?min_discount=50&min_rating=70). Вот мой код:

from selenium import webdriver
driver = webdriver.Chrome()

driver.get("https://steamdb.info/sales/?min_discount=50&min_rating=70")

# extract the sale table and list of entries
table = driver.find_element_by_xpath("//*[@id='DataTables_Table_0']/tbody")

# key info: name/ price/ discount/ rating/ end time/ appid
for i in driver.find_elements_by_xpath(".//tr"):

    for cnt, td in enumerate(i.find_elements_by_xpath(".//td")):
        print(cnt, td.text)
    print(i.get_attribute("data-appid"))
    print("===========================")

В основном я обнаружил, что таблица содержит всю информацию о продажах и извлекает ключевые тексты, такие как название игры, цена, скидка, время начала продажи, время окончания и т. Д.

Однако я обнаружил, что после нескольких строк данных в таблице отсутствует текст об окончании / запуске / выпуске игры в продажу:

Вот хороший, который должен выглядеть так:

0
1 
2 Undertale
Daily Deal 
3 -61%
4 ¥ 14
5 94.18%
6 2 hours # sales end in
7 2 days ago # sales start from
8 4 years ago # game released
391540 # appid
===========================

Вот так плохо выглядит:

0 
1 
2 South Park™: The Stick of Truth™
Ubisoft Publisher Weekend new highest discount
3 -80%
4 $5.99
5 95.53%
6 
7 
8 
213670

Как видите, скребок мог обнаружить тег td в индексе 6,7,8, но не смог извлечь из него какой-либо текст.

Некоторые наблюдения:

  1. Я проверил дом, и я не видел никакой разницы между ряд хороших и плохих
  2. Проблема воспроизводится только после первых 10 строк

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Это потому, что информация этих столбцов загружается динамически при прокрутке. Пожалуйста, используйте приведенный ниже скрипт, который позаботится об этой проблеме.

driver.get("https://steamdb.info/sales/?min_discount=50&min_rating=70")

# extract the sale table and list of entries
table = driver.find_element_by_xpath("//*[@id='DataTables_Table_0']/tbody")

# key info: name/ price/ discount/ rating/ end time/ appid
for i in table.find_elements_by_xpath(".//tr"):
    driver.find_element_by_xpath("//li[@class='paginate_button next']").location_once_scrolled_into_view
    for cnt, td in enumerate(i.find_elements_by_xpath(".//td")):
        print(cnt, td.text)
    print(i.get_attribute("data-appid"))
    print("===========================")
0 голосов
/ 26 марта 2019

Как сказал supputuri, проблема связана с динамической загрузкой веб-страницы. После некоторого эксперимента я нашел хорошее решение - вручную смоделировать процесс прокрутки вниз страницы, чтобы код выглядел примерно так:

driver.execute_script("window.scrollTo(0, document.body.scrollHeight/2);")
time.sleep(0.5)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(0.5)

Сценарий прокрутил бы до половины страницы, затем подождал полсекунды, чтобы позволить веб-странице загрузить контент, а затем прошел. Это зависит от длины веб-страницы (если длина слишком велика, между каждым свитком будет некоторый «пробел»)

Я знаю, что это решение наивно, поэтому, пожалуйста, скажите, есть ли лучшее.

...