Scrapy-selenium es un middleware que se utiliza en web scraping. scrapy no admite el raspado de sitios modernos que usan marcos de javascript y esta es la razón por la que este middleware se usa con scrapy para raspar esos sitios modernos. Scrapy-selenium proporciona las funcionalidades de selenium que ayudan a trabajar con sitios web de javascript. Otras de las ventajas que ofrece este es el controlador por el cual también podemos ver lo que sucede detrás de escena. Como el selenium es una herramienta automatizada, también nos proporciona información sobre cómo tratar las etiquetas de entrada y raspar de acuerdo con lo que pasa en el campo de entrada. Pasar entradas en los campos de entrada se volvió más fácil al usar selenium. La primera vez que se introdujo scrapy-selenium fue en 2018 y es de código abierto. La alternativa a esto puede ser scrapy-splash
- Instalar y configurar Scrapy –
- Instalar scrapy
- Correr
scrapy startproject projectname (projectname is name of project)
- Ahora, vamos a correr,
scrapy genspider spidername example.com
(reemplace spidername con su nombre de araña preferido y example.com con el sitio web que desea raspar). Nota: Más tarde también se puede cambiar la URL, dentro de su araña scrapy.
araña raspadora:
- Integrando scrapy-selenium en proyecto scrapy:
- Instale scrapy-selenium y agréguelo en su archivo settings.py
# for firefox
from
shutil
import
which
SELENIUM_DRIVER_NAME
=
'firefox'
SELENIUM_DRIVER_EXECUTABLE_PATH
=
which(
'geckodriver'
)
SELENIUM_DRIVER_ARGUMENTS
=
[
'-headless'
]
# for chrome driver
from
shutil
import
which
SELENIUM_DRIVER_NAME
=
'chrome'
SELENIUM_DRIVER_EXECUTABLE_PATH
=
which(
'chromedriver'
)
SELENIUM_DRIVER_ARGUMENTS
=
[
'--headless'
]
DOWNLOADER_MIDDLEWARES
=
{
'scrapy_selenium.SeleniumMiddleware'
:
800
}
- En este proyecto, se utiliza el controlador Chrome. El controlador Chrome debe descargarse de acuerdo con la versión del navegador Chrome. Vaya a la sección de ayuda en su navegador Chrome, luego haga clic en Google Chrome y verifique su versión. Descargue el controlador de Chrome del sitio web como se indica aquí Para descargar el controlador de Chrome
- Dónde agregar chromedriver:
- Adición en el archivo settings.py:
- Cambio a realizar en el archivo spider:
- Para ejecutar el proyecto:
command- scrapy crawl spidername (scrapy crawl integratedspider in this project)
- código de araña antes de scrapy-selenium:
import
scrapy
class
IntegratedspiderSpider(scrapy.Spider):
name
=
'integratedspider'
# name of spider
allowed_domains
=
[
'example.com'
]
def
parse(
self
, response):
pass
- Instale scrapy-selenium y agréguelo en su archivo settings.py
- Campos importantes en scrapy-selenium:
- nombre- nombre es una variable donde se escribe el nombre de la araña y cada araña es reconocida
por este nombre. El comando para ejecutar spider es scrapy crawl spidername (aquí spidername se
refiere al nombre que se define en la araña). - función start_requests- Las primeras requests a realizar se obtienen llamando al método start_requests() que genera Solicitud para la URL especificada en el campo url en yield SeleniumRequest y el método parse como función de devolución de llamada para las Requests
- url- Aquí se proporciona la url del sitio.
- captura de pantalla : puede tomar una captura de pantalla de una página web con el método get_screenshot_as_file() con como parámetro, el nombre del archivo y la captura de pantalla se guardarán en el proyecto.
- devolución de llamada : la función que se llamará con la respuesta de esta solicitud como su primer parámetro.
- dont_filter: indica que el planificador no debe filtrar esta solicitud. si se envía la misma URL para analizar, no dará excepción de la misma URL a la que ya se accedió. Lo que significa es que se puede acceder a la misma URL más de una vez. El valor predeterminado es falso.
- wait_time : Scrapy no espera una cantidad fija de tiempo entre requests. Pero por este campo podemos asignarlo durante la devolución de llamada.
- nombre- nombre es una variable donde se escribe el nombre de la araña y cada araña es reconocida
- Estructura general de la araña scrapy-selenium:
import
scrapy
from
scrapy_selenium
import
SeleniumRequest
class
IntegratedspiderSpider(scrapy.Spider):
name
=
'integratedspider'
def
start_requests(
self
):
yield
SeleniumRequest(
wait_time
=
3
,
screenshot
=
True
,
callback
=
self
.parse,
dont_filter
=
True
)
def
parse(
self
, response):
pass
- Proyecto de raspado con scrapy-selenium:
raspado de nombres de cursos en línea del sitio geeksforgeeks usando scrapy-seleniumObteniendo la ruta X del elemento que necesitamos desechar:
Código para desechar datos de cursos de Geeksforgeeks –
import
scrapy
from
scrapy_selenium
import
SeleniumRequest
class
IntegratedspiderSpider(scrapy.Spider):
name
=
'integratedspider'
def
start_requests(
self
):
yield
SeleniumRequest(
wait_time
=
3
,
screenshot
=
True
,
callback
=
self
.parse,
dont_filter
=
True
)
def
parse(
self
, response):
# courses make list of all items that came in this xpath
# this xpath is of cards containing courses details
courses
=
response.xpath(
'//*[@id ="active-courses-content"]/div/div/div'
)
# course is each course in the courses list
for
course
in
courses:
# xpath of course name is added in the course path
# text() will scrape text from h4 tag that contains course name
course_name
=
course.xpath(
'.//a/div[2]/div/div[2]/h4/text()'
).get()
# course_name is a string containing \n and extra spaces
# these \n and extra spaces are removed
course_name
=
course_name.split(
'\n'
)[
1
]
course_name
=
course_name.strip()
yield
{
'course Name'
:course_name
}
Producción –