Scrapy - Shell

Descrição

Scrapy shell pode ser usado para descartar os dados com código sem erros, sem o uso de spider. O principal objetivo do Scrapy shell é testar o código extraído, XPath ou expressões CSS. Também ajuda a especificar as páginas da web das quais você está copiando os dados.

Configurando o Shell

O shell pode ser configurado instalando o console IPython (usado para computação interativa), que é um poderoso shell interativo que fornece preenchimento automático, saída colorida, etc.

Se você estiver trabalhando na plataforma Unix, é melhor instalar o IPython. Você também pode usar bpython , se o IPython estiver inacessível.

Você pode configurar o shell definindo a variável de ambiente chamada SCRAPY_PYTHON_SHELL ou definindo o arquivo scrapy.cfg da seguinte maneira -

[settings]
shell = bpython

Lançando o Shell

O Scrapy Shell pode ser iniciado usando o seguinte comando -

scrapy shell <url>

O url especifica o URL para o qual os dados precisam ser copiados.

Usando o Shell

O shell fornece alguns atalhos adicionais e objetos Scrapy, conforme descrito na tabela a seguir -

Atalhos Disponíveis

Shell fornece os seguintes atalhos disponíveis no projeto -

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

shelp()

Ele fornece os objetos e atalhos disponíveis com a opção de ajuda.

2

fetch(request_or_url)

Ele coleta a resposta da solicitação ou URL e os objetos associados são atualizados corretamente.

3

view(response)

Você pode visualizar a resposta para a solicitação fornecida no navegador local para observação e para exibir o link externo corretamente, ele anexa uma tag de base ao corpo da resposta.

Objetos Scrapy Disponíveis

A Shell fornece os seguintes objetos Scrapy disponíveis no projeto -

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

crawler

Ele especifica o objeto rastreador atual.

2

spider

Se não houver spider para o URL atual, ele tratará o URL ou objeto spider definindo o novo spider.

3

request

Ele especifica o objeto de solicitação da última página coletada.

4

response

Ele especifica o objeto de resposta para a última página coletada.

5

settings

Ele fornece as configurações atuais do Scrapy.

Exemplo de Sessão Shell

Vamos tentar extrair o site scrapy.org e, em seguida, começar a remover os dados do reddit.com conforme descrito.

Antes de prosseguir, primeiro vamos lançar o shell conforme mostrado no seguinte comando -

scrapy shell 'http://scrapy.org' --nolog

O Scrapy exibirá os objetos disponíveis ao usar o URL acima -

[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x1e16b50>
[s]   item       {}
[s]   request    <GET http://scrapy.org >
[s]   response   <200 http://scrapy.org >
[s]   settings   <scrapy.settings.Settings object at 0x2bfd650>
[s]   spider     <Spider 'default' at 0x20c6f50>
[s] Useful shortcuts:
[s]   shelp()           Provides available objects and shortcuts with help option
[s]   fetch(req_or_url) Collects the response from the request or URL and associated 
objects will get update
[s]   view(response)    View the response for the given request

Em seguida, comece com o trabalho de objetos, mostrado a seguir -

>> response.xpath('//title/text()').extract_first() 
u'Scrapy | A Fast and Powerful Scraping and Web Crawling Framework'  
>> fetch("http://reddit.com") 
[s] Available Scrapy objects: 
[s]   crawler     
[s]   item       {} 
[s]   request     
[s]   response   <200 https://www.reddit.com/> 
[s]   settings    
[s]   spider      
[s] Useful shortcuts: 
[s]   shelp()           Shell help (print this help) 
[s]   fetch(req_or_url) Fetch request (or URL) and update local objects 
[s]   view(response)    View response in a browser  
>> response.xpath('//title/text()').extract() 
[u'reddit: the front page of the internet']  
>> request = request.replace(method="POST")  
>> fetch(request) 
[s] Available Scrapy objects: 
[s]   crawler     
...

Invocando o Shell de Spiders para Inspecionar Respostas

Você pode inspecionar as respostas que são processadas no spider, apenas se estiver esperando obter essa resposta.

Por exemplo -

import scrapy 

class SpiderDemo(scrapy.Spider): 
   name = "spiderdemo" 
   start_urls = [ 
      "http://mysite.com", 
      "http://mysite1.org", 
      "http://mysite2.net", 
   ]  
   
   def parse(self, response): 
      # You can inspect one specific response 
      if ".net" in response.url: 
         from scrapy.shell import inspect_response 
         inspect_response(response, self)

Conforme mostrado no código acima, você pode invocar o shell de spiders para inspecionar as respostas usando a seguinte função -

scrapy.shell.inspect_response

Agora execute o spider e você obterá a seguinte tela -

2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200)  (referer: None) 
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200)  (referer: None) 
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200)  (referer: None) 
[s] Available Scrapy objects: 
[s]   crawler     
...  
>> response.url 
'http://mysite2.org'

Você pode examinar se o código extraído está funcionando usando o seguinte código -

>> response.xpath('//div[@class = "val"]')

Ele exibe a saída como

[]

A linha acima exibiu apenas uma saída em branco. Agora você pode invocar o shell para inspecionar a resposta da seguinte maneira -

>> view(response)

Ele exibe a resposta como

True