03/29/2024

Web Scraping folosind Python: Ghid pas cu pas

Web scraping este ideea de a extrage informații de pe un site web și de a le folosi pentru un anumit caz de utilizare.

Să presupunem că încercați să extrageți un tabel dintr-o pagină web, să îl convertiți într-un fișier JSON și să utilizați fișierul JSON pentru construirea unor instrumente interne. Cu ajutorul web scraping, puteți extrage datele dorite prin țintirea elementelor specifice dintr-o pagină web. Web scraping folosind Python este o alegere foarte populară, deoarece Python oferă mai multe biblioteci precum BeautifulSoup sau Scrapy pentru a extrage datele în mod eficient.

A avea abilitățile de a extrage datele în mod eficient este, de asemenea, foarte important ca dezvoltator sau cercetător de date. Acest articol vă va ajuta să înțelegeți cum să răzuiți eficient un site web și să obțineți conținutul necesar pentru a-l manipula în funcție de nevoile dvs. Pentru acest tutorial, vom folosi pachetul BeautifulSoup. Este un pachet la modă pentru răzuirea datelor în Python.

De ce să folosiți Python pentru Web Scraping?

Python este prima alegere pentru mulți dezvoltatori atunci când construiesc web scrapers. Există multe motive pentru care Python este prima alegere, dar pentru acest articol, să discutăm trei motive principale pentru care Python este utilizat pentru răzuirea datelor.

Suport pentru biblioteci și comunitate: există mai multe biblioteci grozave, cum ar fi BeautifulSoup, Scrapy, Selenium etc., care oferă funcții excelente pentru răzuirea eficientă a paginilor web. A construit un ecosistem excelent pentru web scraping și, de asemenea, pentru că mulți dezvoltatori din întreaga lume folosesc deja Python, puteți obține rapid ajutor atunci când sunteți blocat.

Automatizare: Python este renumit pentru capacitățile sale de automatizare. Este necesar mai mult decât scraping-ul web dacă încercați să creați un instrument complex care se bazează pe scraping. De exemplu, dacă doriți să construiți un instrument care urmărește prețul articolelor dintr-un magazin online, va trebui să adăugați o capacitate de automatizare, astfel încât să poată urmări zilnic tarifele și să le adauge în baza de date. Python vă oferă posibilitatea de a automatiza astfel de procese cu ușurință.

Vizualizarea datelor: web scraping este foarte utilizat de oamenii de știință de date. Oamenii de știință de date au adesea nevoie să extragă date din pagini web. Cu biblioteci precum Pandas, Python simplifică vizualizarea datelor din datele brute.

  8 moduri de a vă asigura următorul apel video Zoom

Biblioteci pentru Web Scraping în Python

Există mai multe biblioteci disponibile în Python pentru a simplifica scrapingul web. Să discutăm aici despre cele mai populare trei biblioteci.

#1. Frumoasa Supa

Una dintre cele mai populare biblioteci pentru web scraping. BeautifulSoup i-a ajutat pe dezvoltatori să răzuiască pagini web din 2004. Oferă metode simple de navigare, căutare și modificare în arborele de analiză. Beautifulsoup în sine face și codificarea datelor de intrare și de ieșire. Este bine întreținut și are o comunitate grozavă.

#2. Scrapy

Un alt cadru popular pentru extragerea datelor. Scrapy are peste 43000 de stele pe GitHub. Poate fi folosit și pentru a răzui date din API-uri. De asemenea, are câteva asistențe încorporate interesante, cum ar fi trimiterea de e-mailuri.

#3. Seleniu

Selenium nu este în principal o bibliotecă web scraping. În schimb, este un pachet de automatizare a browserului. Dar îi putem extinde cu ușurință funcționalitățile pentru răzuirea paginilor web. Utilizează protocolul WebDriver pentru a controla diferite browsere. Seleniul este pe piață de aproape 20 de ani. Dar folosind Selenium, puteți automatiza și elimina cu ușurință datele din paginile web.

Provocări cu Python Web Scraping

Se poate confrunta cu multe provocări atunci când încearcă să răzuiești date de pe site-uri web. Există probleme precum rețele lente, instrumente anti-scraping, blocare bazată pe IP, blocare captcha etc. Aceste probleme pot cauza probleme masive atunci când încercați să răzuiți un site web.

Dar puteți ocoli în mod eficient provocările urmând câteva moduri. De exemplu, în majoritatea cazurilor, o adresă IP este blocată de un site web atunci când există mai mult de o anumită cantitate de solicitări trimise într-un anumit interval de timp. Pentru a evita blocarea IP-ului, va trebui să codificați scraperul astfel încât să se răcească după trimiterea solicitărilor.

De asemenea, dezvoltatorii tind să pună capcane pentru răzuitoare. Aceste capcane sunt de obicei invizibile pentru ochii umani, dar pot fi târâte cu o racletă. Dacă răzuiți un site web care pune o astfel de capcană, va trebui să vă codificați racleta în consecință.

Captcha este o altă problemă gravă cu racletele. Majoritatea site-urilor web din zilele noastre folosesc un captcha pentru a proteja accesul botului la paginile lor. Într-un astfel de caz, ar putea fi necesar să utilizați un solutor de captcha.

Scraping un site web cu Python

După cum am discutat, vom folosi BeautifulSoup pentru a elimina un site web. În acest tutorial, vom răzui datele istorice ale Ethereum din Coingecko și vom salva datele tabelului ca fișier JSON. Să trecem la construirea racletei.

  Căști pline de caracteristici lăsate jos de ANC sărac

Primul pas este să instalați BeautifulSoup și Requests. Pentru acest tutorial, voi folosi Pipenv. Pipenv este un manager de mediu virtual pentru Python. Puteți folosi și Venv dacă doriți, dar eu prefer Pipenv. Discutarea despre Pipenv este dincolo de scopul acestui tutorial. Dar dacă doriți să aflați cum poate fi utilizat Pipenv, urmați acest ghid. Sau, dacă doriți să înțelegeți mediile virtuale Python, urmați acest ghid.

Lansați shell-ul Pipenv în directorul de proiect rulând comanda pipenv shell. Va lansa un subshell în mediul dumneavoastră virtual. Acum, pentru a instala BeautifulSoup, rulați următoarea comandă:

pipenv install beautifulsoup4

Și, pentru solicitările de instalare, rulați comanda similară cu cea de mai sus:

pipenv install requests

Odată ce instalarea este finalizată, importați pachetele necesare în fișierul principal. Creați un fișier numit main.py și importați pachetele ca mai jos:

from bs4 import BeautifulSoup
import requests
import json

Următorul pas este să obțineți conținutul paginii de date istorice și să le analizați utilizând analizatorul HTML disponibil în BeautifulSoup.

r = requests.get('https://www.coingecko.com/en/coins/ethereum/historical_data#panel')

soup = BeautifulSoup(r.content, 'html.parser')

În codul de mai sus, pagina este accesată folosind metoda get disponibilă în biblioteca de solicitări. Conținutul analizat este apoi stocat într-o variabilă numită supă.

Piesa de răzuire originală începe acum. În primul rând, va trebui să identificați corect tabelul în DOM. Dacă deschideți această pagină și o inspectați folosind instrumentele de dezvoltare disponibile în browser, veți vedea că tabelul are aceste clase de tabel table-striped text-sm text-lg-normal.

Tabel de date istorice Coingecko Ethereum

Pentru a viza corect acest tabel, puteți utiliza metoda find.

table = soup.find('table', attrs={'class': 'table table-striped text-sm text-lg-normal'})

table_data = table.find_all('tr')

table_headings = []

for th in table_data[0].find_all('th'):
    table_headings.append(th.text)

În codul de mai sus, mai întâi, tabelul este găsit folosind metoda soup.find, apoi folosind metoda find_all, toate tr elementele din interiorul tabelului sunt căutate. Aceste elemente tr sunt stocate într-o variabilă numită table_data. Tabelul are câteva elemente pentru titlu. O nouă variabilă numită table_headings este inițializată pentru a păstra titlurile într-o listă.

Se rulează apoi o buclă for pentru primul rând al tabelului. În acest rând, toate elementele cu th sunt căutate, iar valoarea lor text este adăugată la lista table_headings. Textul este extras folosind metoda textului. Dacă imprimați variabila table_headings acum, veți putea vedea următoarea ieșire:

['Date', 'Market Cap', 'Volume', 'Open', 'Close']

Următorul pas este să răzuiți restul elementelor, să generați un dicționar pentru fiecare rând și apoi să adăugați rândurile într-o listă.

for tr in table_data:
    th = tr.find_all('th')
    td = tr.find_all('td')

    data = {}

    for i in range(len(td)):
        data.update({table_headings[0]: th[0].text})
        data.update({table_headings[i+1]: td[i].text.replace('n', '')})

    if data.__len__() > 0:
        table_details.append(data)

Aceasta este partea esențială a codului. Pentru fiecare tr din variabila table_data, se caută mai întâi elementele-ale. Elementele alese sunt data prezentată în tabel. Aceste elemente sunt stocate în interiorul unei variabile th. În mod similar, toate elementele td sunt stocate în variabila td.

  Ghid cuprinzător despre parametrii URL pentru SEO

Un dicționar gol este inițializat. După inițializare, parcurgem gama de elemente td. Pentru fiecare rând, în primul rând, actualizăm primul câmp al dicționarului cu primul articol din th. Codul table_headings[0]: al[0].text atribuie o pereche cheie-valoare de dată și primul element.

După inițializarea primului element, celelalte elemente sunt alocate folosind data.update({table_headings[i+1]: td[i].text.replace(‘n’, ”)}). Aici, textul td elements este mai întâi extras folosind metoda text, iar apoi tot n este înlocuit folosind metoda înlocuire. Valoarea este apoi atribuită elementului i+1 din lista table_headings deoarece al i-lea element este deja atribuit.

Apoi, dacă lungimea dicționarului de date depășește zero, anexăm dicționarul la lista table_details. Puteți imprima lista table_details pentru a verifica. Dar vom scrie valorile într-un fișier JSON. Să aruncăm o privire la codul pentru asta,

with open('table.json', 'w') as f:
    json.dump(table_details, f, indent=2)
    print('Data saved to json file...')

Aici folosim metoda json.dump pentru a scrie valorile într-un fișier JSON numit table.json. Odată ce scrierea este completă, imprimăm datele salvate în fișierul json… în consolă.

Acum, rulați fișierul folosind următoarea comandă,

python run main.py

După ceva timp, veți putea vedea textul Datele salvate în fișierul JSON… în consolă. Veți vedea, de asemenea, un fișier nou numit table.json în directorul fișierelor de lucru. Fișierul va arăta similar cu următorul fișier JSON:

[
  {
    "Date": "2022-11-27",
    "Market Cap": "$145,222,050,633",
    "Volume": "$5,271,100,860",
    "Open": "$1,205.66",
    "Close": "N/A"
  },
  {
    "Date": "2022-11-26",
    "Market Cap": "$144,810,246,845",
    "Volume": "$5,823,202,533",
    "Open": "$1,198.98",
    "Close": "$1,205.66"
  },
  {
    "Date": "2022-11-25",
    "Market Cap": "$145,091,739,838",
    "Volume": "$6,955,523,718",
    "Open": "$1,204.21",
    "Close": "$1,198.98"
  },
// ...
// ... 
]

Ați implementat cu succes un web scraper folosind Python. Pentru a vedea codul complet, puteți vizita acest depozit GitHub.

Concluzie

Acest articol a discutat cum ați putea implementa un simplu scrape Python. Am discutat despre cum ar putea fi folosit BeautifulSoup pentru a răzui rapid datele de pe site. Am discutat, de asemenea, despre alte biblioteci disponibile și de ce Python este prima alegere pentru mulți dezvoltatori pentru scraping site-uri.

Puteți, de asemenea, să vă uitați la aceste cadre de scraping web.