urljoin follow example python scrapy

python - follow - Arrastrándose con una sesión autenticada en Scrapy



scrapy python documentation (4)

Para que la solución anterior funcione, tuve que hacer que CrawlSpider heredara de InitSpider y ya no de BaseSpider al cambiar, en el código fuente de scrapy, lo siguiente. En el archivo scrapy / contrib / spiders / crawl.py:

  1. agregar: from scrapy.contrib.spiders.init import InitSpider
  2. cambiar la class CrawlSpider(BaseSpider) a la class CrawlSpider(InitSpider)

De lo contrario, la araña no llamaría al método init_request .

¿Hay alguna otra manera más fácil?

En mi pregunta anterior , no era muy específico sobre mi problema (raspando con una sesión autenticada con Scrapy), con la esperanza de poder deducir la solución de una respuesta más general. Probablemente debería haber usado la palabra " crawling .

Entonces, aquí está mi código hasta ahora:

class MySpider(CrawlSpider): name = ''myspider'' allowed_domains = [''domain.com''] start_urls = [''http://www.domain.com/login/''] rules = ( Rule(SgmlLinkExtractor(allow=r''-/w+.html$''), callback=''parse_item'', follow=True), ) def parse(self, response): hxs = HtmlXPathSelector(response) if not "Hi Herman" in response.body: return self.login(response) else: return self.parse_item(response) def login(self, response): return [FormRequest.from_response(response, formdata={''name'': ''herman'', ''password'': ''password''}, callback=self.parse)] def parse_item(self, response): i[''url''] = response.url # ... do more things return i

Como puede ver, la primera página que visito es la página de inicio de sesión. Si aún no estoy autenticado (en la función de parse ), llamo a mi función de login personalizada, que se publica en el formulario de inicio de sesión. Entonces, si estoy autenticado, quiero continuar rastreando.

El problema es que la función de parse que he intentado anular para iniciar sesión, ahora ya no hace las llamadas necesarias para raspar más páginas (supongo). Y no estoy seguro de cómo guardar los Elementos que creo.

¿Alguien ha hecho algo así antes? (Autenticar, luego rastrear, usando un CrawlSpider ) Cualquier ayuda sería apreciada.


Si lo que necesita es Autenticación Http use los ganchos de middleware proporcionados.

en settings.py

DOWNLOADER_MIDDLEWARE = [ ''scrapy.contrib.downloadermiddleware.httpauth.HttpAuthMiddleware'']

y en tu spider class agrega propiedades

http_user = "user" http_pass = "pass"


Solo agregando la respuesta de Acorn arriba. Usando su método, mi script no estaba analizando las start_urls después del inicio de sesión. Salía después de un inicio de sesión exitoso en check_login_response. Sin embargo, pude ver que tenía el generador. Necesitaba usar

return self.initialized()

entonces se llamó a la función de análisis.


No anule la función de parse en un CrawlSpider :

Cuando está utilizando un CrawlSpider , no debe anular la función de parse . Hay una advertencia en la documentación de CrawlSpider aquí: http://doc.scrapy.org/en/0.14/topics/spiders.html#scrapy.contrib.spiders.Rule

Esto se debe a que con un CrawlSpider , el parse (la devolución de llamada predeterminada de cualquier solicitud) envía la respuesta para que sea procesada por la Rule .

Iniciando sesión antes de rastrear:

Para tener algún tipo de inicialización antes de que una araña comience a gatear, puede usar un InitSpider (que hereda de un CrawlSpider ) y anular la función init_request . Esta función se ejecutará cuando la araña se esté inicializando y antes de que comience a gatear.

Para que Spider comience a gatear, debes llamar a self.initialized .

Puede leer el código que es responsable de esto here (tiene documentos útiles).

Un ejemplo:

from scrapy.contrib.spiders.init import InitSpider from scrapy.http import Request, FormRequest from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from scrapy.contrib.spiders import Rule class MySpider(InitSpider): name = ''myspider'' allowed_domains = [''example.com''] login_page = ''http://www.example.com/login'' start_urls = [''http://www.example.com/useful_page/'', ''http://www.example.com/another_useful_page/''] rules = ( Rule(SgmlLinkExtractor(allow=r''-/w+.html$''), callback=''parse_item'', follow=True), ) def init_request(self): """This function is called before crawling starts.""" return Request(url=self.login_page, callback=self.login) def login(self, response): """Generate a login request.""" return FormRequest.from_response(response, formdata={''name'': ''herman'', ''password'': ''password''}, callback=self.check_login_response) def check_login_response(self, response): """Check the response returned by a login request to see if we are successfully logged in. """ if "Hi Herman" in response.body: self.log("Successfully logged in. Let''s start crawling!") # Now the crawling can begin.. return self.initialized() else: self.log("Bad times :(") # Something went wrong, we couldn''t log in, so nothing happens. def parse_item(self, response): # Scrape data from page

Guardando artículos:

Los elementos que devuelve su Spider pasan a Pipeline, que es responsable de hacer lo que quiera con los datos. Te recomiendo que leas la documentación: http://doc.scrapy.org/en/0.14/topics/item-pipeline.html

Si tiene algún problema / pregunta con respecto a los Item , no dude en abrir una nueva pregunta y haré todo lo posible para ayudar.