python - follow - Uso de Scrapy con sesión de usuario autenticada(iniciada sesión)
scrapy python (1)
En el código anterior, el FormRequest
que se está utilizando para autenticar tiene la función after_login
establecida como su devolución de llamada. Esto significa que se llamará a la función after_login y se aprobará la página que el intento de inicio de sesión obtuvo como respuesta.
A continuación, se comprueba que haya iniciado sesión correctamente buscando en la página una cadena específica, en este caso "authentication failed"
. Si lo encuentra, la araña termina.
Ahora, una vez que la araña ha llegado tan lejos, sabe que se ha autenticado correctamente, y puede comenzar a generar nuevas solicitudes y / o datos de raspado. Entonces, en este caso:
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request
...
def after_login(self, response):
# check login succeed before going on
if "authentication failed" in response.body:
self.log("Login failed", level=log.ERROR)
return
# We''ve successfully authenticated, let''s have some fun!
else:
return Request(url="http://www.example.com/tastypage/",
callback=self.parse_tastypage)
def parse_tastypage(self, response):
hxs = HtmlXPathSelector(response)
yum = hxs.select(''//img'')
# etc.
Si miras here , hay un ejemplo de una araña que se autentica antes de raspar.
En este caso, maneja las cosas en la función de parse
(la devolución de llamada predeterminada de cualquier solicitud).
def parse(self, response):
hxs = HtmlXPathSelector(response)
if hxs.select("//form[@id=''UsernameLoginForm_LoginForm'']"):
return self.login(response)
else:
return self.get_section_links(response)
Por lo tanto, cada vez que se realiza una solicitud, la respuesta se verifica para detectar la presencia del formulario de inicio de sesión. Si está allí, entonces sabemos que debemos iniciar sesión, por lo que llamamos a la función relevante, si no está presente, llamamos a la función que es responsable de raspar los datos de la respuesta.
Espero que esto esté claro, no dude en preguntar si tiene alguna otra pregunta!
Editar:
Bien, así que quieres hacer más que solo generar una solicitud y rasparla. Quieres seguir los enlaces.
Para hacer eso, todo lo que necesita hacer es raspar los enlaces relevantes de la página y generar solicitudes usando esas URL. Por ejemplo:
def parse_page(self, response):
""" Scrape useful stuff from page, and spawn new requests
"""
hxs = HtmlXPathSelector(response)
images = hxs.select(''//img'')
# .. do something with them
links = hxs.select(''//a/@href'')
# Yield a new request for each link we found
for link in links:
yield Request(url=link, callback=self.parse_page)
Como puede ver, genera una nueva solicitud para cada url en la página, y cada una de esas solicitudes llamará a esta misma función con su respuesta, por lo que tenemos algunos raspados recursivos en curso.
Lo que he escrito arriba es solo un ejemplo. Si desea "rastrear" páginas, debería buscar en CrawlSpiders lugar de hacer las cosas manualmente.
En los documentos de Scrapy , hay el siguiente ejemplo para ilustrar cómo usar una sesión autenticada en Scrapy:
class LoginSpider(BaseSpider):
name = ''example.com''
start_urls = [''http://www.example.com/users/login.php'']
def parse(self, response):
return [FormRequest.from_response(response,
formdata={''username'': ''john'', ''password'': ''secret''},
callback=self.after_login)]
def after_login(self, response):
# check login succeed before going on
if "authentication failed" in response.body:
self.log("Login failed", level=log.ERROR)
return
# continue scraping with authenticated session...
Lo tengo funcionando, y está bien. Pero mi pregunta es : ¿Qué tiene que hacer para continue scraping with authenticated session
, como dicen en el comentario de la última línea?