Я использую 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()
, как предложено Йосувой А.