Scrapy

Web Scraping con Python Scrapy Module

Web Scraping con Python Scrapy Module
L'abilità del web scraping è diventata d'oro oggi, quindi impariamo come ottenere i dati necessari dalle pagine web. In questo articolo parleremmo della libreria Scrapy Python, cosa può fare e come usarla. Iniziamo.

Perché Scrapy??

Scrapy è una solida libreria di web scraping, che offre la possibilità di scaricare pagine web, immagini e qualsiasi dato ti venga in mente alla velocità della luce. La velocità è di grande importanza nel calcolo e Scrapy lavora su questo visitando i siti Web in modo asincrono e facendo un sacco di lavoro in background rendendo l'intera attività semplice.

Va detto che Python ha altre librerie che possono essere utilizzate per raschiare i dati dai siti Web, ma nessuna è paragonabile a Scrapy quando si tratta di efficienza.

Installazione

Diamo una rapida occhiata a come questa potente libreria può essere installata sulla tua macchina.

Come con la maggior parte delle librerie Python, puoi installare Scrapy usando il modulo pip:

pip installa Scrapy

Puoi verificare se l'installazione ha avuto successo importando scrapy nella shell interattiva di Python.

$ pitone
Pitone 3.5.2 (predefinito, 14 settembre 2017, 22:51:06)
[CGC 5.4.0 20160609] su linux

Digita "aiuto", "copyright", "crediti" o "licenza" per ulteriori informazioni.

>>> importa scrapy

Ora che abbiamo finito con l'installazione, entriamo nel vivo delle cose.

Creazione di un progetto di Web Scraping

Durante l'installazione, la parola chiave scrapy è stata aggiunta al percorso in modo da poter utilizzare la parola chiave direttamente dalla riga di comando. Ne approfitteremmo, durante tutto il nostro uso della biblioteca.

Dalla directory di tua scelta esegui il seguente comando:

scrapy startproject webscraper

Questo creerebbe una directory chiamata raschietto nella directory corrente e scrapy.cfg file. Nel raschietto  directory avrebbe __dentro__.py, articoli.py, middleware.py, condutture.py, impostazioni.pi file e una directory chiamata ragni.

I nostri file di ragno sono.e. lo script che esegue il webscraping per noi sarebbe memorizzato nel ragni directory.

Scriviamo il nostro ragno

Prima di andare avanti per scrivere il nostro ragno, ci si aspetta che sappiamo già quale sito web vogliamo raschiare. Ai fini di questo articolo, stiamo raschiando un sito web di webscraping di esempio: http://example.raschiatura.come.

Questo sito Web ha solo nomi di paesi e le loro bandiere, con pagine diverse e stiamo per eliminare tre delle pagine. Le tre pagine su cui lavoreremo sono:

http://esempio.raschiatura.com/luoghi/default/indice/0
http://esempio.raschiatura.com/luoghi/default/indice/1
http://esempio.raschiatura.com/luoghi/default/indice/2

Tornando al nostro ragno, creeremo un sample_spider.py nella directory degli spider. Dal terminale, un semplice tocco sample_spider.pi comando aiuterebbe a creare un nuovo file.

Dopo aver creato il file, lo compileremo con le seguenti righe di codice:

importare scrapy
 
class SampleSpider(scrapy.Ragno):
nome = "campione"
start_urls = [
"http://esempio.raschiatura.com/luoghi/default/indice/0",
"http://esempio.raschiatura.com/luoghi/default/indice/1",
"http://esempio.raschiatura.com/luoghi/default/indice/2"
]
 
def parse(self, response):
numero_pagina = risposta.URL.dividi('/')[-1]
nome_file = "pagina.html".formato(numero_pagina)
con open(file_name, 'wb') come file:
file.scrivere (risposta.corpo)

Dal livello superiore della directory del progetto, esegui il seguente comando:

campione di scansione graffiante

Ricordiamo che abbiamo dato il nostro SampleSpider classe A nome attributo campione.

Dopo aver eseguito quel comando, noterai che tre file denominati page0.html, pagina 1.html, pagina2.html vengono salvati nella directory.

Diamo un'occhiata a cosa succede con il codice:

importare scrapy

Per prima cosa importiamo la libreria nel nostro spazio dei nomi.

class SampleSpider(scrapy.Ragno):
nome = "campione"

Quindi creiamo una classe spider che chiamiamo SampleSpider. Il nostro ragno eredita da graffiante.Ragno. Tutti i nostri ragni devono ereditare da scrapy.Ragno. Dopo aver creato la classe, diamo al nostro ragno un nome attributo, questo nome l'attributo viene utilizzato per evocare il ragno dal terminale. Se ricordi, abbiamo eseguito il campione di scansione graffiante comando per eseguire il nostro codice.

start_urls = [
 
"http://esempio.raschiatura.com/luoghi/default/indice/0",
"http://esempio.raschiatura.com/luoghi/default/indice/1",
"http://esempio.raschiatura.com/luoghi/default/indice/2"
]

Abbiamo anche un elenco di URL da visitare per il ragno. L'elenco deve essere chiamato start_urls. Se vuoi dare alla lista un nome diverso dovremmo definire a start_requests funzione che ci dà alcune capacità in più. Per saperne di più puoi dare un'occhiata alla documentazione scrapy.

Indipendentemente da ciò, non dimenticare di includere http:// o https:// per i tuoi collegamenti, altrimenti dovresti affrontare un errore di schema mancante.

def parse(self, response):

Quindi andiamo avanti per dichiarare una funzione di analisi e assegnarle un parametro di risposta. Quando viene eseguito il codice, viene evocata la funzione parse e viene inviato l'oggetto risposta che contiene tutte le informazioni della pagina web visitata.

numero_pagina = risposta.URL.dividi('/')[-1]
nome_file = "pagina.html".formato(numero_pagina)

Quello che abbiamo fatto con questo codice è dividere la stringa contenente l'indirizzo e salvare solo il numero di pagina in a numero di pagina variabile. Quindi creiamo un nome del file variabile inserendo la numero di pagina nella stringa che sarebbe il nome file dei file che creeremmo.

con open(file_name, 'wb') come file:
file.scrivere (risposta.corpo)

Ora abbiamo creato il file e stiamo scrivendo il contenuto della pagina web nel file usando il tasto corpo attributo del risposta oggetto.

Possiamo fare di più che salvare la pagina web. La libreria BeautifulSoup può essere utilizzata per analizzare il corpo.risposta. Puoi dare un'occhiata a questo tutorial BeautiulSoup se non hai familiarità con la libreria.

Dalla pagina da rottamare, ecco un estratto dell'html contenente i dati di cui abbiamo bisogno:

Noterai che tutti i dati necessari sono racchiusi in tag div, quindi riscriveremo il codice per analizzare l'html.
Ecco il nostro nuovo script:

importare scrapy
da bs4 import BeautifulSoup
 
class SampleSpider(scrapy.Ragno):
nome = "campione"
 
start_urls = [
"http://esempio.raschiatura.com/luoghi/default/indice/0",
"http://esempio.raschiatura.com/luoghi/default/indice/1",
"http://esempio.raschiatura.com/luoghi/default/indice/2"
]
 
def parse(self, response):
numero_pagina = risposta.URL.dividi('/')[-1]
nome_file = "pagina.TXT".formato(numero_pagina)
con open(file_name, 'w') come file:
html_content = BeautifulSoup(risposta.corpo, "lxml")
div_tags = contenuto_html.find("div", "id": "risultati")
country_tags = div_tags.find_all("div")
country_name_position = zip(range(len(country_tags)), country_tags)
per posizione, country_name in country_name_position:
file.write("numero del paese : \n".format(posizione + 1, nome_paese.testo))

Il codice è più o meno lo stesso di quello iniziale, tuttavia ho aggiunto BeautifulSoup al nostro namespace e ho cambiato la logica nella funzione parse.

Diamo una rapida occhiata alla logica.

def parse(self, response):

Qui abbiamo definito la funzione parse e le abbiamo dato un parametro di risposta.

numero_pagina = risposta.URL.dividi('/')[-1]
nome_file = "pagina.TXT".formato(numero_pagina)
con open(file_name, 'w') come file:

Questo fa la stessa cosa discussa nel codice iniziale, l'unica differenza è che stiamo lavorando con un file di testo invece di un file html. Salveremo i dati raschiati nel file di testo e non l'intero contenuto web in html come fatto in precedenza.

html_content = BeautifulSoup(risposta.corpo, "lxml")

Quello che abbiamo fatto in questa riga di codice è inviare il risposta.corpo come argomento alla libreria BeautifulSoup e ha assegnato i risultati a html_content variabile.

div_tags = contenuto_html.find("div", "id": "risultati")

Prendendo il contenuto html, lo stiamo analizzando qui cercando a div tag che ha anche e id attributo con risultati come è un valore, quindi possiamo salvarlo in a div_tags variabile.

country_tags = div_tags.find_all("div")

Ricorda che i paesi esistevano in div anche i tag, ora stiamo semplicemente ottenendo tutti i div tag e salvandoli come elenco nel tag_paese variabile.

country_name_position = zip(range(len(country_tags)), country_tags)
 
per posizione, country_name in country_name_position:
file.write("numero del paese : \n".format(posizione + 1, nome_paese.testo))

Qui, stiamo iterando attraverso la posizione dei paesi tra tutti i tag dei paesi, quindi stiamo salvando il contenuto in un file di testo.

Quindi nel tuo file di testo, avresti qualcosa del tipo:

paese numero 1 :  Afghanistan
paese numero 2:  Isole Aland
paese numero 3 :  Albania

Conclusione

Scrapy è senza dubbio una delle librerie più potenti in circolazione, è molto veloce e praticamente scarica la pagina web. Ti dà quindi la libertà di ciò che desideri con il contenuto web.

Dovremmo notare che Scrapy può fare molto di più di quanto abbiamo verificato qui. Se lo desideri, puoi analizzare i dati con i selettori Scrapy CSS o XPath. Puoi leggere la documentazione se hai bisogno di fare qualcosa di più complesso.

I migliori giochi da giocare con il tracciamento delle mani
Oculus Quest ha recentemente introdotto la grande idea del tracciamento manuale senza controller. Con un numero sempre crescente di giochi e attività ...
Come mostrare l'overlay OSD in app e giochi Linux a schermo intero
Giocare a giochi a schermo intero o utilizzare app in modalità a schermo intero senza distrazioni può tagliarti fuori dalle informazioni di sistema ri...
Le 5 migliori carte di acquisizione del gioco
Abbiamo tutti visto e amato i giochi in streaming su YouTube. PewDiePie, Jakesepticye e Markiplier sono solo alcuni dei migliori giocatori che hanno g...