HTML este aproape intuitiv. CSS este o avansare excelentă care separă curând structura unei pagini de aspectul ei. JavaScript adaugă unele pizazz. Aceasta este teoria. Lumea reală este puțin diferită.
În acest tutorial, veți afla modul în care conținutul pe care îl vedeți în browser devine realmente redat și cum se poate schimba atunci când este necesar. În special, veți afla cum să numărați comentariile Disqus. Instrumentele noastre vor fi Python și pachete minunate precum cererile, BeautifulSoup și Selenium.
Înlăturarea paginilor web este practica preluării în mod automat a conținutului paginilor web destinate interacțiunii cu utilizatorii umani, parsarea acestora și extragerea unor informații (eventual navigarea către alte pagini). Este uneori necesar să nu existe altă modalitate de extragere a informațiilor necesare. În mod ideal, aplicația oferă un API dedicat pentru accesarea datelor sale programabil. Există mai multe motive pentru că răsturnarea web ar trebui să fie ultima dvs. soluție:
Să înțelegem ce ne confruntăm, analizând rezultatele unor coduri comune de aplicații web. În articolul Introducere la Vagrant, există câteva comentarii Disqus în partea de jos a paginii:
Pentru a elimina aceste comentarii, trebuie să le găsim pe prima pagină.
Fiecare browser de la începutul anilor 1990 a sprijinit abilitatea de a vizualiza codul HTML al paginii curente. Aici este un fragment din sursa de vizualizare a Introducere în Vagrant, care începe cu o mare bucată de JavaScript minimalizat și uglificat care nu are legătură cu articolul în sine. Aici este mic parte din acesta:
Iată câteva coduri HTML reale din pagină:
Acest lucru pare destul de murdar, dar ceea ce este surprinzător este că nu veți găsi comentariile Disqus în sursa paginii.
Se pare că pagina este un mashup, iar comentariile Disqus sunt încorporate ca un element iframe (cadru inline). Puteți afla acest lucru făcând clic dreapta pe zona de comentarii și veți vedea că există informații despre cadre și sursă acolo:
Are sens. Incorporarea conținutului terță parte ca cadru iframe este unul din motivele principale de utilizare a cadrelor iframe. Hai să găsim etichetă apoi în sursa principală a paginii. Împiedicați din nou! Nu este
tag în sursa paginii principale.
Motivul acestei omisiuni este acela Vezi sursa paginii
vă arată conținutul care a fost preluat de pe server. Dar ultimul DOM (model obiect de document) care devine randat de browser poate fi foarte diferit. JavaScript rulează și poate manipula DOM la nevoie. Nu se poate găsi iframe, deoarece nu a fost acolo când pagina a fost preluată de pe server.
Înlăturarea statică ignoră JavaScript. Încarcă pagini web de pe server fără ajutorul unui browser. Ați obținut exact ceea ce vedeți în "sursa de vizualizare a paginii", apoi ați tăiat și ați zarit-o. Dacă conținutul pe care îl căutați este disponibil, nu trebuie să mergeți mai departe. Cu toate acestea, dacă conținutul este ceva asemănător cu discursul iframe, aveți nevoie de răsturnare dinamică.
Înlăturarea dinamică utilizează un browser real (sau un browser fără cap) și permite JavaScript să facă acest lucru. Apoi, interoghează DOM pentru a extrage conținutul pe care îl caută. Uneori trebuie să automatizezi browserul simulând un utilizator pentru a obține conținutul de care ai nevoie.
Să vedem cum funcționează răsturnarea statică utilizând două pachete minunate de Python: cereri de preluare a paginilor web și BeautifulSoup pentru parsarea paginilor HTML.
Instalați mai întâi pipenv, apoi: pipenv instala cererile beautifulsoup4
Acest lucru va crea un mediu virtual și pentru dvs. Dacă utilizați codul din gitlab, puteți doar instalare pipenv
.
Fetching-ul unei pagini cu cereri este un liner: r = requests.get (url)
Obiectul răspunsului are multe atribute. Cele mai importante sunt O.K
și conţinut
. Dacă cererea nu reușește atunci r.ok
va fi Fals și r.content
va conține eroarea. Conținutul este un flux de octeți. De obicei este mai bine să o decodezi la utf-8 atunci când se ocupă de text:
>>> r = requests.get ('http://www.c2.com/no-such-page') >>> r.ok Fals >>> print (r.content.decode ('utf-8' ))404 Nu a fost gasit Nu a fost gasit
URL-ul / ggg-ul solicitat nu a fost găsit pe acest server.
Serverul Apache / 2.0.52 (CentOS) la www.c2.com Port 80
Dacă totul este OK atunci r.content
va conține pagina web solicitată (aceeași ca și sursa paginii de vizualizare).
get_page ()
funcția de mai jos aduce o pagină web prin URL, o decodifică la UTF-8 și o parsează într-un obiect BeautifulSoup folosind parserul HTML.
def get_page (url): r = requests.get (url) content = r.content.decode ('utf-8') retur BeautifulSoup (conținut, 'html.parser')
Odată ce avem un obiect BeautifulSoup, putem începe să extragem informații din pagină. BeautifulSoup oferă multe funcții de căutare pentru a localiza elementele din interiorul paginii și pentru a detalia elementele adânci imbricate.
Tuts + paginile autorului conțin mai multe tutoriale. Aici este pagina mea de autor. Pe fiecare pagină există până la 12 tutoriale. Dacă aveți mai mult de 12 tutoriale, puteți naviga la pagina următoare. HTML pentru fiecare articol este închis într-un etichetă. Următoarea funcție găsește toate elementele de articol de pe pagină, trasează linkurile lor și extrage atributul href pentru a obține adresa URL a tutorialului:
def get_page_articles (pagina): elements = page.findAll ('articolul') articole = [e.a.attrs ['href'] pentru e în elemente]
Următorul cod primește toate articolele din pagina mea și le imprimă (fără prefixul comun):
pagina = get_page ('https://tutsplus.com/authors/gigi-sayfan') articole = get_page_articles (pagina) prefix = 'https://code.tutsplus.com/tutorials' pentru articolele: print (a [ lenjerie-python-3-and-pygame-part-5 - cms-30085 building-games-with-python- cms-30084 building-games-with-python-3-and-pygame-part-3 - cms-30083 building-games-cu-python-3-and-pygame-part-2 - cu-python-3-și-pygame-part-1 - cms-30081 metode de mastering-reacție-ciclu de viață - cms-29849 test-data-intensive-code-with-go- cms-29852 test-data-intensive-code-with-go-part-4 - cms-29851 test-data-intensive-code-with-go-part-3 - cu-go-part-2 - cms-29848 test-data-intensive-code-with-go-part-1 - cms-29847 CMS-29809
Descoperirea statică a fost suficient de bună pentru a obține lista de articole, dar așa cum am văzut mai devreme, comentariile Disqus sunt încorporate ca un element iframe de către JavaScript. Pentru a recolta comentariile, va trebui să automatizăm browserul și să interacționăm cu DOM interactiv. Unul dintre cele mai bune instrumente pentru această slujbă este Selenium.
Seleniul este orientat în primul rând spre testarea automată a aplicațiilor web, însă este un instrument de automatizare a browserului general.
Tastați această comandă pentru a instala Selenium: pipenv instala seleniu
Selenium are nevoie de un driver web (browserul pe care îl automatizează). Pentru răzuirea web, de obicei, nu contează driverul pe care îl alegeți. Prefer filtrul Chrome. Urmați instrucțiunile din acest ghid pentru Selenium.
În unele cazuri, puteți prefera să utilizați un browser fără cap, ceea ce înseamnă că nu este afișat niciun UI. Teoretic, PhantomJS este doar un alt șofer web. Dar, în practică, oamenii au raportat probleme de incompatibilitate în care Selenium funcționează corect cu Chrome sau Firefox și uneori eșuează cu PhantomJS. Prefer să eliminați această variabilă din ecuație și să folosiți un driver web actual de browser.
Să facem niște răsturnări dinamice și să folosim Selenium pentru a număra comentarii Disqus pe Tuts + tutoriale. Iată importurile necesare.
de la selenium import webdriver de la selenium.webdriver.common.by import De la selenium.webdriver.support.expected_conditions import (presence_of_element_located) de la selenium.webdriver.support.wait import WebDriverWait
get_comment_count ()
funcția acceptă un șofer și URL-ul pentru Selenium. Utilizează obține()
metoda driverului de a prelua adresa URL. Acest lucru este similar cu requests.get ()
, dar diferența este că obiectul șoferului gestionează o reprezentare live a DOM.
Apoi, devine titlul de tutorial și localizează iframe Disqus folosind id părinte disqus_thread
și apoi iframe-ul însuși:
Definiți defragmentarea fișierului de tip "iframe" (fișierul "iframe" ) iframe_url = disqus_iframe.get_attribute ('src')
Următorul pas este să preluați conținutul iframe-ului în sine. Rețineți că așteptăm comment-count
element pentru a fi prezent, deoarece comentariile sunt încărcate dinamic și nu neapărat disponibile încă.
driver.get (iframe_url) wait = WebDriverWait (șofer, 5) commentCountPresent = prezență_decare_locație ((By.CLASS_NAME, "comment-count")) comment_count = int (comment_count_span.text.split () [0])
Ultima parte este aceea de a returna ultimul comentariu dacă nu a fost făcut de mine. Ideea este de a detecta comentariile la care nu am răspuns încă.
('a') last_author = e.get_attribute ('data-username') dacă last_author! = 'last_comment = if comment_count> the_gigi ': e = driver.find_elements_by_class_name (' post-meta ') meta = e [-1] .find_element_by_tag_name (' a ') last_comment = meta.text) return name, comment_count, last_comment
Descoperirea web este o practică utilă atunci când informațiile de care aveți nevoie sunt accesibile printr-o aplicație web care nu oferă un API adecvat. Este nevoie de o activitate non-trivială pentru a extrage date de la aplicațiile web moderne, dar instrumentele mature și bine concepute cum ar fi cererile, BeautifulSoup și Selenium o fac utilă.
În plus, nu ezitați să vedeți ceea ce avem la dispoziție pentru vânzare și pentru studierea pe piața Envato și nu ezitați să adresați întrebări și să oferiți feedback-ul dvs. valoros utilizând feedul de mai jos.