Scrapy - solicitações e respostas

Descrição

O Scrapy pode rastrear sites usando o Request e Responseobjetos. Os objetos de solicitação passam pelo sistema, usam os spiders para executar a solicitação e retornam à solicitação quando ela retorna um objeto de resposta.

Objetos de Solicitação

O objeto de solicitação é uma solicitação HTTP que gera uma resposta. Tem a seguinte classe -

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

A tabela a seguir mostra os parâmetros dos objetos Request -

Sr. Não Parâmetro e Descrição
1

url

É uma string que especifica a solicitação de URL.

2

callback

É uma função que pode ser chamada, que usa a resposta da solicitação como primeiro parâmetro.

3

method

É uma string que especifica a solicitação do método HTTP.

4

headers

É um dicionário com cabeçalhos de solicitação.

5

body

É uma string ou Unicode que possui um corpo de solicitação.

6

cookies

É uma lista que contém cookies de solicitação.

7

meta

É um dicionário que contém valores para metadados da solicitação.

8

encoding

É uma string que contém a codificação utf-8 usada para codificar o URL.

9

priority

É um número inteiro onde o planejador usa a prioridade para definir o pedido para processar as solicitações.

10

dont_filter

É um booleano que especifica que o planejador não deve filtrar a solicitação.

11

errback

É uma função chamável a ser chamada quando uma exceção durante o processamento de uma solicitação é levantada.

Passando dados adicionais para funções de retorno de chamada

A função de retorno de chamada de uma solicitação é chamada quando a resposta é baixada como seu primeiro parâmetro.

Por exemplo -

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)

Você pode usar Request.meta atributo, se você deseja passar argumentos para funções chamáveis ​​e receber esses argumentos no segundo retorno de chamada, conforme mostrado no exemplo a seguir -

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

Usando errbacks para capturar exceções no processamento de solicitações

O errback é uma função que pode ser chamada a ser chamada quando uma exceção durante o processamento de uma solicitação é levantada.

O exemplo a seguir demonstra isso -

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 Chaves Especiais

As chaves especiais request.meta são uma lista de meta chaves especiais identificadas por Scrapy.

A tabela a seguir mostra algumas das chaves de Request.meta -

Sr. Não Chave e descrição
1

dont_redirect

É uma chave quando definida como verdadeira, não redireciona a solicitação com base no status da resposta.

2

dont_retry

É uma chave quando definida como verdadeira, não repete as solicitações com falha e será ignorada pelo middleware.

3

handle_httpstatus_list

É uma chave que define quais códigos de resposta por solicitação podem ser permitidos.

4

handle_httpstatus_all

É uma chave usada para permitir qualquer código de resposta para uma solicitação, definindo-o como verdadeiro .

5

dont_merge_cookies

É uma chave usada para evitar a fusão com os cookies existentes, definindo-o como verdadeiro .

6

cookiejar

É uma chave usada para manter várias sessões de cookies por spider.

7

dont_cache

É uma chave usada para evitar o armazenamento em cache de solicitações e respostas HTTP em cada política.

8

redirect_urls

É uma chave que contém URLs pelos quais as solicitações passam.

9

bindaddress

É o IP do endereço IP de saída que pode ser usado para realizar a solicitação.

10

dont_obey_robotstxt

É uma chave quando definida como verdadeira, não filtra as solicitações proibidas pelo padrão de exclusão do robots.txt, mesmo se ROBOTSTXT_OBEY estiver habilitado.

11

download_timeout

É usado para definir o tempo limite (em segundos) por spider que o downloader aguardará antes de expirar.

12

download_maxsize

É usado para definir o tamanho máximo (em bytes) por spider, que o downloader baixará.

13

proxy

O proxy pode ser definido para objetos Request para definir o proxy HTTP para o uso de solicitações.

Solicitar subclasses

Você pode implementar sua própria funcionalidade personalizada criando uma subclasse da classe de solicitação. As subclasses de solicitação integradas são as seguintes -

Objetos FormRequest

A classe FormRequest lida com formulários HTML estendendo a solicitação base. Tem a seguinte classe -

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

A seguir está o parâmetro -

formdata - É um dicionário com dados de formulário HTML atribuídos ao corpo da solicitação.

Note - Os parâmetros restantes são iguais aos da classe de solicitação e são explicados em Request Objects seção.

Os seguintes métodos de classe são suportados por FormRequest objetos, além de métodos de solicitação -

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

A tabela a seguir mostra os parâmetros da classe acima -

Sr. Não Parâmetro e Descrição
1

response

É um objeto usado para preencher previamente os campos do formulário usando o formulário HTML de resposta.

2

formname

É uma string em que o formulário com o atributo de nome será usado, se especificado.

3

formnumber

É um número inteiro de formulários a ser usado quando há vários formulários na resposta.

4

formdata

É um dicionário de campos nos dados do formulário usados ​​para substituir.

5

formxpath

É uma string quando especificada, o formulário que corresponde ao xpath é usado.

6

formcss

É uma string quando especificada, o formulário que corresponde ao seletor css é usado.

7

clickdata

É um dicionário de atributos usado para observar o controle clicado.

8

dont_click

Os dados do formulário serão enviados sem clicar em nenhum elemento, quando definido como verdadeiro.

Exemplos

A seguir estão alguns dos exemplos de uso de solicitação -

Using FormRequest to send data via HTTP POST

O código a seguir demonstra como retornar FormRequest objeto quando você deseja duplicar o POST do formulário HTML em seu spider -

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, os sites usam elementos por meio dos quais fornece campos de formulário pré-preenchidos.

o FormRequest.form_response() pode ser usado quando você deseja que esses campos sejam preenchidos automaticamente durante a extração.

O exemplo a seguir demonstra isso.

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 Resposta

É um objeto que indica a resposta HTTP que é fornecida aos spiders para processamento. Tem a seguinte classe -

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

A tabela a seguir mostra os parâmetros dos objetos Response -

Sr. Não Parâmetro e Descrição
1

url

É uma string que especifica a resposta do URL.

2

status

É um número inteiro que contém a resposta de status HTTP.

3

headers

É um dicionário contendo cabeçalhos de resposta.

4

body

É uma string com corpo de resposta.

5

flags

É uma lista contendo sinalizadores de resposta.

Subclasses de resposta

Você pode implementar sua própria funcionalidade personalizada criando uma subclasse da classe de resposta. As subclasses de resposta integradas são as seguintes -

TextResponse objects

Os objetos TextResponse são usados ​​para dados binários, como imagens, sons etc., que têm a capacidade de codificar a classe Response básica. Tem a seguinte classe -

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

A seguir está o parâmetro -

encoding - É uma string com codificação usada para codificar uma resposta.

Note - Os parâmetros restantes são iguais aos da classe de resposta e são explicados em Response Objects seção.

A tabela a seguir mostra os atributos suportados pelo objeto TextResponse, além dos métodos de resposta -

Sr. Não Atributo e descrição
1

text

É um corpo de resposta, onde response.text pode ser acessado várias vezes.

2

encoding

É uma string contendo codificação para resposta.

3

selector

É um atributo instanciado no primeiro acesso e usa a resposta como destino.

A tabela a seguir mostra os métodos suportados por objetos TextResponse , além dos métodos de resposta -

Sr. Não Método e Descrição
1

xpath (query)

É um atalho para TextResponse.selector.xpath (query).

2

css (query)

É um atalho para TextResponse.selector.css (query).

3

body_as_unicode()

É um corpo de resposta disponível como um método, onde response.text pode ser acessado várias vezes.

Objetos HtmlResponse

É um objeto que oferece suporte à codificação e autodescoberta observando o atributo metahttpequiv do HTML. Seus parâmetros são os mesmos da classe de resposta e são explicados na seção Objetos de resposta. Tem a seguinte classe -

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

Objetos XmlResponse

É um objeto que oferece suporte à codificação e autodescoberta observando a linha XML. Seus parâmetros são os mesmos da classe de resposta e são explicados na seção Objetos de resposta. Tem a seguinte classe -

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