Scraping dynamic content using python-Scrappy

Disclaimer: widziałem wiele innych podobnych postów na StackOverflow i próbowałem zrobić to w ten sam sposób, ale nie wydaje się, aby działać na tej stronie.

Używam Pythona-Scrapy do pobierania danych z koovs.com.

Nie jestem jednak w stanie uzyskać rozmiaru produktu, który jest generowany dynamicznie. W szczególności, jeśli ktoś mógłby poprowadzić mnie trochę na temat uzyskania znacznika rozmiaru "niedostępny" z rozwijanego menu na ten link {6]}, byłbym wdzięczny.

Jestem w stanie uzyskaj listę rozmiarów statycznie, ale robiąc to, dostaję tylko listę rozmiarów, ale nie które z nich są dostępne.

Author: Pravesh Jain, 2015-05-20

3 answers

Można również rozwiązać go za pomocą ScrapyJS (nie potrzeba selenium i prawdziwej przeglądarki):

Ta biblioteka zapewnia integrację Scrapy + JavaScript za pomocą Splash.

Postępuj zgodnie z instrukcjami instalacji Splash oraz ScrapyJS, Uruchom kontener Splash docker:

$ docker run -p 8050:8050 scrapinghub/splash

Wprowadź następujące ustawienia w settings.py:

SPLASH_URL = 'http://192.168.59.103:8050' 

DOWNLOADER_MIDDLEWARES = {
    'scrapyjs.SplashMiddleware': 725,
}

DUPEFILTER_CLASS = 'scrapyjs.SplashAwareDupeFilter'

A oto twój przykładowy pająk, który jest w stanie zobaczyć dostępność rozmiaru informacje:

# -*- coding: utf-8 -*-
import scrapy


class ExampleSpider(scrapy.Spider):
    name = "example"
    allowed_domains = ["koovs.com"]
    start_urls = (
        'http://www.koovs.com/only-onlall-stripe-ls-shirt-59554.html?from=category-651&skuid=236376',
    )

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, self.parse, meta={
                'splash': {
                    'endpoint': 'render.html',
                    'args': {'wait': 0.5}
                }
            })

    def parse(self, response):
        for option in response.css("div.select-size select.sizeOptions option")[1:]:
            print option.xpath("text()").extract()

Oto co jest wydrukowane na konsoli:

[u'S / 34 -- Not Available']
[u'L / 40 -- Not Available']
[u'L / 42']
 32
Author: alecxe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-21 15:56:24

Z tego, co rozumiem, dostępność rozmiaru jest określana dynamicznie w javascript wykonywanym w przeglądarce. Scrappy nie jest przeglądarką i nie może wykonać javascript.

Jeśli nie masz nic przeciwko przełączeniu się na selenium Narzędzie do automatyzacji przeglądarki , Oto przykładowy kod:

from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Firefox()  # can be webdriver.PhantomJS()
browser.get('http://www.koovs.com/only-onlall-stripe-ls-shirt-59554.html?from=category-651&skuid=236376')

# wait for the select element to become visible
select_element = WebDriverWait(browser, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.select-size select.sizeOptions")))

select = Select(select_element)
for option in select.options[1:]:
    print option.text

browser.quit()

Drukuje:

S / 34 -- Not Available
L / 40 -- Not Available
L / 42

Zauważ, że zamiast Firefox możesz używać innych webdriverów, takich jak Chrome lub Safari. Istnieje również możliwość użycia bezgłowej przeglądarki PhantomJS.

Możesz także w razie potrzeby połączyć skrobię z selenem, patrz:

 6
Author: alecxe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:24

Zmierzyłem się z tym problemem i łatwo go rozwiązałem, wykonując następujące kroki

Pip install splash
pip install Scrappy-splash
pip install scrapyjs

Pobierz i zainstaluj docker-toolbox

Otwórz docker-quickterminal i wprowadź

$ docker run -p 8050:8050 scrapinghub/splash

aby ustawić splash_url należy sprawdzić domyślny adres IP skonfigurowany w dockerze wpisując
$ docker-machine ip default
(moje IP to 192.168.99.100)

SPLASH_URL = 'http://192.168.99.100:8050'
DOWNLOADER_MIDDLEWARES = {
    'scrapyjs.SplashMiddleware': 725,
}

DUPEFILTER_CLASS = 'scrapyjs.SplashAwareDupeFilter'
To jest to!
 0
Author: Sri09,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 14:11:45