Cum să construiți un crawler web de bază pentru a extrage informații de pe un site web

Cum să construiți un crawler web de bază pentru a extrage informații de pe un site web

Programele care citesc informații de pe site-uri web sau crawlerele web au tot felul de aplicații utile. Puteți descărca informații despre stoc, scoruri sportive, text dintr-un cont Twitter sau puteți extrage prețurile de pe site-urile de cumpărături.





Scrierea acestor programe de accesare cu crawlere pe web este mai ușoară decât ați putea crede. Python are o bibliotecă excelentă pentru scrierea de scripturi care extrag informații de pe site-uri web. Să vedem cum să creăm un crawler web folosind Scrapy.





Instalarea Scrapy

Scrapy este o bibliotecă Python care a fost creată pentru a răzuie webul și a construi crawlerele web. Este rapid, simplu și poate naviga prin mai multe pagini web fără eforturi mari.





Scrapy este disponibil prin biblioteca Pip Installs Python (PIP), aici este o actualizare cum se instalează PIP pe Windows, Mac și Linux .

Utilizarea unui mediu virtual Python este preferată, deoarece vă va permite să instalați Scrapy într-un director virtual care vă lasă singur fișierele de sistem. Documentația Scrapy recomandă să faceți acest lucru pentru a obține cele mai bune rezultate.



Creați un director și inițializați un mediu virtual.

trebuie să aibă software pentru Windows 10
mkdir crawler
cd crawler
virtualenv venv
. venv/bin/activate

Acum puteți instala Scrapy în acel director folosind o comandă PIP.





pip install scrapy

O verificare rapidă pentru a vă asigura că Scrapy este instalat corect

scrapy
# prints
Scrapy 1.4.0 - no active project
Usage:
scrapy [options] [args]
Available commands:
bench Run quick benchmark test
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
runspider Run a self-contained spider (without creating a project)
...

Cum să construiți un crawler web

Acum că mediul este gata, puteți începe să construiți crawlerul web. Să scriem câteva informații dintr-o pagină Wikipedia despre baterii: https://en.wikipedia.org/wiki/Battery_(electricity) .





Primul pas pentru a scrie un crawler este definirea unei clase Python care se extinde de la Scrapy.Păianjen . Acest lucru vă oferă acces la toate funcțiile și caracteristicile din Scrapy. Să numim această clasă păianjen1 .

O clasă de păianjen are nevoie de câteva informații:

  • la Nume pentru identificarea păianjenului
  • la start_urls variabilă care conține o listă de adrese URL din care să se acceseze cu crawlere (URL-ul Wikipedia va fi exemplul din acest tutorial)
  • la analiza() metoda care este utilizată pentru a procesa pagina web pentru a extrage informații
import scrapy
class spider1(scrapy.Spider):
name = 'Wikipedia'
start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)']
def parse(self, response):
pass

Un test rapid pentru a vă asigura că totul funcționează corect.

scrapy runspider spider1.py
# prints
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot)
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Overridden settings: {'SPIDER_LOADER_WARN_ONLY': True}
2017-11-23 09:09:21 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.memusage.MemoryUsage',
'scrapy.extensions.logstats.LogStats',
...

Dezactivarea înregistrării

Rularea Scrapy cu această clasă imprimă informații despre jurnal care nu vă vor ajuta chiar acum. Să simplificăm eliminarea acestor informații de jurnal în exces. Folosește o avertizare declarație prin adăugarea de cod la începutul fișierului.

import logging
logging.getLogger('scrapy').setLevel(logging.WARNING)

Acum, când rulați din nou scriptul, informațiile despre jurnal nu se vor imprima.

Folosind Chrome Inspector

Totul pe o pagină web este stocat în elemente HTML. Elementele sunt aranjate în Document Object Model (DOM). Înțelegerea DOM este esențială pentru a profita la maximum de crawlerul dvs. web. Un crawler web caută prin toate elementele HTML dintr-o pagină pentru a găsi informații, deci este important să știi cum sunt aranjate.

Google Chrome are instrumente care vă ajută să găsiți elemente HTML mai rapid. Puteți localiza codul HTML pentru orice element pe care îl vedeți pe pagina web utilizând inspectorul.

  • Navigați la o pagină din Chrome
  • Plasați mouse-ul pe elementul pe care doriți să-l vizualizați
  • Faceți clic dreapta și selectați Inspecta din meniu

Acești pași vor deschide consola dezvoltatorului cu Elemente fila selectată. În partea de jos a consolei, veți vedea un arbore de elemente. Acest arbore este modul în care veți obține informații pentru scriptul dvs.

Extragerea titlului

Să obținem scenariul pentru a face ceva pentru noi; Un crawl simplu pentru a obține textul titlului paginii web.

Porniți scriptul adăugând un cod la analiza() metoda care extrage titlul.

...
def parse(self, response):
print response.css('h1#firstHeading::text').extract()
...

The raspuns argument acceptă o metodă numită CSS () care selectează elemente din pagină folosind locația pe care o furnizați.

În acest exemplu, elementul este h1.primaCap . Se adaugă

::text

pentru script este ceea ce vă oferă conținutul text al elementului. În cele din urmă, extrage() metoda returnează elementul selectat.

Rularea acestui script în Scrapy imprimă titlul sub formă de text.

[u'Battery (electricity)']

Găsirea descrierii

Acum că am răzuit textul titlului, să facem mai multe cu scriptul. Crawlerul va găsi primul paragraf după titlu și va extrage aceste informații.

Iată arborele elementelor din Consola pentru dezvoltatori Chrome:

click stânga pe mouse nu funcționează
div#mw-content-text>div>p

Săgeata spre dreapta (>) indică o relație părinte-copil între elemente.

Această locație va returna toate fișierele p elemente potrivite, care include întreaga descriere. Pentru a obține primul p element puteți scrie acest cod:

response.css('div#mw-content-text>div>p')[0]

La fel ca și titlul, adăugați extractor CSS

::text

pentru a obține conținutul text al elementului.

response.css('div#mw-content-text>div>p')[0].css('::text')

Expresia finală folosește extrage() pentru a reveni la listă. Puteți utiliza Python a te alatura() funcție pentru a vă alătura listei odată ce crawlingul este complet.

def parse(self, response):
print ''.join(response.css('div#mw-content-text>div>p')[0].css('::text').extract())

Rezultatul este primul paragraf al textului!

An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is
...

Colectarea datelor JSON

Scrapy poate extrage informații sub formă de text, ceea ce este util. Scrapy vă permite, de asemenea, să vizualizați datele JavaScript Object Notation (JSON). JSON este un mod elegant de a organiza informații și este utilizat pe scară largă în dezvoltarea web. JSON funcționează destul de frumos cu Python de asemenea.

Când trebuie să colectați date ca JSON, puteți utiliza fișierul Randament declarație încorporată în Scrapy.

Iată o nouă versiune a scriptului folosind o declarație de randament. În loc să obțineți primul element p în format text, acesta va prelua toate elementele p și îl va organiza în format JSON.

computerul nu va ieși din modul de repaus Windows 10
...
def parse(self, response):
for e in response.css('div#mw-content-text>div>p'):
yield { 'para' : ''.join(e.css('::text').extract()).strip() }
...

Acum puteți rula spiderul specificând un fișier JSON de ieșire:

scrapy runspider spider3.py -o joe.json

Scriptul va imprima acum toate elementele p.

[
{'para': 'An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is the cathode and its negative terminal is the anode.[2] The terminal marked negative is the source of electrons that when connected to an external circuit will flow and deliver energy to an external device. When a battery is connected to an external circuit, electrolytes are able to move as ions within, allowing the chemical reactions to be completed at the separate terminals and so deliver energy to the external circuit. It is the movement of those ions within the battery which allows current to flow out of the battery to perform work.[3] Historically the term 'battery' specifically referred to a device composed of multiple cells, however the usage has evolved additionally to include devices composed of a single cell.[4]'},
{'para': 'Primary (single-use or 'disposable') batteries are used once and discarded; the electrode materials are irreversibly changed during discharge. Common examples are the alkaline battery used for flashlights and a multitude of portable electronic devices. Secondary (rechargeable) batteries can be discharged and recharged multiple
...

Răzuirea mai multor elemente

Până în prezent, crawlerul web a scos titlul și un fel de element din pagină. Scrapy poate extrage, de asemenea, informații din diferite tipuri de elemente într-un singur script.

Să extragem cele mai importante hit-uri IMDb Box Office pentru un weekend. Aceste informații sunt extrase din http://www.imdb.com/chart/boxoffice , într-un tabel cu rânduri pentru fiecare valoare.

The analiza() metoda poate extrage mai multe câmpuri din rând. Utilizând Instrumentele pentru dezvoltatori Chrome puteți găsi elementele imbricate în interiorul tabelului.

...
def parse(self, response):
for e in response.css('div#boxoffice>table>tbody>tr'):
yield {
'title': ''.join(e.css('td.titleColumn>a::text').extract()).strip(),
'weekend': ''.join(e.css('td.ratingColumn')[0].css('::text').extract()).strip(),
'gross': ''.join(e.css('td.ratingColumn')[1].css('span.secondaryInfo::text').extract()).strip(),
'weeks': ''.join(e.css('td.weeksColumn::text').extract()).strip(),
'image': e.css('td.posterColumn img::attr(src)').extract_first(),
}
...

The imagine selectorul specifică faptul că img este un descendent al td.posterColumn . Pentru a extrage atributul potrivit, utilizați expresia ::attr(src).

Rularea păianjenului returnează JSON:

[
{'gross': '.8M', 'weeks': '1', 'weekend': '.8M', 'image': 'https://images-na.ssl-images-amazon.com/images/M/MV5BYWVhZjZkYTItOGIwYS00NmRkLWJlYjctMWM0ZjFmMDU4ZjEzXkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_UY67_CR0,0,45,67_AL_.jpg', 'title': 'Justice League'},
{'gross': '.5M', 'weeks': '1', 'weekend': '.5M', 'image': 'https://images-na.ssl-images-amazon.com/images/M/MV5BYjFhOWY0OTgtNDkzMC00YWJkLTk1NGEtYWUxNjhmMmQ5ZjYyXkEyXkFqcGdeQXVyMjMxOTE0ODA@._V1_UX45_CR0,0,45,67_AL_.jpg', 'title': 'Wonder'},
{'gross': '7.3M', 'weeks': '3', 'weekend': '.7M', 'image': 'https://images-na.ssl-images-amazon.com/images/M/MV5BMjMyNDkzMzI1OF5BMl5BanBnXkFtZTgwODcxODg5MjI@._V1_UY67_CR0,0,45,67_AL_.jpg', 'title': 'Thor: Ragnarok'},
...
]

Mai multe Web Scrapers și roboți

Scrapy este o bibliotecă detaliată care poate face aproape orice tip de accesare cu crawlere web pe care o solicitați. Când vine vorba de găsirea informațiilor în elemente HTML, combinate cu suportul Python, este greu de învins. Indiferent dacă construiți un crawler web sau aflați despre elementele de bază ale răzuirii web, singura limită este cât de mult sunteți dispus să învățați.

Dacă sunteți în căutarea mai multor modalități de a construi crawleruri sau roboți, puteți încerca construiți roboți Twitter și Instagram folosind Python . Python poate construi câteva lucruri uimitoare în dezvoltarea web, așa că merită să mergeți dincolo de crawlerele web atunci când explorați acest limbaj.

Acțiune Acțiune Tweet E-mail 15 Comenzi Windows Prompt Command (CMD) pe care trebuie să le cunoașteți

Promptul de comandă este încă un instrument Windows puternic. Iată cele mai utile comenzi CMD pe care fiecare utilizator Windows trebuie să le cunoască.

Citiți în continuare
Subiecte asemănătoare
  • Programare
  • Instrumente pentru webmasteri
  • Programare
  • Piton
  • Tutoriale de codare
  • Crawlerele web
Despre autor Anthony Grant(40 de articole publicate)

Anthony Grant este un scriitor independent care acoperă programare și software. Este un specialist în informatică care se ocupă de programare, Excel, software și tehnologie.

Mai multe de la Anthony Grant

Aboneaza-te la newsletter-ul nostru

Alăturați-vă newsletter-ului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!

Faceți clic aici pentru a vă abona