Cum se construiește un crawler Web de bază pentru a trage informații de pe un site web

Cum se construiește un crawler Web de bază pentru a trage informații de pe un site web / Programare

Ați vrut vreodată să capturați în mod programatic anumite informații de pe un site web pentru procesare ulterioară? Spuneți ceva de genul scorurilor sportive, tendințelor de pe piața de valori sau cele mai recente prețuri de cripto-valută? Dacă informațiile de care aveți nevoie sunt disponibile pe un site web, puteți scrie un crawler (cunoscut și ca un răzuitor sau un păianjen) pentru a naviga pe site și pentru a extrage exact ceea ce aveți nevoie. Să vedem cum să facem asta în Python.

Rețineți că mai multe site-uri web descurajează utilizarea unui crawler pentru a accesa informațiile oferite de site. Așadar, vă rugăm să verificați termenii și condițiile site-ului înainte de a implementa un crawler pe orice site web.

Instalarea Scrapy

Folosim un modul python numit Scrapy pentru manipularea crawling-ului real. Este rapid, simplu și poate naviga pe mai multe pagini web la fel cum puteți cu un browser.

Rețineți, totuși, că scriptura nu are facilități pentru a procesa javascript atunci când navigați pe site. Deci acele site-uri și aplicații care utilizează javascript pentru a manipula interfața cu utilizatorul nu pot fi accesate cu crawlere în mod corespunzător cu această abordare.

Lasati-ne acum sa instalati scrupule. Noi folosim virtualenv Aflați cum să utilizați mediul virtual Python Aflați cum să utilizați mediul virtual Python Fie că sunteți un dezvoltator experimentat Python, fie că începeți să învățați cum să configurați un mediu virtual este esențial pentru orice proiect Python. Citește mai mult pentru a instala scriptura. Acest lucru ne permite să instalăm scrapy într-un director fără a afecta alte module instalate în sistem.

Creați un director și inițializați un mediu virtual în acel director.

mkdir crawler cd crawler virtualenv venv. venv / bin / activare 

Puteți instala acum scrapy în acest director.

instalare pip instalare 

Verificați dacă scriptura este instalată corect.

scrapy # prints Scrapy 1.4.0 - nici un proiect activ Utilizare: scrapy  [opțiuni] [args] Comenzi disponibile: bancă Executare test rapid de referință preluare Atrageți o adresă URL utilizând genspiderul de descărcare Scrapy Generați un nou păianjen utilizând run-uri șablon predefinite Rulați un păianjen autonom (fără a crea un proiect) ... 

Construirea unui crawler Web (numit și Spider)

Să scriem acum un crawler pentru încărcarea unor informații. Începem prin eliminarea unor informații de pe o pagină Wikipedia pe o baterie de la https://en.wikipedia.org/wiki/Battery_(electricity).

Primul pas în scrierea unui crawler este definirea unei clase python care se extinde de la scrapy.Spider. Să numim această clasă spider1.

Cel puțin, o clasă de păianjeni necesită următoarele:

  • A Nume pentru identificarea păianjenului, “Wikipedia” în acest caz.
  • A start_urls variabilă care conține o listă de adrese URL pentru a începe să acceseze cu crawlere. Utilizăm URL-ul Wikipedia prezentat mai sus pentru prima noastră accesare cu crawlere.
  • A analiza() care - chiar dacă nu este o opțiune acum - este folosită pentru a procesa pagina web pentru a extrage ceea ce vrem.
import scrapy clasa spider1 (scrapy.Spider): name = 'Wikipedia' start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)'] def parse (auto, răspuns): pass 

Acum putem rula acest păianjen pentru a ne asigura că totul funcționează corect. Se execută după cum urmează.

scrapy runspider spider1.py # prints 2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 a început (bot: scrapybot) 2017-11-23 09:09:21 [scrapy.utils .log] INFO: Setări suprascrise: 'SPIDER_LOADER_WARN_ONLY': True 2017-11-23 09:09:21 [scrapy.middleware] INFO: Extensii activate: ['scrapy.extensions.memusage.MemoryUsage', 'scrapy.extensions .logstats.LogStats', ... 

Dezactivarea înregistrării

După cum puteți vedea, alergarea cu clasa noastră minimă generează o mulțime de rezultate care nu ne dau prea multă sens. Să setăm nivelul de înregistrare la avertizare și reîncercați. Adăugați următoarele rânduri la începutul fișierului.

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

La redeschiderea păianjenului, ar trebui să vedem un minim de mesaje din jurnal.

Utilizarea inspectorului Chrome

Extragerea informațiilor dintr-o pagină web constă în determinarea poziției elementului HTML din care ne dorim informații. O modalitate frumoasă și ușoară de a găsi poziția unui element Aflați problemele site-ului web cu ajutorul instrumentelor pentru dezvoltatori Chrome sau Firebug Imaginează-ți problemele site-ului cu ajutorul instrumentelor pentru dezvoltatori Chrome sau Firebug Dacă ați urmat tutorialele mele jQuery până acum, s-ar putea să fi întâlnit deja unele probleme de cod și nu se știe cum să le rezolvați. În cazul în care se confruntă cu un bit non-funcțional de cod, este foarte ... Citește mai mult de la Chrome Web Browser este de a utiliza Inspector.

  • Navigați la pagina corectă din Chrome.
  • Plasați mouse-ul pe elementul pentru care doriți informațiile.
  • Faceți clic dreapta pentru a extrage meniul contextual.
  • Selectați Inspecta din meniu.

Ar trebui să apară consola dezvoltatorului cu element fila selectată. În partea inferioară a filei, ar trebui să vedeți bara de stare cu poziția elementului afișat după cum urmează:

html organism div # conținut.mw-corp h1 # firstHeading.firstHeading.

După cum explicăm mai jos, aveți nevoie de unele sau de toate părțile din această poziție.

Extragerea titlului

Să adăugăm acum un cod la analiza() de extragere a titlului paginii.

... def parse (auto, răspuns): print response.css ('h1 # firstHeading :: text') extract () ... 

raspuns argumentul pentru metoda susține o metodă numită css () care selectează elemente din pagină folosind locația dată. Pentru cazul nostru, elementul este h1.firstHeading. Avem nevoie de conținutul textului elementului astfel încât să adăugăm ::text la selecție. În cele din urmă, extrage() metoda returnează elementul selectat.

La rularea scrupulei din nou în această clasă, obținem următoarea ieșire:

[u'Battery (electricitate) '] 

Aceasta arată că titlul a fost extras într-o listă de șiruri de caractere unicode.

Cum despre descriere?

Pentru a demonstra mai multe aspecte ale extragerii de date din paginile web, să primim primul paragraf al descrierii din pagina Wikipedia de mai sus.

La inspecția utilizând Consola pentru dezvoltatori Chrome, descoperim că locația elementului este (brațul cu unghi drept (>) indică o relație părinte-copil între elemente):

div # mw-conținut text> div> p

Această locație revine toate p elemente potrivite, care include întreaga descriere. Deoarece vrem doar prima p element, folosim următorul extractor:

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

Pentru a extrage doar conținutul textului, adăugăm extractor CSS ::text:

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

Expresia finală folosește extrage() care returnează o listă de șiruri de caractere unicode. Folosim Python a adera() pentru a vă alătura lista.

 def parse (auto, răspuns): print ".join (answer.css ('div # mw-content-text> div> p') [0]. 

Rezultatul obținut de la clasa de lucru cu această clasă este ceea ce căutăm:

Un acumulator electric este un dispozitiv alcătuit din una sau mai multe celule electrochimice cu conexiuni externe furnizate pentru alimentarea dispozitivelor electrice, cum ar fi lanterne, telefoane inteligente și mașini electrice. [1] Atunci când o baterie furnizează energie electrică, terminalul său pozitiv este ... 

Colectarea datelor utilizând Randament

Codul de mai sus imprimă datele extrase în consola. Când trebuie să colectezi date ca JSON, poți folosi Randament afirmație. Modul în care Randament lucrările sunt următoarele - executând o funcție care conține a Randament declarația returnează ceea ce este cunoscut ca un generator pentru apelant. Generatorul este o funcție pe care apelantul o poate executa în mod repetat până la terminarea acestuia.

Aici este un cod similar celui de mai sus, dar care utilizează Randament declarație pentru a returna lista de p elemente în HTML.

... def parse (de sine, de răspuns): pentru e în answer.css ('div "): yield ' para ':" ) .extract ()) banda () ... 

Acum puteți rula păianjenul specificând un fișier JSON de ieșire după cum urmează:

scump runspider spider3.py -o joe.json 

Producția generată este următoarea:

["para": "Un acumulator electric este un dispozitiv alcătuit din una sau mai multe celule electrochimice cu conexiuni externe furnizate pentru alimentarea dispozitivelor electrice, cum ar fi lanterne, telefoane inteligente și mașini electrice." [1] Atunci când o baterie furnizează energie electrică, terminalul pozitiv este catodul și terminalul său negativ este anodul. [2] Terminalul marcat negativ este sursa de electroni care, atunci când este conectată la un circuit extern, va curge și va furniza energie către un dispozitiv extern Când o baterie este conectată la o sursă externă , electroliții se pot mișca ca ioni, permițând ca reacțiile chimice să fie completate la bornele separate și astfel să furnizeze energie circuitului extern.Acesta este mișcarea acelor ioni din interiorul bateriei care permite curentului să curgă din baterie [3] Din punct de vedere istoric, termenul "baterie" se referă în mod specific la un dispozitiv compus din mai multe celule, cu toate acestea utilizarea a evoluat suplimentar pentru a include dispozitive compuse dintr-un păcat [4] ", " para ":" Bateriile primare (de unică folosință sau "unică folosință") sunt folosite o singură dată și aruncate; materialele electrodului sunt schimbate ireversibil în timpul descărcării. Exemple comune sunt bateria alcalină utilizată pentru lanterne și o multitudine de dispozitive electronice portabile. Bateriile secundare (reîncărcabile) pot fi descărcate și reîncărcate ... 

Procesarea mai multor biți de informații

Să analizăm acum extragerea mai multor biți aferenți informațiilor. Pentru acest exemplu, vom extrage cele mai bune rezultate pentru IMDb Box Office pentru weekend-ul curent. Aceste informații sunt disponibile la http://www.imdb.com/chart/boxoffice, într-un tabel cu un șir de informații pentru fiecare lovitură.

Extragem diferite câmpuri în fiecare rând folosind următoarele analiza() metodă. Din nou, locațiile CSS ale elementelor au fost determinate utilizând Consola pentru dezvoltatori Chrome așa cum sa explicat mai sus:

... def parse (sine, răspuns): pentru e în response.css ('div # boxoffice> table> tbody> tr'): yield 'title' : text "), extract ()), banda ()," weekend ":" join "(e.css ('td.ratingColumn') [0]. (), "brute" (), "join" (e.css ('td.ratingColumn') [1] .css ('span.secondaryInfo :: text' : "(.css ('td.weeksColumn :: text'). extract ()) banda (), 'imagine': e.css ('td.posterColumn img :: attr (src)'). extract_first (), ... 

Rețineți că imagine selectorul de mai sus specifică faptul că img este un descendent al lui td.posterColumn, și extragem atributul numit src folosind expresia :: attr (src).

Rularea spiderului returnează acum următorul JSON:

["brut": "93.8M $", "săptămâni": "1", "weekend": "93.8M $", "imagine": "https://images-na.ssl-images-amazon.com/images "," Titlu ":" Liga de Justiție ", " brut ":" 27,5 milioane dolari "," săptămâni ":" 1 " $ 27.5M "," imagine ":" https://images-na.ssl-images-amazon.com/images/M/MV5BYjFhOWY0OTgtNDkzMC00YWJkLTk1NGEtYWUxNjhmMmQ5ZjYyXkEyXkFqcGdeQXVyMjMxOTE0ODA@._V1_UX45_CR0,0,45,67_AL_.jpg "," titlu ":" Wonder " , "brut": "247.3M $", "săptămâni": "3", "weekend": "21.7M $", "imagine": "https://images-na.ssl-images-amazon.com/ Imagini / M / MV5BMjMyNDkzMzI1OF5BMl5BanBnXkFtZTgwODcxODg5MjI @ ._ V1_UY67_CR0,0,45,67_AL_.jpg "," titlu ":" Thor: Ragnarok ", ...] 

Folosind crawlerul

Să încheiem acum acest articol cu ​​câteva puncte esențiale:

  • Folosind Python cu scrapy, este ușor să scriem crawlerele site-ului pentru a extrage orice informație de care aveți nevoie.
  • Consola pentru dezvoltatori Chrome (sau instrumentul Firebug al Firefox) ajută la localizarea locațiilor pentru extragere.
  • lui Python Randament instrucțiunea ajută la extragerea elementelor de date repetate.

Aveți în vedere anumite proiecte specifice pentru răsturnarea site-ului? Și cu ce probleme ați încercat să încercați? Spuneți-ne în comentariile de mai jos.

Credit de imagine: dxinerz / Depositphotos | Lulzmango / Wikimedia Commons

Explorați mai multe despre: Programare, Python, Instrumente pentru webmasteri.