Scrapy: solicitudes y respuestas

Descripción

Scrapy puede rastrear sitios web usando el Request y Responseobjetos. Los objetos de solicitud pasan por el sistema, usan las arañas para ejecutar la solicitud y vuelven a la solicitud cuando devuelve un objeto de respuesta.

Solicitar objetos

El objeto de solicitud es una solicitud HTTP que genera una respuesta. Tiene la siguiente clase:

class scrapy.http.Request(url[, callback, method = 'GET', headers, body, cookies, meta,
   encoding = 'utf-8', priority = 0, dont_filter = False, errback])

La siguiente tabla muestra los parámetros de los objetos de solicitud:

No Señor Descripción de parámetros
1

url

Es una cadena que especifica la solicitud de URL.

2

callback

Es una función invocable que utiliza la respuesta de la solicitud como primer parámetro.

3

method

Es una cadena que especifica la solicitud del método HTTP.

4

headers

Es un diccionario con encabezados de solicitud.

5

body

Es una cadena o unicode que tiene un cuerpo de solicitud.

6

cookies

Es una lista que contiene cookies de solicitud.

7

meta

Es un diccionario que contiene valores para los metadatos de la solicitud.

8

encoding

Es una cadena que contiene codificación utf-8 utilizada para codificar URL.

9

priority

Es un número entero en el que el planificador utiliza la prioridad para definir el orden de procesamiento de las solicitudes.

10

dont_filter

Es un booleano que especifica que el programador no debe filtrar la solicitud.

11

errback

Es una función invocable a la que se debe llamar cuando se genera una excepción mientras se procesa una solicitud.

Pasar datos adicionales a funciones de devolución de llamada

La función de devolución de llamada de una solicitud se llama cuando la respuesta se descarga como su primer parámetro.

Por ejemplo

def parse_page1(self, response): 
   return scrapy.Request("http://www.something.com/some_page.html", 
      callback = self.parse_page2)  

def parse_page2(self, response): 
   self.logger.info("%s page visited", response.url)

Puedes usar Request.meta atributo, si desea pasar argumentos a funciones invocables y recibir esos argumentos en la segunda devolución de llamada como se muestra en el siguiente ejemplo:

def parse_page1(self, response): 
   item = DemoItem() 
   item['foremost_link'] = response.url 
   request = scrapy.Request("http://www.something.com/some_page.html", 
      callback = self.parse_page2) 
   request.meta['item'] = item 
   return request  

def parse_page2(self, response): 
   item = response.meta['item'] 
   item['other_link'] = response.url 
   return item

Uso de errbacks para detectar excepciones en el procesamiento de solicitudes

El errback es una función invocable que se llama cuando se genera una excepción mientras se procesa una solicitud.

El siguiente ejemplo demuestra esto:

import scrapy  

from scrapy.spidermiddlewares.httperror import HttpError 
from twisted.internet.error import DNSLookupError 
from twisted.internet.error import TimeoutError, TCPTimedOutError  

class DemoSpider(scrapy.Spider): 
   name = "demo" 
   start_urls = [ 
      "http://www.httpbin.org/",              # HTTP 200 expected 
      "http://www.httpbin.org/status/404",    # Webpage not found  
      "http://www.httpbin.org/status/500",    # Internal server error 
      "http://www.httpbin.org:12345/",        # timeout expected 
      "http://www.httphttpbinbin.org/",       # DNS error expected 
   ]  
   
   def start_requests(self): 
      for u in self.start_urls: 
         yield scrapy.Request(u, callback = self.parse_httpbin, 
         errback = self.errback_httpbin, 
         dont_filter=True)  
   
   def parse_httpbin(self, response): 
      self.logger.info('Recieved response from {}'.format(response.url)) 
      # ...  
   
   def errback_httpbin(self, failure): 
      # logs failures 
      self.logger.error(repr(failure))  
      
      if failure.check(HttpError): 
         response = failure.value.response 
         self.logger.error("HttpError occurred on %s", response.url)  
      
      elif failure.check(DNSLookupError): 
         request = failure.request 
         self.logger.error("DNSLookupError occurred on %s", request.url) 

      elif failure.check(TimeoutError, TCPTimedOutError): 
         request = failure.request 
         self.logger.error("TimeoutError occurred on %s", request.url)

Request.meta claves especiales

Las claves especiales request.meta son una lista de meta claves especiales identificadas por Scrapy.

La siguiente tabla muestra algunas de las claves de Request.meta -

No Señor Clave y descripción
1

dont_redirect

Es una clave cuando se establece en verdadero, no redirige la solicitud en función del estado de la respuesta.

2

dont_retry

Es una clave cuando se establece en verdadero, no vuelve a intentar las solicitudes fallidas y el middleware la ignorará.

3

handle_httpstatus_list

Es una clave que define qué códigos de respuesta por solicitud se pueden permitir.

4

handle_httpstatus_all

Es una clave que se usa para permitir cualquier código de respuesta para una solicitud configurándolo en verdadero .

5

dont_merge_cookies

Es una clave que se utiliza para evitar fusionarse con las cookies existentes configurándola en verdadero .

6

cookiejar

Es una clave que se utiliza para mantener varias sesiones de cookies por araña.

7

dont_cache

Es una clave que se utiliza para evitar el almacenamiento en caché de solicitudes HTTP y respuestas en cada política.

8

redirect_urls

Es una clave que contiene las URL a través de las cuales pasan las solicitudes.

9

bindaddress

Es la IP de la dirección IP saliente que se puede utilizar para realizar la solicitud.

10

dont_obey_robotstxt

Es una clave cuando se establece en verdadero, no filtra las solicitudes prohibidas por el estándar de exclusión de robots.txt, incluso si ROBOTSTXT_OBEY está habilitado.

11

download_timeout

Se utiliza para establecer el tiempo de espera (en segundos) por araña que el descargador esperará antes de que se agote.

12

download_maxsize

Se utiliza para establecer el tamaño máximo (en bytes) por araña, que descargará el descargador.

13

proxy

Se puede establecer un proxy para que los objetos de solicitud establezcan un proxy HTTP para el uso de solicitudes.

Solicitar subclases

Puede implementar su propia funcionalidad personalizada subclasificando la clase de solicitud. Las subclases de solicitud integradas son las siguientes:

Objetos FormRequest

La clase FormRequest se ocupa de los formularios HTML ampliando la solicitud base. Tiene la siguiente clase:

class scrapy.http.FormRequest(url[,formdata, callback, method = 'GET', headers, body, 
   cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])

A continuación se muestra el parámetro:

formdata - Es un diccionario que tiene datos de formulario HTML que se asignan al cuerpo de la solicitud.

Note - Los parámetros restantes son los mismos que la clase de solicitud y se explica en Request Objects sección.

Los siguientes métodos de clase son compatibles con FormRequest objetos además de los métodos de solicitud -

classmethod from_response(response[, formname = None, formnumber = 0, formdata = None, 
   formxpath = None, formcss = None, clickdata = None, dont_click = False, ...])

La siguiente tabla muestra los parámetros de la clase anterior:

No Señor Descripción de parámetros
1

response

Es un objeto que se utiliza para rellenar previamente los campos del formulario utilizando un formulario HTML de respuesta.

2

formname

Es una cadena en la que se utilizará el formulario que tiene el atributo de nombre, si se especifica.

3

formnumber

Es un número entero de formas que se utilizará cuando haya varias formas en la respuesta.

4

formdata

Es un diccionario de campos en los datos del formulario que se utilizan para anular.

5

formxpath

Es una cadena cuando se especifica, se usa la forma que coincide con el xpath.

6

formcss

Es una cadena cuando se especifica, se usa la forma que coincide con el selector css.

7

clickdata

Es un diccionario de atributos que se utiliza para observar el control en el que se hace clic.

8

dont_click

Los datos del formulario se enviarán sin hacer clic en ningún elemento, cuando se establezca en verdadero.

Ejemplos

A continuación, se muestran algunos de los ejemplos de uso de solicitudes:

Using FormRequest to send data via HTTP POST

El siguiente código demuestra cómo devolver FormRequest objeto cuando desee duplicar el formulario HTML POST en su araña -

return [FormRequest(url = "http://www.something.com/post/action", 
   formdata = {'firstname': 'John', 'lastname': 'dave'}, 
   callback = self.after_post)]

Using FormRequest.from_response() to simulate a user login

Normalmente, los sitios web utilizan elementos a través de los cuales proporcionan campos de formulario rellenados previamente.

los FormRequest.form_response() El método se puede utilizar cuando desee que estos campos se completen automáticamente mientras se raspa.

El siguiente ejemplo demuestra esto.

import scrapy  
class DemoSpider(scrapy.Spider): 
   name = 'demo' 
   start_urls = ['http://www.something.com/users/login.php']  
   def parse(self, response): 
      return scrapy.FormRequest.from_response( 
         response, 
         formdata = {'username': 'admin', 'password': 'confidential'}, 
         callback = self.after_login 
      )  
   
   def after_login(self, response): 
      if "authentication failed" in response.body: 
         self.logger.error("Login failed") 
         return  
      # You can continue scraping here

Objetos de respuesta

Es un objeto que indica la respuesta HTTP que se envía a las arañas para procesar. Tiene la siguiente clase:

class scrapy.http.Response(url[, status = 200, headers, body, flags])

La siguiente tabla muestra los parámetros de los objetos de respuesta:

No Señor Descripción de parámetros
1

url

Es una cadena que especifica la respuesta de la URL.

2

status

Es un número entero que contiene la respuesta de estado HTTP.

3

headers

Es un diccionario que contiene encabezados de respuesta.

4

body

Es una cadena con cuerpo de respuesta.

5

flags

Es una lista que contiene banderas de respuesta.

Subclases de respuesta

Puede implementar su propia funcionalidad personalizada subclasificando la clase de respuesta. Las subclases de respuesta incorporadas son las siguientes:

TextResponse objects

Los objetos TextResponse se utilizan para datos binarios como imágenes, sonidos, etc., que tiene la capacidad de codificar la clase Response base. Tiene la siguiente clase:

class scrapy.http.TextResponse(url[, encoding[,status = 200, headers, body, flags]])

A continuación se muestra el parámetro:

encoding - Es una cadena con codificación que se utiliza para codificar una respuesta.

Note - Los parámetros restantes son los mismos que la clase de respuesta y se explica en Response Objects sección.

La siguiente tabla muestra los atributos admitidos por el objeto TextResponse además de los métodos de respuesta:

No Señor Atributo y descripción
1

text

Es un cuerpo de respuesta, donde se puede acceder a response.text varias veces.

2

encoding

Es una cadena que contiene la codificación de respuesta.

3

selector

Es un atributo instanciado en el primer acceso y usa la respuesta como objetivo.

La siguiente tabla muestra los métodos admitidos por los objetos TextResponse además de los métodos de respuesta :

No Señor Método y descripción
1

xpath (query)

Es un acceso directo a TextResponse.selector.xpath (consulta).

2

css (query)

Es un acceso directo a TextResponse.selector.css (consulta).

3

body_as_unicode()

Es un cuerpo de respuesta disponible como método, donde se puede acceder a response.text varias veces.

Objetos HtmlResponse

Es un objeto que admite la codificación y el descubrimiento automático al observar el atributo meta httpequiv de HTML. Sus parámetros son los mismos que los de la clase de respuesta y se explica en la sección Objetos de respuesta. Tiene la siguiente clase:

class scrapy.http.HtmlResponse(url[,status = 200, headers, body, flags])

Objetos XmlResponse

Es un objeto que admite la codificación y el descubrimiento automático al mirar la línea XML. Sus parámetros son los mismos que los de la clase de respuesta y se explica en la sección Objetos de respuesta. Tiene la siguiente clase:

class scrapy.http.XmlResponse(url[, status = 200, headers, body, flags])