selen ze scrapami do dynamicznej strony

Próbuję zeskrobać informacje o produkcie ze strony internetowej, używając Scrappy. Moja przyszła strona wygląda tak:

  • zaczyna się od strony product_list z 10 produktami
  • kliknięcie przycisku "Dalej" ładuje następne 10 produktów (adres url nie zmienia się między dwiema stronami)
  • używam LinkExtractor, aby śledzić każdy link do produktu na stronie produktu i uzyskać wszystkie potrzebne informacje

Próbowałem odtworzyć next-button-ajax-call, ale nie mogę się uruchomić, więc spróbuję selenu. Mogę uruchomić webdriver selenium w osobnym skrypcie, ale nie wiem jak zintegrować ze scrapem. Gdzie mam włożyć selen do mojego Scrappy spider?

Mój pająk jest dość standardowy, jak poniżej:

class ProductSpider(CrawlSpider):
    name = "product_spider"
    allowed_domains = ['example.com']
    start_urls = ['http://example.com/shanghai']
    rules = [
        Rule(SgmlLinkExtractor(restrict_xpaths='//div[@id="productList"]//dl[@class="t2"]//dt'), callback='parse_product'),
        ]

    def parse_product(self, response):
        self.log("parsing product %s" %response.url, level=INFO)
        hxs = HtmlXPathSelector(response)
        # actual data follows
Każdy pomysł jest doceniany. Dziękuję!
Author: alecxe, 2013-07-31

1 answers

To naprawdę zależy od tego, jak trzeba zeskrobać stronę i jak i jakie dane chcesz uzyskać.

Oto przykład, jak można śledzić paginacji na ebay za pomocą Scrapy+Selenium:

import scrapy
from selenium import webdriver

class ProductSpider(scrapy.Spider):
    name = "product_spider"
    allowed_domains = ['ebay.com']
    start_urls = ['http://www.ebay.com/sch/i.html?_odkw=books&_osacat=0&_trksid=p2045573.m570.l1313.TR0.TRC0.Xpython&_nkw=python&_sacat=0&_from=R40']

    def __init__(self):
        self.driver = webdriver.Firefox()

    def parse(self, response):
        self.driver.get(response.url)

        while True:
            next = self.driver.find_element_by_xpath('//td[@class="pagn-next"]/a')

            try:
                next.click()

                # get the data and write it to scrapy items
            except:
                break

        self.driver.close()

Oto kilka przykładów "pająków selenowych":


Istnieje również alternatywa dla konieczności używania Selenium z Scrapy. W niektórych przypadkach za pomocą ScrapyJS middleware jest wystarczające do obsługi dynamicznych części strony. Przykładowe użycie w świecie rzeczywistym:

 87
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:03:02