Cómo ejecutar Java Script con Scrapy
Mihai Maxim el 30 Ene 2023

Introducción
Bienvenido al apasionante mundo del scraping de sitios web dinámicos. Como ya sabrá por nuestros artículos anteriores, este tipo de sitios web pueden ser un poco difíciles de navegar con las herramientas tradicionales de web scraping. Pero no temas. Scrapy, el fiel asistente para el web scraping, le cubre las espaldas con una gran variedad de plugins y bibliotecas que hacen que el web scraping dinámico sea pan comido.
En este artículo, nos sumergiremos en algunas de las opciones más populares para el raspado de los sitios web con JavaScript con Scrapy. Y para hacer las cosas aún más fáciles, vamos a proporcionar ejemplos de cómo utilizar cada uno de ellos para que pueda abordar con confianza cualquier sitio web que viene a tu manera.
Si eres nuevo en Scrapy no te preocupes. Puedes consultar nuestra guía de introducción al webscraping con Scrapy.
¿Navegadores sin cabeza?
Si no estás familiarizado con los navegadores sin cabeza, déjame que te ponga al día. Básicamente, se trata de navegadores web que funcionan sin una interfaz visible. Sí, ya sé que suena raro no poder ver la ventana del navegador cuando lo estás usando. Pero créeme, los navegadores sin cabeza pueden ser un verdadero cambio de juego cuando se trata de web scraping.
He aquí por qué: a diferencia de los navegadores normales, que se limitan a mostrar páginas web, los navegadores sin cabeza pueden ejecutar JavaScript. Esto significa que si estás tratando de raspar un sitio web que se basa en JavaScript para generar su contenido, un navegador sin cabeza puede ayudarte ejecutando el JavaScript y permitiéndote raspar el HTML resultante.
Exploración de distintas soluciones
La mejor estrategia para renderizar JavaScript con Scrapy depende de sus necesidades y recursos específicos. Si tienes un presupuesto ajustado, querrás elegir una solución que sea rentable. Utilizar un navegador headless o una librería de renderizado JavaScript podría ser la opción menos costosa, pero aún así tendrás que lidiar con la posibilidad de bloqueos de IP y el coste de mantener y ejecutar la solución.
Siempre es mejor probar diferentes opciones y ver cuál funciona mejor para tu caso de uso.
Cómo ejecutar Javascript con Scrapy usando Splash
Splash es un navegador ligero, diseñado específicamente para el web scraping. Se basa en el motor WebKit, que es el mismo motor que impulsa el navegador Safari. Lo bueno de Splash es que es fácil de configurar, especialmente si usas Docker. También está integrado con Scrapy a través del middleware scrapy-splash.
Para utilizar el middleware, primero tendrá que instalar este paquete con pip:
$ pip install scrapy-splash
Configurar Splash con Docker es fácil. Todo lo que necesita hacer es ejecutar una instancia de Splash en su máquina local utilizando Docker (https://docs.docker.com/get-docker/).
$ docker run -p 8050:8050 scrapinghub/splash
Después de eso, usted debe ser capaz de acceder a la instancia local de Splash en http://localhost:8050/

Splash tiene una API REST que facilita su uso con Scrapy o cualquier otra herramienta de web scraping. Puede probar el servidor haciendo una solicitud de obtención dentro del shell de Scrapy:
fetch('http://localhost:8050/render.html?url=<target_url>')
Para configurar el Middleware, añada las siguientes líneas a su archivo settings.py.
SPLASH_URL = 'http://localhost:8050'
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
Visite https://github.com/scrapy-plugins/scrapy-splash para obtener más información sobre cada entorno.
La forma más fácil de renderizar peticiones con Splash es usar scrapy_splash.SplashRequest dentro de tu araña:
import scrapy
from scrapy_splash import SplashRequest
class RandomSpider(scrapy.Spider):
name = 'random_spider'
def start_requests(self):
start_urls = [
'<first_url',
'<second_url>'
]
for url in start_urls:
yield SplashRequest(url=url, callback=self.parse, args={'wait': 5})
def parse(self, response):
result = response.css("h3::text").extract()
yield result
Puedes añadir un parámetro 'wait' para especificar la cantidad de tiempo que quieres que Splash espere antes de devolver tu petición.
Un posible inconveniente del uso de Splash es que requiere el uso del lenguaje de scripting Lua para realizar acciones como pulsar botones, rellenar formularios y navegar por páginas.
Cómo ejecutar Javascript con Scrapy usando Selenium
Puede utilizar Scrapy con el controlador web de Selenium. El middleware scrapy-selenium funciona inyectando el webdriver de Selenium en el proceso de solicitud, de modo que el HTML resultante se devuelve a la araña para su análisis.
Antes de implementar esta solución, es importante tener en cuenta que tendrá que instalar un controlador web para poder interactuar con un navegador. Por ejemplo, tendrá que instalar geckodriver para utilizar Firefox con Selenium. Una vez que haya instalado un controlador web, puede configurar Selenium en la configuración de su proyecto Scrapy:
SELENIUM_DRIVER_NAME = 'firefox'
SELENIUM_DRIVER_EXECUTABLE_PATH = which('geckodriver')
SELENIUM_DRIVER_ARGUMENTS=['-headless'] # '--headless' if using chrome instead of firefox
DOWNLOADER_MIDDLEWARES = {
'scrapy_selenium.SeleniumMiddleware': 800
}
ITEM_PIPELINES = {
'myproject.pipelines.SanitizePipeline': 1,
}
A continuación, puede configurar su araña:
import scrapy
from scrapy_selenium import SeleniumRequest
class RandomSpider(scrapy.Spider):
name = 'random_spider'
def start_requests(self):
start_urls = [
'<first_url',
'<second_url>'
]
for url in start_urls:
yield SeleniumRequest(url=url, callback=self.parse)
def parse(self, response):
print(response.request.meta['driver'].title)
#The request will be handled by selenium, and the request will have an additional meta key, named driver containing the selenium driver with the request processed.
result = response.selector.css("#result::text").extract()
#The selector response attribute work as usual (but contains the html processed by the selenium driver).
yield result
Para obtener más información sobre los métodos y atributos disponibles del controlador, consulte la documentación de selenium python:
http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webdriver
Selenium requiere que se instale un navegador web en la máquina en la que se ejecuta, ya que no es un navegador headless independiente. Esto dificulta su despliegue y ejecución en varios equipos o en un entorno en la nube.
Cómo ejecutar Javascript con Scrapy usando WebScrapingApi
WebScrapingAPI proporciona una API que se encargará de todo el trabajo pesado por usted. Puede ejecutar JavaScript, rotar proxies, e incluso manejar CAPTCHAs, asegurando que usted puede raspar sitios web con facilidad. Además, nunca tendrás que preocuparte de que baneen tu IP por enviar demasiadas peticiones. Con el fin de configurar Scrappy para trabajar con WebScrapingAPI, vamos a configurar un middleware proxy que hará un túnel con todas las peticiones de obtención a través de WSA.
Para ello, configuraremos Scrapy para que se conecte al servidor proxy de la WSA:
import base64
# add this to your middlewares.py file
class WSAProxyMiddleware:
def process_request(self, request, spider):
# Set the proxy for the request
request.meta['proxy'] = "http://proxy.webscrapingapi.com:80"
request.meta['verify'] = False
# Set the proxy authentication for the request
proxy_user_pass = "webscrapingapi.render_js=1:<API_KEY>"
encoded_user_pass = base64.b64encode(proxy_user_pass.encode()).decode()
request.headers['Proxy-Authorization'] = f'Basic {encoded_user_pass}'
Y activar el middleware:
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.WSAProxyMiddleware': 1,
}
webscrapingapi.render_js=1 is the proxy authentication username, <API_KEY> the password.
Puede obtener una API_KEY gratuita creando una nueva cuenta en https://www.webscrapingapi.com/.
Al especificar el parámetro render_js=1, habilitará la capacidad de WebScrapingAPI de acceder a la página web de destino utilizando un navegador sin cabeza que permite que los elementos de página JavaScript se rendericen antes de devolverle el resultado final del raspado.
También puede indicar a la WSA que realice una acción específica al procesar su URL. Puedes hacerlo especificando el parámetro js_instructions:
js_instructions=[
{"action":"click","selector":"button#log-in-button"}
]
// this sequence could be used to click on a button
Y eso es todo, WSA ahora hará automáticamente todas las solicitudes para usted.
Conclusión
El scraping de sitios web dinámicos puede ser una tarea ardua, pero con las herramientas adecuadas resulta mucho más manejable. En este artículo, examinamos tres opciones diferentes para el scraping de sitios web dinámicos con Scrapy. Los navegadores sin cabeza como Splash y Selenium permiten ejecutar JavaScript y renderizar páginas web como un navegador normal. Sin embargo, si desea tomar el camino más fácil, el uso de una API como WebScrapingApi también puede ser una gran solución. Se encarga de todas las tareas complejas por ti y te permite extraer datos fácilmente incluso de los sitios web más difíciles. Independientemente de la opción que elija, es importante tener en cuenta sus necesidades específicas y elegir la solución que mejor se adapte a su proyecto. Gracias por leer, y ¡feliz scraping!
Noticias y actualidad
Manténgase al día de las últimas guías y noticias sobre raspado web suscribiéndose a nuestro boletín.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Artículos relacionados

Explore la comparación en profundidad entre Scrapy y Selenium para el scraping web. Desde la adquisición de datos a gran escala hasta la gestión de contenido dinámico, descubra los pros, los contras y las características únicas de cada uno. Aprenda a elegir el mejor marco de trabajo en función de las necesidades y la escala de su proyecto.


Aprenda a scrapear sitios web dinámicos con JavaScript utilizando Scrapy y Splash. Desde la instalación hasta la escritura de una araña, el manejo de la paginación y la gestión de las respuestas de Splash, esta completa guía ofrece instrucciones paso a paso tanto para principiantes como para expertos.


Explore una comparación detallada entre Scrapy y Beautiful Soup, dos herramientas líderes de raspado web. Comprende sus características, pros y contras, y descubre cómo pueden utilizarse juntas para adaptarse a las necesidades de distintos proyectos.
