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])