selenio con scrapy para página dinámica


Estoy tratando de raspar la información del producto de una página web, utilizando scrapy. Mi página web por raspar se ve así:

  • comienza con una página product_list con 10 productos
  • un clic en el botón "siguiente" carga los siguientes 10 productos (la url no cambia entre las dos páginas)
  • uso LinkExtractor para seguir cada enlace de producto en la página del producto, y obtener toda la información que necesito

Traté de replicar la siguiente-botón-ajax-llamada, pero no puedo conseguir trabajo, así que le estoy dando una oportunidad al selenio. Puedo ejecutar webdriver de selenium en un script separado, pero no se como integrarlo con scrapy. ¿Dónde pongo la parte de selenio en mi araña rasposa?

Mi araña es bastante estándar, como lo siguiente:

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

Cualquier idea es apreciada. ¡Gracias!

Author: alecxe, 2013-07-31

1 answers

Realmente depende de cómo necesita raspar el sitio y cómo y qué datos desea obtener.

Aquí hay un ejemplo de cómo puedes seguir la paginación en ebay usando 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()

Aquí hay algunos ejemplos de"arañas de selenio":


También hay una alternativa a tener que usar Selenium con Scrapy. En algunos casos, usando ScrapyJS middleware es suficiente para manejar las partes dinámicas de una página. Ejemplo de uso en el mundo real:

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:03:02