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