Salta al contenuto

La guida definitiva per raschiare Amazon con Python (2023)

Raschiare i dati da Amazon, una delle più grandi piattaforme di e-commerce, può fornire preziose informazioni. Se stai cercando di confrontare i prezzi, analizzare le recensioni dei clienti o monitorare la disponibilità dei prodotti, il web scraping può essere uno strumento utile. Questa guida fornisce istruzioni dettagliate ed esempi di codice Python per lo scraping di Amazon.

Etica del web scraping

Prima di addentrarci, è importante notare che lo scraping dovrebbe essere eseguito in modo responsabile per ridurre al minimo la domanda sui server del sito web. Un modo per farlo è concentrarsi sulla pagina di ricerca di Amazon in cui è possibile estrarre i dati di base del prodotto come nome, prezzo, URL dell'immagine, valutazione e numero di recensioni. Questo approccio ridurrà significativamente il numero di richieste che devi fare ad Amazon, rendendo il tuo scraper più veloce ed economico da eseguire.

Librerie Python Web Scraping

Python offre una miriade di librerie per il web scraping e la scelta di quella giusta dipende dalle tue esigenze specifiche e dal livello di familiarità con Python. Ecco alcune delle librerie più utilizzate:

  1. Richieste: una popolare libreria Python per effettuare richieste HTTP. Astrae le complessità di fare richieste dietro una semplice API, permettendoti di inviare richieste HTTP/1.1 con vari metodi come GET, POST e altri​​.
  2. bellazuppa: è usato per analizzare documenti HTML e XML ed estrarre dati. Crea un albero di analisi dal codice sorgente della pagina che può essere utilizzato per estrarre i dati in modo gerarchico e più leggibile.
  3. Scrapy: un framework Python open source progettato specificamente per il web scraping. È un framework versatile in grado di gestire un'ampia gamma di attività di scraping ed è in grado di eseguire lo scraping di grandi set di dati.
  4. Selenio: Un potente strumento per controllare un browser web attraverso il programma. È molto utile per il web scraping perché può gestire tutti i tipi di contenuto del sito Web, incluso il contenuto generato da JavaScript. Consente inoltre l'interazione dell'utente come fare clic, scorrere, ecc.
  5. pacco: Utilizzato per estrarre dati da HTML e XML utilizzando i selettori XPath e CSS. È costruito sulla libreria lxml, rendendolo flessibile e facile da usare.

Raschiare i dati dei prodotti dalle pagine di ricerca di Amazon

Il primo passo per raschiare Amazon è estrarre i dati dalle pagine di ricerca. Le librerie Python Requests e Parsel possono essere utilizzate per questa attività. Ecco uno script di esempio che estrae i dati di prodotto da tutte le pagine di ricerca Amazon disponibili per una determinata parola chiave (ad es. "iPad"):

import request from parsel import Selector from urllib.parse import urljoin keyword_list = ['ipad'] product_overview_data = [] for keyword in keyword_list: url_list = [f'https://www.amazon.com/s?k={keyword} &page=1'] for url in url_list: try: response = requests.get(url) if response.status_code == 200: sel = Selector(text=response.text) # Estrai pagina prodotto search_products = sel.css("div .s-result-item[data-component-type=s-search-result]") per il prodotto in search_products: relative_url = product.css("h2>a::attr(href)").get() asin = relative_url.split('/')[3] if len(relative_url.split('/')) >= 4 else Nessuno product_url = urljoin('https://www.amazon.com/', relative_url).split( "?")[0] product_overview_data.append( { "keyword": keyword, "asin": asin, "url": product_url, "ad": True if "/slredirect/" in product_url else False, "title": product.css("h2>a>span::text").get(), "price-data-a-size=xl .a-offscreen::text").get(), "real_price": prodotto. css(".a-price[data-a-size=b] .a-offscreen::text").get(), "rating": (product.css("span[aria-label~=stars]: :attr "rating_count": product.css("span[aria-label~=stars] + span::attr(aria-label)").get(), "thumbnail_url": product.xpath("//img[ has-class('s-image')]/@src").get(), } ) # Ottieni tutte le pagine se "&page=1" in url: available_pages = sel.xpath( '//a[has-class ("s-pagination-item")][not(has-class("s-pagination-separator"))]/text()' .getall() per la pagina in available_pages: search_url_paginated = f'https:// www.amazon.com/s?k={keyword}&page={page}' url_list.append(search_url_paginated) tranne Eccezione come e: print("Errore", e)

Questo script raccoglierà un array di dati di prodotto, ciascuno rappresentato come un dizionario con le seguenti chiavi:

  • keyword: la parola chiave di ricerca utilizzata (ad es. "iPad")
  • asin: il numero di identificazione standard univoco di Amazon del prodotto
  • url: L'URL del prodotto
  • ad: un valore booleano che indica se il prodotto è un annuncio
  • title: il titolo del prodotto
  • price: Il prezzo del prodotto
  • real_price: Il prezzo originale del prodotto prima di eventuali sconti
  • rating: La classificazione del prodotto
  • rating_count: il numero di valutazioni che il prodotto ha ricevuto
  • thumbnail_url: l'URL dell'immagine in miniatura del prodotto

Lo script identifica anche tutte le pagine disponibili per la parola chiave di ricerca e le aggiunge al file url_list per raschiare【9†fonte】.

Raschiare i dati dei prodotti dalle pagine dei prodotti Amazon

Una volta che hai un elenco di URL dei prodotti Amazon, puoi raschiare tutti i dati del prodotto da ogni singola pagina del prodotto Amazon. Ecco uno script di esempio che utilizza le librerie Python Requests e Parsel per fare ciò:

import re import request from parsel import Selector from urllib.parse import urljoin product_urls = [ 'https://www.amazon.com/2021-Apple-10-2-inch-iPad-Wi-Fi/dp/B09G9FPHY6/ref= sr_1_1', ] product_data_list = [] for product_url in product_urls: try: response = requests.get(product_url) if response.status_code == 200: sel = Selector(text=response.text) image_data = json.loads(re.findall (r"colorImages':.*'initial':\s*(\[.+?\])},\n", response.text)[0]) variant_data = re.findall(r'dimensionValuesDisplayData"\s *:\s* ({.+?}),\n', response.text) feature_bullets = [bullet.strip() for bullet in sel.css("#feature-bullets li ::text").getall( )] prezzo = sel.css('.a-price span[aria-hidden="true"] ::text').get("") se non prezzo: prezzo = sel.css('.a-price . a-offscreen ::text').get("") product_data_list.append({ "name": sel.css("#productTitle::text").get("").strip(), "price": prezzo, "stelle": sel.css("i[data-hook=valutazione-stelle-media] ::text").get("").strip(), "rating_count": sel.css("div[ data-hook=total-review-count] ::text").get("").strip(), "feature_bullets": feature_bullets, "images": image_data, "variant_data": variant_data, }) tranne Eccezione come e : print("Errore",e)

Questo script raccoglie un array di dati di prodotto, con ogni prodotto rappresentato come un dizionario con le seguenti chiavi:

  • name: il nome del prodotto
  • price: Il prezzo del prodotto
  • stars: la valutazione in stelle del prodotto
  • rating_count: il numero totale di recensioni che il prodotto ha ricevuto
  • feature_bullets: un elenco dei punti elenco delle caratteristiche del prodotto
  • images: un elenco di immagini ad alta risoluzione del prodotto
  • variant_data: dati sulle varianti del prodotto (ad esempio, diversi colori o taglie disponibili)

Vale la pena notare che questo script è progettato per estrarre i dati dalle pagine dei prodotti con un layout specifico. Se Amazon cambia il layout delle pagine dei suoi prodotti, potrebbe essere necessario aggiornare lo script【11†fonte】.

Ulteriori considerazioni

Sebbene gli script di cui sopra forniscano un punto di partenza per lo scraping di Amazon, ci sono ulteriori considerazioni da tenere in considerazione per una soluzione di scraping completa e solida:

1. Gestione del contenuto dinamico

Alcune pagine dei prodotti Amazon utilizzano contenuti dinamici, che richiedono il caricamento di JavaScript. Se provi a raschiare queste pagine con i metodi sopra descritti, potresti scoprire che mancano alcuni dei dati desiderati. In questi casi, dovrai utilizzare uno strumento in grado di eseguire il rendering di JavaScript, come Selenium o Puppeteer.

2. Rispettare Robots.txt

Amazon robots.txt file indica ai web crawler quali pagine possono visitare. Sebbene questo file non sia legalmente vincolante, ignorarlo potrebbe portare al ban del tuo indirizzo IP. È meglio rispettare il robots.txt file per evitare potenziali problemi.

3. Limitazione della velocità

Amazon potrebbe limitare il numero di richieste che puoi effettuare in un determinato periodo di tempo. Se fai troppe richieste troppo velocemente, Amazon potrebbe vietare il tuo indirizzo IP, potresti averne bisogno proxy per Amazon. Per evitare ciò, puoi utilizzare tecniche come limitare le tue richieste o rotazione degli indirizzi IP.

4. Considerazioni etiche

Lo scraping Web può comportare una domanda significativa sul server di un sito Web, quindi è importante eseguire lo scraping in modo responsabile. Se riesci a ottenere i dati di cui hai bisogno da meno pagine, è più etico farlo. Ad esempio, se hai bisogno solo dei dati di prodotto di base (nome, prezzo, URL dell'immagine, valutazione, numero di recensioni, ecc.), puoi estrarre questi dati dalle pagine di ricerca anziché dalle pagine dei prodotti, riducendo il numero di richieste necessarie rendere di un fattore 20.


In conclusione, mentre il web scraping può essere un potente strumento per estrarre dati da siti Web come Amazon, è importante utilizzare queste tecniche in modo responsabile e rispetto ai termini di servizio del sito Web e alle richieste che stai ponendo sui suoi server.

Partecipa alla conversazione

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *