Scrapy ist ein leistungsstarkes Framework zur Erstellung von Webcrawlern in Python. Es bietet eine integrierte Möglichkeit, Links zu verfolgen und Informationen aus Webseiten zu extrahieren. Sie müssen ein neues Scrapy-Projekt und einen Spider erstellen, um das Verhalten Ihres Crawlers zu definieren.
Bevor Sie mit dem Crawlen einer Website wie Amazon beginnen, ist es wichtig, die robots.txt-Datei der Website zu überprüfen, um festzustellen, welche URL-Pfade zulässig sind. Scrapy liest diese Datei automatisch und folgt ihr, wenn die Einstellung ROBOTSTXT_OBEY auf „true“ gesetzt ist, was die Standardeinstellung für Projekte ist, die mit dem Scrapy-Befehl `startproject` erstellt wurden.
Um ein neues Scrapy-Projekt zu erstellen, müssen Sie den folgenden Befehl ausführen:
$ scrapy startproject amazon_crawler
Dieser Befehl generiert ein Projekt mit der folgenden Struktur:
amazon_crawler/
├── scrapy.cfg
└── amazon_crawler
├── __init__.py
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
└── spiders
├── __init__.py
Um einen Spider zu erstellen, verwenden Sie den Befehl `genspider` aus der Scrapy-CLI. Der Befehl hat folgende Definition:
$ scrapy genspider [options] <name> <domain>
Um einen Spider für diesen Crawler zu generieren, können wir Folgendes ausführen:
$ cd amazon_crawler
$ scrapy genspider baby_products amazon.com
Dadurch sollte eine Datei namens `baby_products.py` im Ordner `spiders` erstellt und folgender Code generiert werden:
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 bietet außerdem eine Vielzahl vorgefertigter Spider-Klassen an, wie beispielsweise CrawlSpider, XMLFeedSpider, CSVFeedSpider und SitemapSpider. Die CrawlSpider-Klasse, die auf der Basis-Spider-Klasse aufbaut, enthält ein zusätzliches „rules“-Attribut, um zu definieren, wie durch eine Website navigiert werden soll. Jede Regel nutzt einen LinkExtractor, um zu bestimmen, welche Links von jeder Seite extrahiert werden sollen.
Für unseren Anwendungsfall sollten wir unsere Spider-Klasse von CrawlSpider ableiten. Außerdem müssen wir eine LinkExtractor-Regel erstellen, die dem Crawler mitteilt, Links nur aus der Paginierung von Amazon zu extrahieren. Denken Sie daran, dass unser Ziel darin bestand, Daten zu allen Babyprodukten von Amazon zu sammeln; wir wollen also nicht tatsächlich allen Links folgen, die wir auf der Seite finden.
Dann müssen wir zwei weitere Methoden in unserer Klasse erstellen: `parse_item` und `parse_product`. `parse_item` wird als Callback-Funktion an unsere LinkExtractor-Regel übergeben und bei jedem extrahierten Link aufgerufen. `parse_product` analysiert jedes Produkt… ¯\_(ツ)_/¯
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'
Um den Crawler zu starten, kannst du folgenden Befehl ausführen:
$ scrapy crawl baby_products
In der Konsole werden zahlreiche Logs angezeigt (Sie können eine Logdatei mit `--logfile [log_file_name]` angeben).
Ich habe Amazon Search als Beispiel verwendet, um die Grundlagen der Erstellung eines Web-Crawlers in Python zu veranschaulichen. Der Crawler findet jedoch nicht viele Links, denen er folgen kann, und ist nicht auf einen bestimmten Anwendungsfall für die Daten zugeschnitten. Wenn Sie bestimmte Daten aus Amazon Search extrahieren möchten, können Sie die Nutzung unserer Amazon Product Data API in Betracht ziehen. Wir haben benutzerdefinierte Parser für Amazon Search, Produkt- und Kategorieseiten erstellt, die Daten im JSON-Format zurückgeben, die direkt in Ihrer Anwendung verwendet werden können.