Scrapy est un framework puissant permettant de créer des robots d'indexation en Python. Il offre un moyen intégré de suivre les liens et d'extraire des informations des pages web. Vous devrez créer un nouveau projet Scrapy et un spider pour définir le comportement de votre robot d'indexation.
Avant de commencer à explorer un site web comme Amazon, il est important de vérifier le fichier robots.txt du site pour voir quels chemins d'URL sont autorisés. Scrapy lit automatiquement ce fichier et le suit lorsque le paramètre ROBOTSTXT_OBEY est défini sur true, ce qui est la valeur par défaut pour les projets créés à l'aide de la commande Scrapy `startproject`.
Pour créer un nouveau projet Scrapy, vous devez exécuter la commande suivante :
$ scrapy startproject amazon_crawler
Cette commande générera un projet présentant la structure suivante :
amazon_crawler/
├── scrapy.cfg
└── amazon_crawler
├── __init__.py
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
└── spiders
├── __init__.py
Pour créer un spider, utilisez la commande `genspider` de l'interface CLI de Scrapy. La commande a la définition suivante :
$ scrapy genspider [options] <name> <domain>
Pour générer un spider pour ce crawler, nous pouvons exécuter :
$ cd amazon_crawler
$ scrapy genspider baby_products amazon.com
Cela devrait créer un fichier nommé `baby_products.py` dans le dossier nommé `spiders` et générer le code suivant :
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 propose également une variété de classes de spider prédéfinies, telles que CrawlSpider, XMLFeedSpider, CSVFeedSpider et SitemapSpider. La classe CrawlSpider, qui s’appuie sur la classe de base Spider, inclut un attribut « rules » supplémentaire permettant de définir comment naviguer sur un site web. Chaque règle utilise un LinkExtractor pour déterminer quels liens doivent être extraits de chaque page.
Pour notre cas d'utilisation, nous devons faire hériter notre classe Spider de CrawlSpider. Nous devrons également créer une règle LinkExtractor qui indique au crawler d'extraire uniquement les liens de la pagination d'Amazon. N'oubliez pas que notre objectif était de collecter des données sur tous les produits pour bébés d'Amazon ; nous ne souhaitons donc pas suivre tous les liens que nous trouvons sur la page.
Ensuite, nous devons créer deux autres méthodes dans notre classe, `parse_item` et `parse_product`. `parse_item` sera fournie en tant que fonction de rappel à notre règle LinkExtractor et sera appelée pour chaque lien extrait. `parse_product` analysera chaque produit… ¯\_(ツ)_/¯
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'
Pour lancer le crawler, vous pouvez exécuter :
$ scrapy crawl baby_products
Vous verrez de nombreux logs s'afficher dans la console (vous pouvez spécifier un fichier de log avec `--logfile [log_file_name]`).
J'ai utilisé Amazon Search comme exemple pour illustrer les bases de la création d'un robot d'indexation en Python. Cependant, le robot ne trouve pas beaucoup de liens à suivre et n'est pas adapté à un cas d'utilisation spécifique des données. Si vous cherchez à extraire des données spécifiques d'Amazon Search, vous pouvez envisager d'utiliser notre API Amazon Product Data. Nous avons créé des analyseurs personnalisés pour les pages de recherche, de produit et de catégorie d'Amazon, et celle-ci renvoie des données au format JSON prêtes à être utilisées dans votre application.