O Scrapy é uma poderosa estrutura para criar rastreadores da Web em Python. Ele fornece uma maneira integrada de seguir links e extrair informações de páginas da Web. Terá de criar um novo projeto Scrapy e um spider para definir o comportamento do seu rastreador.
Antes de começar a rastrear um site como a Amazon, é importante verificar o ficheiro robots.txt do site para ver quais os caminhos de URL permitidos. O Scrapy lê automaticamente este ficheiro e segue-o quando a configuração ROBOTSTXT_OBEY está definida como true, o que é o padrão para projetos criados usando o comando Scrapy `startproject`.
Para criar um novo projeto Scrapy, é necessário executar o seguinte comando:
$ scrapy startproject amazon_crawler
Este comando irá gerar um projeto com a seguinte estrutura:
amazon_crawler/
├── scrapy.cfg
└── amazon_crawler
├── __init__.py
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
└── spiders
├── __init__.py
Para criar um spider, utilize o comando `genspider` da CLI do Scrapy. O comando tem a seguinte definição:
$ scrapy genspider [options] <name> <domain>
Para gerar um spider para este crawler, podemos executar:
$ cd amazon_crawler
$ scrapy genspider baby_products amazon.com
Deve criar um ficheiro chamado `baby_products.py` dentro da pasta chamada `spiders` e gerar este código:
import scrapy
class BabyProductsSpider(scrapy.Spider):
name = 'wikipedia'
allowed_domains = ['en.wikipedia.com']
start_urls = ['http://en.wikipedia.com/']
def parse(self, response):
pass
O Scrapy também oferece uma variedade de classes de spider pré-construídas, tais como CrawlSpider, XMLFeedSpider, CSVFeedSpider e SitemapSpider. A classe CrawlSpider, que é construída sobre a classe base Spider, inclui um atributo extra "rules" para definir como navegar por um site. Cada regra utiliza um LinkExtractor para determinar quais links devem ser extraídos de cada página.
Para o nosso caso de uso, devemos herdar a nossa classe Spider da CrawlSpider. Também precisaremos de criar uma regra LinkExtractor que indique ao rastreador para extrair links apenas da paginação da Amazon. Lembre-se de que o nosso objetivo era recolher dados de todos os produtos para bebés da Amazon, por isso não queremos, na verdade, seguir todos os links que encontrarmos na página.
Depois, precisamos de criar mais dois métodos na nossa classe, `parse_item` e `parse_product`. `parse_item` será passado como uma função de callback para a nossa regra LinkExtractor e será chamado com cada link extraído. `parse_product` irá analisar cada produto… ¯\_(ツ)_/¯
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from bs4 import BeautifulSoup
class BabyProductsSpider(CrawlSpider):
name = 'baby_products'
allowed_domains = ['amazon.com']
start_urls = ['https://amazon.com/s?k=baby+products']
rules = (
Rule(
LinkExtractor(
restrict_css='.s-pagination-strip'
),
callback='parse_item',
follow=True),
)
def parse_item(self, response):
soup = BeautifulSoup(response.text, 'html.parser')
products = soup.select('div[data-component-type="s-search-result"]')
data = []
for product in products:
parsed_product = self.parse_product(product)
if (parsed_product != 'error'):
data.append(parsed_product)
return {
'url': response.url,
'data': data
}
def parse_product(self, product):
try:
link = product.select_one('a.a-text-normal')
price = product.select_one('span.a-price > span.a-offscreen').text
return {
'product_url': link['href'],
'name': link.text,
'price': price
}
except:
return 'error'
Para iniciar o rastreador, pode executar:
$ scrapy crawl baby_products
Irá ver muitos registos na consola (pode especificar um ficheiro de registo com `--logfile [log_file_name]`).
Usei a Pesquisa da Amazon como exemplo para demonstrar os conceitos básicos da criação de um rastilhador web em Python. No entanto, o rastilhador não encontra muitos links para seguir e não está adaptado a um caso de uso específico para os dados. Se pretende extrair dados específicos da Pesquisa da Amazon, pode considerar a utilização da nossa API de Dados de Produtos da Amazon. Criámos analisadores personalizados para a Pesquisa da Amazon, páginas de Produtos e Categorias, e estes devolvem dados no formato JSON, prontos a serem utilizados na sua aplicação.