Scrapy with Selenium не обнаруживает динамически загружаемый элемент HTML - PullRequest
0 голосов
/ 06 октября 2019

Я использую Scrapy with Selenium для очистки содержимого этой страницы: https://nikmikk.itch.io/door-knocker

В нем есть таблица под div с классом .game_info_panel_widget, где первая строка Published 62 days ago выглядитбыть загруженным динамически.

Я пытаюсь извлечь страницу, как видит Scrapy, но не могу найти эту строку в html.

scrapy fetch --nolog https://nikmikk.itch.io/door-knocker > test.html

Вот то, что я вижу в test.html, первой таблицестрока - это статус, а не опубликованная строка, как при просмотре источника страницы непосредственно в Chrome.

<div class="game_info_panel_widget">                                                                                                                                         
    <table>                                                                                                                                              
        <tbody>                                                                                                                                                  
           <tr>                                                                                                                                                      
               <td>Status</td>                                                                                                                                                       
               <td>Prototype</td>                                                                                                                                                            
               ...                                                                                                                                               

           </tr>
            ...

В моем классе SpiderDownloaderMiddleware я включил Selenium :

options = webdriver.ChromeOptions()
options.add_argument('headless')
options.add_argument('window-size=1200x600')

driver = webdriver.Chrome(chrome_options=options)

class SpiderDownloaderMiddleware(object):
# Omitted other codes
    def process_request(self, request, spider):
        driver.get(request.url)

        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, ".game_info_panel_widget"))
        )

        body = driver.page_source
        return HtmlResponse(driver.current_url, body=body, encoding='utf-8-sig', request=request)

Как проверить, как загружается эта строка и как я могу очистить эту информацию?

Обновлено : я следовал ответу @Yosuva A ниже и получил что-то вроде этого:

 9 days ago

In development
Platforms
Windows
Rating
(9)
Author
David Clark
Genre
Survival, Puzzle
Tags
3D, Creepy, First-Person, Horror, Psychological Horror, Short, Singleplayer, Spooky, Unity
Average session
A few seconds
Languages
English

Но вывод не согласован, иногда он дает желаемый, иногда нет. Я думаю, потому что Selenium ждет общего элемента td, который является общим:

"//div[@class='game_info_panel_widget']//table//tr//td"

Я пытался изменить, чтобы использовать td[@text='Published'], но Selenium дает тайм-аут.

Мой код:

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

driver = webdriver.Chrome('chromedriver')  # Optional argument, if not specified will search path.
driver.implicitly_wait(15)

driver.get("https://thehive.itch.io/promnesia");
driver.find_element(By.XPATH,"//a[@class='toggle_info_btn']").click()

WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='game_info_panel_widget']//table//tr//td"))) #Wait for specific element 

table_rows= driver.find_elements(By.XPATH,"//div[@class='game_info_panel_widget']//table//tr//td")

for rows in table_rows:
    print(rows.text)

driver.quit()

Любой другой способ?

Заключение : Это работает, если мы time.sleep(2) после click(), как предложено Йосувой А.

1 Ответ

1 голос
/ 07 октября 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

driver = webdriver.Chrome('/usr/local/bin/chromedriver')  # Optional argument, if not specified will search path.
driver.implicitly_wait(15)

driver.get("https://thehive.itch.io/promnesia");
driver.find_element(By.XPATH,"//a[@class='toggle_info_btn']").click()
time.sleep(2)
WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.XPATH, "//div[@class='game_info_panel_widget']/table//tr//td"))) #Wait for specific element 

table_rows= driver.find_elements(By.XPATH,"//div[@class='game_info_panel_widget']/table//tr//td")

for rows in table_rows:
    print rows.text

driver.quit()

Вывод

Updated
1 day ago
Published
9 days ago
Status
In development
Platforms
Windows
Rating
(9)
Author
David Clark
Genre
Survival, Puzzle
Tags
3D, Creepy, First-Person, Horror, Psychological Horror, Short, Singleplayer, Spooky, Unity
Average session
A few seconds
Languages
English
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...