Scrapy: извлечение данных (css -селектор) - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь получить данные (заголовок) с этой страницы . Мой код не работает. Что я делаю не так?

scrapy shell https://www.indiegogo.com/projects/functional-footwear-run-pain-free#/
response.css('.t-h3--sansSerif::text').getall()

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Всегда проверяйте источник страницы из источника просмотра. Глядя на источник, похоже, что он не содержит искомого элемента. Вместо этого он динамически создается с помощью javascript.

Вы можете использовать селен для очистки таких сайтов. Но у селена есть свои оговорки. Это синхронно.

А поскольку вы используете scrapy, лучшим вариантом будет использование пакета scrapy-spla sh. Spla sh отображает javascript и возвращает полностью визуализированную html страницу, которую вы можете легко очистить с помощью селекторов xpath или css. Помните, что вам нужно запустить сервер Spla sh в контейнере docker . И используйте его как прокси-сервер для рендеринга javascript.

docker pull scrapinghub/splash
docker run -d -p 8050:8050 --memory=1.5G --restart=always scrapinghub/splash --maxrss 1500 --max-timeout 3600 --slots 10

Вот ссылка на документацию. https://splash.readthedocs.io/en/stable/

Ваш сценарий будет выглядеть примерно так. Вместо scrapy.Request вы можете делать запросы типа

from scrapy_splash import SplashRequest
yield SplashRequest(url=url, callback=self.parse, meta={})

И тогда вам хорошо go.

1 голос
/ 02 августа 2020

Думаю, проблема в том, что элемент динамически добавляется через Js, и это может быть причиной того, что scrapy не может его извлечь, возможно, вам стоит попробовать использовать селен.

Вот селениум код для получения элемента:

titles = WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#main .is-12-touch+ .is-12-touch"))
)

for title in titles:    
    t = title.text
    print("t = ", title)
...