Web Scraping, espressioni regolari e visualizzazione dei dati, tutto in Python

Pitone, Scraping, Mar-06-20245 minuti di lettura

Il web scraping può essere definito come il metodo di raccolta e ristrutturazione dei dati dai siti web. Può anche essere definito come l'approccio programmatico per ottenere i dati di un sito web in modo automatizzato. Ad esempio, si desidera estrarre gli ID e-mail di tutte le persone che hanno commentato un post su Facebook. È possibile farlo

Indice dei contenuti

Il web scraping può essere definito come il metodo di raccolta e ristrutturazione dei dati dai siti web. Può anche essere definito come l'approccio programmatico per ottenere i dati di un sito web in modo automatizzato. Ad esempio, si desidera estrarre gli ID e-mail di tutte le persone che hanno commentato un post su Facebook. È possibile farlo con due metodi. In primo luogo, si può puntare il cursore sulla stringa dell'indirizzo e-mail di una persona. È quindi possibile copiarla e incollarla in un file. Questo metodo è noto come scraping manuale. Ma cosa succede se si vogliono raccogliere 2000 ID e-mail? Con l'aiuto di uno strumento di web scraping, è possibile estrarre tutti gli ID e-mail in 30 secondi invece di 3 ore se si utilizza lo scraping manuale.

È possibile utilizzare strumenti di web scraping per estrarre informazioni dai siti web. È sufficiente sapere come fare clic e non è richiesta alcuna conoscenza di programmazione. Questi strumenti sono efficienti dal punto di vista delle risorse e consentono di risparmiare tempo e denaro. È possibile eseguire lo scraping di milioni di pagine in base alle proprie esigenze senza preoccuparsi della larghezza di banda della rete. Alcuni siti web implementano anti-bot che scoraggiano gli scrapers dal raccogliere dati. Ma i buoni strumenti di scraping web hanno funzioni integrate che permettono di aggirare questi strumenti e di offrire un'esperienza di scraping senza problemi.

Scraping del web in Python

Python dispone di ottimi strumenti per effettuare lo scraping dei dati dal web. Ad esempio, è possibile importare la libreria requests per recuperare il contenuto di una pagina web e bs4(BeautifulSoup) per estrarre le informazioni rilevanti. È possibile seguire i passi seguenti per effettuare lo scraping del web in Python. Estrarremo informazioni da questo sito web. 

Richieste di importazione:

È necessario importare la libreria delle richieste per recuperare l'HTML del sito web. 

richieste di importazione

Richiesta GET:

È necessario effettuare una richiesta GET al sito web. È possibile farlo incollando l'URL nella funzione requests.get().

r = requests.get('http://www.cleveland.com/metro/index.ssf/2017/12/case_western_reserve_university_president_barbara_snyders_base_salary_and_bonus_pay_tops_among_private_colleges_in_ohio.html')

Estrarre il contenuto:

Estrarre il contenuto del sito web utilizzando r.content. Fornisce il contenuto del sito web in byte. 

c = r.content

Importare BeautifulSoup:

È necessario importare la libreria BeautifulSoup, che facilita lo scraping di informazioni dalle pagine web.

da bs4 importa BeautifulSoup

Creare un oggetto zuppa:

È necessario creare un oggetto BeautifulSoup dal contenuto e analizzarlo utilizzando diversi metodi.

zuppa = BeautifulSoup(c)
print(soup.get_text())

Si otterrà un risultato (è solo una parte) simile a questo.

Estrarre i dati utili:

Dobbiamo trovare i selettori CSS giusti per estrarre i dati desiderati. Possiamo trovare il contenuto principale della pagina web utilizzando il metodo .find() dell'oggetto soup.

main_content = soup.find('div', attrs = {'class': 'entry-content'})

Utilizzare l'attributo .text:

Possiamo recuperare le informazioni come testo dalla tabella usando l'attributo .text della zuppa.

contenuto = main_content.find('ul').text
print(content)

Abbiamo recuperato il testo della tabella come stringa. Ma le informazioni saranno di grande utilità se estrarremo le parti specifiche della stringa di testo. Per raggiungere questo obiettivo, dobbiamo passare alle espressioni regolari.

Espressioni regolari in Python

Le espressioni regolari (RegEx) sono una sequenza di schemi che definiscono un modello di ricerca. L'idea di base è che:

  • Definire un modello da abbinare a una stringa di testo. 
  • Cerca nella stringa le corrispondenze.

Supponiamo di voler estrarre le seguenti informazioni dalla tabella di testo.

  • Stipendi
  • Nomi dei collegi
  • Nomi dei presidenti

È possibile estrarre le tre informazioni seguendo i passaggi indicati di seguito.

Passo 01:

Importare re e per estrarre gli stipendi, è necessario creare un modello di stipendio. Utilizzare il metodo re.compile() per compilare un modello di espressione regolare fornito come stringa in un oggetto modello RegEx. Inoltre, si può usare pattern.findall() per trovare tutte le corrispondenze e restituirle come elenco di stringhe. Ogni stringa rappresenterà una corrispondenza.

importare re
salary_pattern = re.compile(r'\$.+')
stipendi = stipendio_pattern.findall(contenuto)

Passo 02:

Ripetere la stessa procedura per estrarre i nomi dei college. Creare uno schema ed estrarre i nomi. 

school_pattern = re.compile(r'(?:,|,\s)([A-Z]{1}.*?)(?:\s\(|:|,)')
schools = school_pattern.findall(content)
print(schools)
print(salaries)

Passo 03:

Ripetere la stessa procedura per estrarre i nomi dei presidenti. Creare uno schema ed estrarre i nomi richiesti. 

name_pattern = re.compile(r'^([A-Z]{1}.+?)(?:,)', flags = re.M)
names = name_pattern.findall(content)
print(names)

Passo 04:

I salari appaiono disordinati e non sono comprensibili. Per questo motivo, utilizziamo la comprensione delle liste di Python per convertire gli stipendi in stringhe in numeri. Per ottenere i risultati desiderati, utilizzeremo l'affettatura delle stringhe, lo split e il join e la comprensione delle liste.

stipendi = ['$876.001', '$543.903', '$2453.896'] [int('.join(s[1:].split(',') per s in stipendi].
[int('.join(s[1:].split(',')]) per s in stipendi]

L'output è il seguente:

Visualizzazione dei dati in Python

La visualizzazione dei dati aiuta a comprenderli visivamente, in modo da evidenziare le tendenze, i modelli e le correlazioni. È possibile tradurre una grande quantità di dati in grafici, diagrammi e altre immagini per identificare i valori anomali e ottenere preziose informazioni.

Possiamo utilizzare matplotlib per visualizzare i dati, come mostrato di seguito.

Importare le librerie necessarie come mostrato di seguito.

importare pandas come pd
importare matplotlib.pyplot come plt

Creare un dataframe pandas di scuole, nomi e stipendi. Ad esempio, è possibile convertire le scuole in un dataframe come:

df_scuola = pd.DataFrame(scuole)
stampare(df_scuola)

L'uscita è:

Allo stesso modo, si può fare lo stesso per gli stipendi e i nomi.

Per la visualizzazione dei dati, possiamo tracciare un grafico a barre come mostrato di seguito.

df.plot(kind='barh', x = 'Presidente', y = 'stipendio')

L'output è il seguente:

Perché i proxy sono necessari per lo scraping del Web?

Lo scraping del Web aiuta le aziende a estrarre informazioni utili sulle intuizioni del mercato e sui settori per offrire servizi basati sui dati e prendere decisioni guidate dai dati. I proxy sono essenziali per effettuare lo scraping di dati da vari siti Web per i seguenti motivi.

  • Evitare i divieti IP - Per evitare che gli scrapers facciano troppe richieste, i siti web aziendali limitano la quantità di dati da scansionare, definita Crawl Rate. Il crawl rate rallenta la velocità del sito web e diventa difficile per l'utente accedere efficacemente ai contenuti desiderati. Tuttavia, se si utilizza un pool sufficiente di proxy per eseguire lo scraping dei dati, si superano i limiti di velocità del sito web di destinazione. Infatti, i proxy inviano richieste da indirizzi IP diversi, consentendo così di estrarre i dati dai siti web in base alle proprie esigenze.
  • Consentire l'accesso a contenuti specifici della regione - Le aziende devono monitorare i loro concorrenti (siti web) per fornire caratteristiche e prezzi adeguati ai clienti di una specifica regione geografica. Possono accedere a tutti i contenuti disponibili in quella regione utilizzando proxy residenziali con indirizzi IP.
  • Maggiore sicurezza - Un server proxy aggiunge un ulteriore livello di sicurezza nascondendo l'indirizzo IP del dispositivo dell'utente.

Sapete quanti proxy sono necessari per ottenere i vantaggi di cui sopra? Potete calcolare il numero di deleghe necessarie utilizzando questa formula:

Numero di proxy = Numero di richieste di accesso / Crawl Rate

Il numero di richieste di accesso dipende dai seguenti parametri.

  • La frequenza con cui lo scraper estrae informazioni da un sito web
  • Numero di pagine che l'utente vuole scrapare

D'altra parte, la velocità di crawl è limitata dal numero di richieste che l'utente effettua in un certo lasso di tempo. Alcuni siti web consentono un numero limitato di richieste per utente per differenziare le richieste automatiche da quelle umane. 

Usare i proxy in Python

È possibile utilizzare i proxy in Python seguendo i passaggi seguenti.

  • È necessario importare il modulo requests di Python.
richieste di importazione
  • È possibile creare un pool di proxy per ruotarli.
proxy = 'http://114.121.248.251:8080'
url = 'https://ipecho.net/plain'
  • Si può usare requests.get() per inviare una richiesta GET passando un proxy come parametro all'URL.
page = requests.get(url,
                    proxies={"http": proxy, "https": proxy})
  • È possibile ottenere il contenuto dell'URL richiesto se non ci sono errori di connessione.
stampa(pagina.testo)

L'output è il seguente:

Conclusione

Abbiamo discusso della possibilità di utilizzare il web scraping per estrarre i dati dai siti web invece di utilizzare lo scraping manuale. Il web scraping è un processo efficiente in termini di costi e di tempo. Le aziende lo utilizzano per raccogliere e ristrutturare le informazioni sul web per prendere decisioni basate sui dati e ottenere informazioni preziose. L'uso dei proxy è essenziale per un web scraping sicuro, poiché nasconde l'indirizzo IP originale dell'utente dal sito web di destinazione. Per lo scraping del web è possibile utilizzare proxy di centri dati o residenziali. Tuttavia, è preferibile utilizzare i proxy residenziali perché sono veloci e non possono essere facilmente individuati. Inoltre, è possibile utilizzare le espressioni regolari in Python per trovare gruppi di stringhe. Ciò significa che possiamo estrarre qualsiasi modello di stringa dal testo con l'aiuto delle espressioni regolari. Abbiamo anche visto che la visualizzazione dei dati converte quantità voluminose di dati in grafici, diagrammi e altre immagini che ci aiutano a rilevare anomalie e a identificare tendenze utili nei dati.