Scrapy es un potente marco de trabajo para crear rastreadores web en Python. Proporciona una forma integrada de seguir enlaces y extraer información de páginas web. Tendrás que crear un nuevo proyecto de Scrapy y una araña para definir el comportamiento de tu rastreador.
Antes de empezar a rastrear un sitio web como Amazon, es importante consultar el archivo robots.txt del sitio web para ver qué rutas URL están permitidas. Scrapy lee automáticamente este archivo y lo sigue cuando la configuración ROBOTSTXT_OBEY está establecida en true, que es el valor predeterminado para los proyectos creados con el comando de Scrapy `startproject`.
Para crear un nuevo proyecto de Scrapy, debes ejecutar el siguiente comando:
$ scrapy startproject amazon_crawler
Este comando generará un proyecto con la siguiente estructura:
amazon_crawler/
├── scrapy.cfg
└── amazon_crawler
├── __init__.py
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
└── spiders
├── __init__.py
Para crear una araña, utiliza el comando `genspider` de la CLI de Scrapy. El comando tiene la siguiente definición:
$ scrapy genspider [options] <name> <domain>
Para generar una araña para este rastreador, podemos ejecutar:
$ cd amazon_crawler
$ scrapy genspider baby_products amazon.com
Debería crear un archivo llamado `baby_products.py` dentro de la carpeta llamada `spiders` y generar 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
Scrapy también ofrece una variedad de clases de arañas predefinidas, como CrawlSpider, XMLFeedSpider, CSVFeedSpider y SitemapSpider. La clase CrawlSpider, que se basa en la clase Spider base, incluye un atributo adicional «rules» para definir cómo navegar por un sitio web. Cada regla utiliza un LinkExtractor para determinar qué enlaces deben extraerse de cada página.
Para nuestro caso de uso, debemos heredar nuestra clase Spider de CrawlSpider. También tendremos que crear una regla LinkExtractor que indique al rastreador que extraiga enlaces únicamente de la paginación de Amazon. Recuerda que nuestro objetivo era recopilar datos de todos los productos para bebés de Amazon, por lo que en realidad no queremos seguir todos los enlaces que encontremos en la página.
A continuación, debemos crear otros dos métodos en nuestra clase: `parse_item` y `parse_product`. `parse_item` se pasará como función de callback a nuestra regla LinkExtractor y se invocará con cada enlace extraído. `parse_product` analizará cada producto… ¯\_(ツ)_/¯
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 el rastreador, puedes ejecutar:
$ scrapy crawl baby_products
Verás muchos registros en la consola (puedes especificar un archivo de registro con `--logfile [nombre_del_archivo_de_registro]`).
He utilizado Amazon Search como ejemplo para mostrar los conceptos básicos de la creación de un rastreador web en Python. Sin embargo, el rastreador no encuentra muchos enlaces que seguir y no está diseñado para un caso de uso específico de los datos. Si deseas extraer datos específicos de Amazon Search, puedes considerar el uso de nuestra API de datos de productos de Amazon. Hemos creado analizadores personalizados para las páginas de búsqueda, productos y categorías de Amazon, y devuelve datos en formato JSON listos para ser utilizados en tu aplicación.