tutorial scraping library example español crawler python selenium selenium-webdriver scrapy scrapy-spider

python - scraping - ¿Presentar formulario que rinde dinámicamente con Scrapy?



scrapy python español (1)

Estoy tratando de enviar un formulario de inicio de sesión de usuario generado dinámicamente utilizando Scrapy y luego analizar el HTML en la página que corresponde a un inicio de sesión exitoso.

Me preguntaba cómo podría hacer eso con Scrapy o una combinación de Scrapy y Selenium. El selenio hace posible encontrar el elemento en el DOM, pero me preguntaba si sería posible "devolver el control" a Scrapy después de obtener el código HTML completo para permitirle realizar el envío del formulario y guardar las cookies necesarias. , datos de sesión, etc. para raspar la página.

Básicamente, la única razón por la que pensé que el Selenio era necesario era porque necesitaba la página para representar desde el Javascript antes de que Scrapy busque el elemento <form> . ¿Hay alguna alternativa a esto, sin embargo?

¡Gracias!

Editar: esta pregunta es similar a esta , pero desafortunadamente la respuesta aceptada se refiere a la biblioteca de Solicitudes en lugar de Selenio o Scrapy. Aunque ese escenario puede ser posible en algunos casos ( mire esto para obtener más información ), como señala alecxe, se puede requerir Selenium si "partes de la página [como formularios] se cargan a través de llamadas API y se insertan en la página con la ayuda del código javascript que se está ejecutando en el navegador ".


Scrapy no es realmente una gran opción para el sitio de Coursera ya que es extremadamente asincrónico. Las partes de la página se cargan a través de llamadas API y se insertan en la página con la ayuda de un código JavaScript que se ejecuta en el navegador. Scrapy no es un navegador y no puede manejarlo.

Lo cual plantea el problema: ¿por qué no utilizar la API de Coursera disponible públicamente?

Además de lo que está documentado, hay otros puntos finales que puede ver llamados en las herramientas de desarrollo del navegador: necesita ser autenticado para poder usarlos. Por ejemplo, si ha iniciado sesión, puede ver la lista de cursos que ha tomado:

Hay un llamado al punto final de memberships.v1 .

En aras de un ejemplo, comencemos con el selenium , inicie sesión y tome las cookies con get_cookies() . Luego, cedamos un punto final Request a memberships.v1 para obtener la lista de cursos archivados que proporcionan las cookies que obtenemos del selenium :

import json import scrapy from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC LOGIN = ''email'' PASSWORD = ''password'' class CourseraSpider(scrapy.Spider): name = "courseraSpider" allowed_domains = ["coursera.org"] def start_requests(self): self.driver = webdriver.Chrome() self.driver.maximize_window() self.driver.get(''https://www.coursera.org/login'') form = WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@data-js=''login-body'']//div[@data-js=''facebook-button-divider'']/following-sibling::form"))) email = WebDriverWait(form, 10).until(EC.visibility_of_element_located((By.ID, ''user-modal-email''))) email.send_keys(LOGIN) password = form.find_element_by_name(''password'') password.send_keys(PASSWORD) login = form.find_element_by_xpath(''//button[. = "Log In"]'') login.click() WebDriverWait(self.driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//h2[. = ''My Courses'']"))) self.driver.get(''https://www.coursera.org/'') cookies = self.driver.get_cookies() self.driver.close() courses_url = ''https://www.coursera.org/api/memberships.v1'' params = { ''fields'': ''courseId,enrolledTimestamp,grade,id,lastAccessedTimestamp,role,v1SessionId,vc,vcMembershipId,courses.v1(display,partnerIds,photoUrl,specializations,startDate,v1Details),partners.v1(homeLink,name),v1Details.v1(sessionIds),v1Sessions.v1(active,dbEndDate,durationString,hasSigTrack,startDay,startMonth,startYear),specializations.v1(logo,name,partnerIds,shortName)&includes=courseId,vcMembershipId,courses.v1(partnerIds,specializations,v1Details),v1Details.v1(sessionIds),specializations.v1(partnerIds)'', ''q'': ''me'', ''showHidden'': ''false'', ''filter'': ''archived'' } params = ''&''.join(key + ''='' + value for key, value in params.iteritems()) yield scrapy.Request(courses_url + ''?'' + params, cookies=cookies) def parse(self, response): data = json.loads(response.body) for course in data[''linked''][''courses.v1'']: print course[''name'']

Para mí, imprime:

Algorithms, Part I Computing for Data Analysis Pattern-Oriented Software Architectures for Concurrent and Networked Software Computer Networks

Lo que demuestra que podemos darle a Scrapy las cookies del selenium y extraer con éxito los datos de las páginas "solo para usuarios registrados".

Además, asegúrese de no violar las reglas de los Términos de uso , específicamente:

Además, como condición para acceder a los Sitios, usted acepta no ... (c) utilizar cualquier medio electrónico o de gran volumen para acceder a los Sitios (incluidos, entre otros, robots, arañas, scripts o herramientas para raspar sitios web) );