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