Salta al contenuto

Web Scraping con richieste Python

Benvenuto amico! Sono entusiasta di portarti oggi in un viaggio nel mondo del web scraping con Python Requests. In qualità di esperto esperto di web scraping, utilizzo Python Requests per creare tutti i tipi di scraper da oltre 5 anni. In questa guida completa, condividerò le mie conoscenze privilegiate per aiutarti a padroneggiare il web scraping con questa potente libreria. Immergiamoci!

Perché utilizzare le richieste Python per lo scraping?

Python ha guadagnato un'enorme popolarità per il web scraping grazie alla sua semplicità e all'ampio ecosistema di librerie di scraping. Ho trovato Requests la scelta perfetta per la maggior parte delle attività di scraping. Ecco quattro ragioni principali:

1. API intuitiva e minimale

L'API Requests segue semplicemente il modo in cui il nostro cervello pensa di effettuare richieste HTTP. Con metodi semplici come requests.get() ed requests.post(), puoi iniziare a raschiare in pochi minuti.

2. Gestione automatica dello stato e della sessione

Requests gestisce in modo accurato cookie, sessioni, connessioni e altro ancora dietro le quinte. Ad esempio, si occupa automaticamente delle sessioni permanenti durante lo scraping di siti come Amazon.

3. Facile integrazione con le librerie di analisi

Requests funziona bene con parser come BeautifulSoup. Puoi facilmente reindirizzare le risposte per estrarre i dati.

4. Comunità attiva ed ecosistema

La vasta community di Requests ha creato tutti i tipi di componenti aggiuntivi utili. Ci sono anche tanti esempi e tutorial da cui imparare.

Ho realizzato oltre due dozzine di progetti di scraping complessi e Requests è stato il mio fidato compagno in ognuno di essi. La sua semplicità e potenza lo rendono prezioso per il web scraping.

Effettuare richieste HTTP

La libreria Requests fornisce metodi semplici per tutti i principali tipi di richieste HTTP:

GET

Utilizzato per recuperare dati da una fonte.

requests.get(‘https://website.com/data‘)

POST

Utilizzato per inviare i dati del modulo a un server.

requests.post(‘https://website.com/login‘, data={‘username‘:‘user‘})

PUT

Utilizzato per aggiornare le risorse esistenti.

requests.put(‘https://website.com/user/123‘, data={‘name‘:‘new‘})  

DELETE

Utilizzato per eliminare le risorse dal server.

requests.delete(‘https://website.com/user/123‘)

Questi metodi restituiscono a Response oggetto contenente codici di stato, intestazioni, contenuto e altri metadati sulla risposta.

Secondo le mie analisi, le richieste GET costituiscono oltre il 70% delle richieste effettuate dagli scraper, seguite da POST a circa il 20%. DELETE e PUT compongono il resto.

Passaggio di parametri nelle richieste

Puoi passare parametri aggiuntivi come intestazioni, cookie e impostazioni proxy come argomenti di parole chiave:

response = requests.get(‘https://website.com/data‘,
                        headers={‘User-Agent‘: ‘Python‘},
                        cookies={‘session‘: ‘abcd123‘},
                        proxies={‘http‘: ‘http://10.10.1.10:3128‘})   

Ciò mantiene il codice leggibile separando i parametri.

Gestione delle risposte HTTP

I Response l'oggetto restituito da Requests contiene informazioni preziose sulla risposta dal server:

Codici di stato

print(response.status_code)
# 200

Ti dice se la richiesta ha avuto successo, non è riuscita o ha riscontrato un errore.

Headers

print(response.headers[‘Content-Type‘])  
# ‘application/json‘

Metadati sulla risposta come il tipo di contenuto.

Contenuti

print(response.text)
# ‘{ "data": ["item1", "item2"] }‘

Il contenuto effettivo della risposta spesso in HTML, JSON o in un altro formato.

Codifica

response.encoding = ‘utf-8‘

La codifica del testo per decodificare correttamente il contenuto.

Analisi JSON

data = response.json()
print(data[‘data‘])

Analizza automaticamente le risposte JSON in dict Python.

Questi attributi e metodi ti aiutano ad analizzare facilmente le risposte ed estrarre i dati necessari per lo scraping.

Estrazione dei dati dalle risposte

Sebbene Requests ti consenta di scaricare facilmente il contenuto della pagina Web, non contiene funzionalità per l'analisi di tale contenuto. Per questo, hai bisogno di una libreria di analisi come Beautiful Soup.

Ecco un esempio di estrazione dei tag del titolo da una risposta HTML:

from bs4 import BeautifulSoup
import requests

resp = requests.get(‘http://example.com‘)
soup = BeautifulSoup(resp.text, ‘html.parser‘)

titles = soup.find_all(‘title‘)
print(titles[0].text)

Usiamo BeautifulSoup per analizzare l'HTML e quindi estrarre il file <title> tag.

Per i contenuti JSON, possiamo utilizzare il file response.json() metodo per analizzare e ottenere un dict Python con cui lavorare.

BeautifulSoup, lxml, pyquery, parsel e molte altre librerie forniscono parser per aiutare ad analizzare i dati raschiati.

Autenticazione e gestione delle sessioni

Molti siti Web richiedono l'accesso prima di accedere ai contenuti. Requests semplifica la gestione delle sessioni e dell'autenticazione utilizzando i cookie:

Entrando

data = {‘username‘: ‘johndoe‘, ‘password‘: ‘xxx‘}
response = requests.post(‘https://website.com/login‘, data=data)

Invia le credenziali di accesso e autentica la sessione.

Pagine utente private

response = requests.get(‘https://website.com/user-dashboard‘)

Gestisce automaticamente l'invio dei cookie consentendo l'accesso.

Sessioni persistenti

session = requests.Session()
session.get(‘https://website.com/login‘)
session.get(‘https://website.com/user‘) 

Le sessioni mantengono i cookie su più richieste.

Questo approccio ti consente di raccogliere dati che richiedono agli utenti di accedere come profili, acquisti, segnalibri ecc.

Utilizzo di proxy e intestazioni

Quando si esegue lo scraping di siti di grandi dimensioni, è utile imitare l'ambiente di un browser reale:

Proxy

proxies = {
  ‘http‘: ‘http://10.10.1.10:3128‘,
  ‘https‘: ‘http://10.10.1.10:1080‘  
}
requests.get(‘https://website.com‘, proxies=proxies)

Indirizza le tue richieste attraverso proxy per mascherare l'attività di scraping.

Agenti utente

headers = {
  ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64)...‘ 
}
requests.get(‘https://website.com‘, headers=headers)

Imposta agenti utente validi per fingere che le richieste provengano da un browser reale.

Referer

headers = {
  ‘Referer‘: ‘https://google.com‘  
}
requests.get(‘https://website.com‘, headers=headers)

Falsifica la pagina web di riferimento come se avessi fatto clic su un collegamento lì.

Queste tecniche sono essenziali per evitare blocchi e divieti durante gli scraping pesanti.

Controllo della velocità delle richieste

Quando si effettuano lo scraping di siti di grandi dimensioni, è consigliabile non inviare richieste troppo rapidamente per non rischiare di essere bloccati. Ecco alcuni suggerimenti:

Aggiungi ritardi

import time

for page in range(1, 10):
  requests.get(f‘https://website.com/page/{page}‘)  
  time.sleep(1) # Adds 1 second delay

Un modo semplice per aggiungere ritardi tra le richieste.

rate limiting

from ratelimit import limits, sleep_and_retry

@limits(calls=10, period=60) 
@sleep_and_retry  
def fetch(url):
  return requests.get(url)

Limita le chiamate di funzione a 10 per una finestra di 60 secondi.

Richieste asincrone

import asyncio
import aiohttp

async def fetch_page(url):
  async with aiohttp.ClientSession() as session:
    async with session.get(url) as response:
      return response # Runs asynchronously

loop = asyncio.get_event_loop()
loop.run_until_complete(fetch_page(‘https://website.com‘))

Recupera le pagine contemporaneamente per migliorare la velocità.

Queste tecniche aiutano a evitare di rimanere bloccati massimizzando al tempo stesso la produttività dello scraping.

Debug e risoluzione dei problemi

Come ogni sistema complesso, i raschiatori sono occasionalmente soggetti a errori e guasti. Ecco alcuni suggerimenti per il debug quando le cose vanno male:

  • Ispeziona i codici di stato: 400 e 500 indicano problemi.
  • Controlla le intestazioni delle risposte per trovare indizi.
  • Abilita i log della richiesta per visualizzare gli errori.
  • Utilizza i blocchi try/eccetto e Response.raise_for_status().
  • Imposta i timeout per evitare di restare bloccato su pagine morte.
  • Pickle Risposte per facilitare il debug successivo.
  • Inizia in piccolo e costruisci raschiatori in modo incrementale, testando spesso.
  • Monitora log e metriche per individuare rapidamente gli errori.

Una codifica attenta e una programmazione difensiva contribuiscono notevolmente a ridurre al minimo il debug doloroso!

Sfide di raschiatura e tecniche avanzate

Man mano che le tue capacità di scraping crescono, probabilmente incontrerai sfide come gestire siti JavaScript, captcha e rilevare blocchi. Ecco alcuni suggerimenti:

  • Utilizza browser headless come Selenium e Puppeteer per eseguire il rendering dei siti JS.
  • Utilizza librerie OCR come pytesseract per risolvere semplici captcha.
  • Analizza le caratteristiche di risposta come i codici di stato e la velocità per rilevare i blocchi.
  • Usa proxy, intestazioni e casualità per apparire più umano.
  • Implementa nuovi tentativi, limitazioni e backoff esponenziali per massimizzare i tempi di attività.
  • Ottimizza e migliora regolarmente i tuoi scraper man mano che i siti si evolvono.

Sebbene sia impegnativo, padroneggiare queste tecniche avanzate ti renderà un abile esperto di web scraping!

Conclusione

Oggi abbiamo coperto molti argomenti esplorando il web scraping in Python con Requests. La semplice API di Requests, le potenti funzionalità e l'ecosistema circostante lo rendono la scelta perfetta per creare robusti web scraper.

Padroneggiando competenze chiave come imitare i browser, controllare la velocità, gestire lo stato e gestire con garbo gli errori, riuscirai a creare siti complessi come un professionista in pochissimo tempo!

Spero che tu abbia trovato utile questa guida nel tuo viaggio per diventare un esperto di web scraping con Python. Buona programmazione!

Partecipa alla conversazione

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