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!