Por que Scrapy?
Scrapy é uma biblioteca robusta de scraping da web, que oferece a capacidade de baixar páginas da web, imagens e quaisquer dados que você possa imaginar na velocidade da luz. A velocidade é de grande importância na computação, e o Scrapy trabalha nisso visitando sites de forma assíncrona e fazendo muito trabalho em segundo plano, fazendo com que toda a tarefa pareça fácil.
Deve ser dito que Python tem outras bibliotecas que podem ser usadas para extrair dados de sites, mas nenhuma é comparável ao Scrapy quando se trata de eficiência.
Instalação
Vamos dar uma olhada rápida em como esta poderosa biblioteca pode ser instalada em sua máquina.
Como acontece com a maioria das bibliotecas Python, você pode instalar o Scrapy usando o módulo pip:
pip install ScrapyVocê pode verificar se a instalação foi bem-sucedida importando scrapy no shell interativo do Python.
$ pythonPython 3.5.2 (padrão, 14 de setembro de 2017, 22:51:06)
[GCC 5.4.0 20160609] no Linux
Digite “ajuda”, “direitos autorais”, “créditos” ou “licença” para obter mais informações.
>>> import scrapyAgora que terminamos a instalação, vamos entrar no centro das coisas.
Criando um Projeto de Web Scraping
Durante a instalação, a palavra-chave scrapy foi adicionada ao caminho para que possamos usar a palavra-chave diretamente da linha de comando. Estaríamos aproveitando isso ao longo de nosso uso da biblioteca.
No diretório de sua escolha, execute o seguinte comando:
scrapy startproject webscraperIsso criaria um diretório chamado arranha-céu no diretório atual e scrapy.arquivo cfg. No arranha-céu diretório teria __iniciar__.py, itens.py, middlewares.py, pipelines.py, configurações.py arquivos e um diretório chamado aranhas.
Nossos arquivos de aranha eu.e. o script que faz o webcraping para nós seria armazenado no aranhas diretório.
Escrevendo nossa aranha
Antes de prosseguirmos para escrever nosso spider, espera-se que já saibamos qual site queremos raspar. Para o propósito deste artigo, estamos copiando um exemplo de site de webcraping: http: // exemplo.Raspagem da web.com.
Este site tem apenas nomes de países e suas bandeiras, com páginas diferentes e vamos desfazer-se de três das páginas. As três páginas nas quais trabalharíamos são:
http: // exemplo.Raspagem da web.com / locais / padrão / índice / 0
http: // exemplo.Raspagem da web.com / locais / padrão / índice / 1
http: // exemplo.Raspagem da web.com / locais / padrão / índice / 2
De volta ao nosso spider, vamos criar um sample_spider.py no diretório spiders. Do terminal, um simples toque em sample_spider.py comando ajudaria a criar um novo arquivo.
Depois de criar o arquivo, nós o preencheríamos com as seguintes linhas de código:
importar sucataclasse SampleSpider (scrapy.Aranha):
nome = "amostra"
start_urls = [
"http: // exemplo.Raspagem da web.com / locais / padrão / índice / 0 ",
"http: // exemplo.Raspagem da web.com / locais / padrão / índice / 1 ",
"http: // exemplo.Raspagem da web.com / locais / padrão / índice / 2 "
]
def parse (self, response):
page_number = resposta.url.dividir ('/') [- 1]
file_name = "página .html ".formato (número_página)
com open (file_name, 'wb') como arquivo:
Arquivo.escrever (resposta.corpo)
No nível superior do diretório do projeto, execute o seguinte comando:
amostra scrapy crawlLembre-se de que demos nosso SampleSpider classe A nome atributo amostra.
Depois de executar esse comando, você notaria que três arquivos chamados page0.html, page1.html, page2.html são salvos no diretório.
Vamos dar uma olhada no que acontece com o código:
importar sucataPrimeiro, importamos a biblioteca para o nosso namespace.
classe SampleSpider (scrapy.Aranha):nome = "amostra"
Em seguida, criamos uma classe de aranha que chamamos SampleSpider. Nossa aranha herda de scrapy.Aranha. Todas as nossas aranhas têm que herdar de sucata.Aranha. Depois de criar a classe, damos à nossa aranha um nome atributo, este nome atributo é usado para invocar a aranha do terminal. Se você se lembra, nós executamos o amostra scrapy crawl comando para executar nosso código.
start_urls = ["http: // exemplo.Raspagem da web.com / locais / padrão / índice / 0 ",
"http: // exemplo.Raspagem da web.com / locais / padrão / índice / 1 ",
"http: // exemplo.Raspagem da web.com / locais / padrão / índice / 2 "
]
Também temos uma lista de urls para a aranha visitar. A lista deve ser chamada start_urls. Se você quiser dar à lista um nome diferente, teríamos que definir um start_requests função que nos dá mais alguns recursos. Para saber mais, você pode verificar a documentação scrapy.
Independentemente disso, não se esqueça de incluir http: // ou https: // para seus links, caso contrário, você teria que lidar com um erro de esquema ausente.
def parse (self, response):Em seguida, declaramos uma função de análise e fornecemos a ela um parâmetro de resposta. Quando o código é executado, a função de análise é evocada e o objeto de resposta é enviado, o qual contém todas as informações da página da web visitada.
page_number = resposta.url.dividir ('/') [- 1]file_name = "página .html ".formato (número_página)
O que fizemos com este código é dividir a string contendo o endereço e salvar o número da página sozinho em um número de página variável. Então criamos um nome do arquivo variável inserindo o número de página na string que seria o nome dos arquivos que estaríamos criando.
com open (file_name, 'wb') como arquivo:Arquivo.escrever (resposta.corpo)
Agora criamos o arquivo e estamos escrevendo o conteúdo da página da web no arquivo usando o corpo atributo do resposta objeto.
Podemos fazer mais do que apenas salvar a página da web. A biblioteca BeautifulSoup pode ser usada para analisar o corpo.resposta. Você pode verificar este tutorial do BeautiulSoup se não estiver familiarizado com a biblioteca.
Da página a ser descartada, aqui está um trecho do html contendo os dados de que precisamos:
Você notaria que todos os dados necessários estão incluídos em tags div, então vamos reescrever o código para analisar o html.
Aqui está nosso novo script:
de bs4 import BeautifulSoup
classe SampleSpider (scrapy.Aranha):
nome = "amostra"
start_urls = [
"http: // exemplo.Raspagem da web.com / locais / padrão / índice / 0 ",
"http: // exemplo.Raspagem da web.com / locais / padrão / índice / 1 ",
"http: // exemplo.Raspagem da web.com / locais / padrão / índice / 2 "
]
def parse (self, response):
page_number = resposta.url.dividir ('/') [- 1]
file_name = "página .TXT".formato (número_página)
com open (file_name, 'w') como arquivo:
html_content = BeautifulSoup (resposta.corpo, "lxml")
div_tags = html_content.find ("div", "id": "resultados")
country_tags = div_tags.find_all ("div")
country_name_position = zip (intervalo (len (country_tags)), country_tags)
para a posição, country_name em country_name_position:
Arquivo.escrever ("número do país : \ n".formato (posição + 1, country_name.texto))
O código é praticamente igual ao inicial, no entanto, adicionei BeautifulSoup ao nosso namespace e alterei a lógica na função de análise.
Vamos dar uma olhada rápida na lógica.
def parse (self, response):Aqui, definimos a função de análise e atribuímos a ela um parâmetro de resposta.
page_number = resposta.url.dividir ('/') [- 1]file_name = "página .TXT".formato (número_página)
com open (file_name, 'w') como arquivo:
Isso faz a mesma coisa que discutida no código inicial, a única diferença é que estamos trabalhando com um arquivo de texto em vez de um arquivo html. Estaríamos salvando os dados copiados no arquivo de texto, e não todo o conteúdo da web em html como feito anteriormente.
html_content = BeautifulSoup (resposta.corpo, "lxml")O que fizemos nesta linha de código é enviar o resposta.corpo como um argumento para a biblioteca BeautifulSoup e atribuiu os resultados ao html_content variável.
div_tags = html_content.find ("div", "id": "resultados")Pegando o conteúdo html, estamos analisando aqui procurando por um div tag que também tem e eu ia atributo com resultados como é o valor, então podemos salvá-lo em um div_tags variável.
country_tags = div_tags.find_all ("div")Lembre-se de que os países existiam em div também, agora estamos simplesmente obtendo todas as div tags e salvá-los como uma lista no country_tags variável.
country_name_position = zip (intervalo (len (country_tags)), country_tags)para a posição, country_name em country_name_position:
Arquivo.escrever ("número do país : \ n".formato (posição + 1, country_name.texto))
Aqui, estamos iterando a posição dos países entre todas as tags de país e, em seguida, salvamos o conteúdo em um arquivo de texto.
Portanto, em seu arquivo de texto, você teria algo como:
país número 1: Afeganistãopaís número 2: Ilhas Aland
país número 3: Albânia
…
Conclusão
O Scrapy é sem dúvida uma das bibliotecas mais poderosas que existe, é muito rápido e basicamente baixa a página da web. Em seguida, dá a você a liberdade de fazer o que quiser com o conteúdo da web.
Devemos observar que Scrapy pode fazer muito mais do que verificamos aqui. Você pode analisar dados com seletores Scrapy CSS ou Xpath se desejar. Você pode ler a documentação se precisar fazer algo mais complexo.