Raschiatura web usando una bella zuppa

Raschiatura web usando una bella zuppa
Web rasting è una tecnica utilizzata per selezionare ed estrarre contenuti specifici dai siti Web. Ad esempio, quando vogliamo monitorare i prezzi e il modo in cui cambiano, possiamo usare un raschietto Web per estrarre solo le informazioni che desideriamo da un sito Web e scaricarle in un file Excel. In questo tutorial, impareremo come raschiare il Web usando BeautifulSoup.

Innanzitutto, installa Beautifulsoup come segue:

PIP Installa Beautifulsoup4

BeautifulSoup viene applicato a un file HTML e quindi dobbiamo iniziare ottenendo il contenuto HTML di una pagina Web. Questo viene in genere eseguito utilizzando il modulo richieste. In questo esempio specifico, otterremo il contenuto HTML di una pagina Web e lo mostreremo. Per questo, abbiamo prima impostato l'URL; In questo caso, ho scelto il sito Web dei media di buon senso (perché ha un elenco di film con valutazioni, che potremmo essere interessati a raschiare). Quindi utilizziamo il metodo get () per recuperare l'oggetto di risposta ed estrarre la porzione HTML utilizzando l'attributo di contenuto o di testo.

richieste di importazione
url = "https: // www.Commonsemedia.Org/Reviews di film "
corpo = richieste.Ottieni (URL)
body_text = body.Contenuto # o corpo.testo
Stampa (corpo.contenuto) # o stampa (corpo.testo)

Ora possiamo iniziare a usare BeautifulSoup. Creiamo un oggetto per bellissimoup che richiede due argomenti: il file HTML e il tipo di parser. Ci sono quattro parser disponibili - HTML.parser, lxml, lxml-xml e html5lib.

Da BS4 Import Beautifulsoup
zuppa = beautifulsoup (body_text, 'lxml')

Bisogna anche installare il parser. In questo caso, ho scelto il parser LXML e quindi lo installerò.

PIP Installa LXML

Ora, possiamo fare qualsiasi cosa, ma esploreremo le diverse possibilità prima di iniziare il web rasking.

(i) Il metodo prettify () riscriverà il testo in un formato leggibile e "carino".

minestra.abbellire()

(ii) il metodo del titolo recupererà il titolo.

minestra.titolo

(iii) il metodo "P" estraggerà tutti i tag P dal codice HTML.

minestra.P

(iv) Il metodo "A" estraggerà tutti i tag A dal codice HTML.

minestra.UN

(v) il metodo find_all () troverà tutti gli elementi web che contengono un argomento particolare. In questo caso, ho superato "A", quindi find_all ("a") troverà tutti i tag "A".

minestra.find_all ('a')

(vi) il metodo di ricerca troverà tutti gli argomenti superati. In questo caso, passiamo l'argomento ID = “Password."Quindi cercherà il codice HTML per l'ID e, se corrisponde, recupera la clausola.

minestra.Trova (id = "password")

Quindi in genere, vorremmo raschiare una pagina web per lavori, film, corsi, ecc., insieme alle loro rispettive informazioni (come prezzi e valutazioni). In questo caso, siamo interessati a un sito Web, in particolare raschiando la loro lista di film.

richieste di importazione
url = "https: // www.Commonsemedia.Org/Reviews di film "
corpo = richieste.Ottieni (URL)
body_text = body.contenuto
Da BS4 Import Beautifulsoup
zuppa = beautifulsoup (body_text, 'lxml')

In questo caso particolare, il codice HTML di ciascun nome del film (ciò che stiamo raschiando) è esso stesso all'interno di un contenitore. Iniziamo per la prima volta ispezionando l'elemento in questione. Nel mio caso, ho scelto di ispezionare il titolo del primo film ("Till Death").

Quando ispeziona l'elemento, noterai che ciò che stiamo cercando - il titolo del film "Till Death" - è contenuto all'interno di un tag "Div" con la classe "contenuto contento."Questo primo tag" Div "continuerà a ricorrere in tutto il codice HTML poiché ogni titolo del film è contenuto all'interno di tale tag" Div ". E così diciamo che per ogni div in div, desideriamo selezionare il tag sub-"div" con una classe diversa di "view-field-field-field-reference-reference-review-ent-prod-time."Dopodiché, vediamo un tag" forte "con la classe" contento campo."Quindi facciamo di nuovo la stessa cosa. E infine, il nostro titolo stesso è nidificato con un tag "A", quindi selezioniamo il tag "A".

Divs = zuppa.find_all ("div", class _ = "content-content-wrapper")

Si prega di notare qui che dopo la lezione di parole, c'è un sottolinea. Questo sottolineatura distingue la classe di codice HTML dalle classi Python. Quindi abbiamo scritto il codice che estraggerà il tag "Div" con la classe "Content-Content-Wrapper."

Quindi scrivi:

# divs = zuppa.find_all ("div", 'class': 'content-content-wrapper')
per Div in Divs:
divs2 = div.find_all ("div", class _ = "view-field view-field-field-reference-review-ent-prod-prod-title")
per div in divs2:
forti = div.Find_all ("Strong", class _ = "Field-Content")
per forti in forti:
aa = forte.find_all ("a")
per un in AA:
Stampa (a.testo)

Esistono i loop per scegliere ogni film. Infine, quando vogliamo selezionare il testo, diciamo a.testo. Quest'ultimo stamperà ogni titolo di film e, in questo modo, possiamo raschiare quello che vogliamo.

Ora, supponiamo che volessimo salvare questi dati in un file CSV; Anche questo è possibile. Per scrivere in CSV, è necessario prima importare il modulo CSV. Innanzitutto, apriamo il file dove vogliamo le informazioni archiviate. Qui passeremo tre argomenti: il nome del file, la modalità e se vogliamo una nuova linea o no. Qui, stiamo aggiungendo una nuova linea pari a nulla per impedire al file CSV di aggiungere resi (o nuove righe vuote) dopo ogni voce. In secondo luogo, passiamo il file al metodo Writer (). Terzo, scriviamo una nuova riga. In questo caso, sto chiamando la mia nuova riga "film" perché è l'intestazione di ciò che seguire.

Importa CSV
File = Open ("Film.CSV "," W ", newline =")
file_write = csv.Writer (file)
file_write.Writerow (['Film'])

In quarto luogo, invece di semplicemente stampare la variabile "A", la spogliamo di spazi vuoti e quindi useremo il metodo Writerow () per scriverlo nel file CSV.

per Div in Divs:
divs2 = div.find_all ("div", class _ = "view-field view-field-field-reference-review-ent-prod-prod-title")
per div in divs2:
forti = div.Find_all ("Strong", class _ = "Field-Content")
per forti in forti:
aa = forte.find_all ("a")
per un in AA:
file_write.writerow ([a.testo.striscia()])

L'intero codice sembrerebbe qualcosa di simile:

richieste di importazione
url = "https: // www.Commonsemedia.Org/Reviews di film "
corpo = richieste.Ottieni (URL)
body_text = body.contenuto
Da BS4 Import Beautifulsoup
zuppa = beautifulsoup (body_text, 'lxml')
Divs = zuppa.find_all ("div", class _ = "content-content-wrapper")
Importa CSV
File = Open ("Film.CSV "," W ", newline =")
file_write = csv.Writer (file)
file_write.Writerow (['Film'])
per Div in Divs:
divs2 = div.find_all ("div", class _ = "view-field view-field-field-reference-review-ent-prod-prod-title")
per div in divs2:
forti = div.Find_all ("Strong", class _ = "Field-Content")
per forti in forti:
aa = forte.find_all ("a")
per un in AA:
file_write.writerow ([a.testo.striscia()])

Questo è solo un semplice esempio. In realtà, il web rasking è così potente che puoi raschiare e monitorare quasi qualsiasi pagina web.

Codice felice!