python - libreria - selenio con scrapy para página dinámica
selenium web scraping python (1)
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":
- Ejecutar Javascript Enviar funciones de formulario usando scrapy en python
- https://gist.github.com/cheekybastard/4944914
- https://gist.github.com/irfani/1045108
- http://snipplr.com/view/66998/
También hay una alternativa a tener que usar Selenium
con Scrapy
. En algunos casos, utilizar el middleware ScrapyJS
es suficiente para manejar las partes dinámicas de una página. Muestra de uso en el mundo real:
Estoy tratando de raspar información del producto de una página web, usando scrapy. La página web que se va a raspar tiene este aspecto:
- comienza con una página de lista de productos con 10 productos
- un clic en el botón "siguiente" carga los siguientes 10 productos (la URL no cambia entre las dos páginas)
- utilizo LinkExtractor para seguir cada enlace de producto en la página del producto y obtener toda la información que necesito
Traté de replicar el siguiente botón-ajax-call pero no puedo trabajar, así que estoy probando el selenio. Puedo ejecutar el webdriver de selenio en un script separado, pero no sé cómo integrarlo con scrapy. ¿Dónde debo poner la parte de selenio en mi araña de scrapy?
Mi araña es bastante estándar, como la 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!