Tīmekļa skrāpēšana, izmantojot Python: soli pa solim

Tīmekļa skrāpēšana ir ideja par informācijas izvilkšanu no vietnes un tās izmantošanu noteiktā lietošanas gadījumā.

Pieņemsim, ka mēģināt izvilkt tabulu no tīmekļa lapas, pārvērst to par JSON failu un izmantot JSON failu, lai izveidotu dažus iekšējos rīkus. Izmantojot tīmekļa nokasīšanu, varat iegūt vajadzīgos datus, atlasot konkrētus tīmekļa lapas elementus. Tīmekļa skrāpēšana, izmantojot Python, ir ļoti populāra izvēle, jo Python nodrošina vairākas bibliotēkas, piemēram, BeautifulSoup vai Scrapy, lai efektīvi iegūtu datus.

Prasme efektīvi iegūt datus ir ļoti svarīga arī kā izstrādātājam vai datu zinātniekam. Šis raksts palīdzēs jums saprast, kā efektīvi nokasīt vietni un iegūt nepieciešamo saturu, lai ar to manipulētu atbilstoši savām vajadzībām. Šajā apmācībā mēs izmantosim BeautifulSoup pakotni. Tā ir moderna pakotne datu skrāpēšanai Python.

Kāpēc izmantot Python tīmekļa skrāpēšanai?

Python ir pirmā izvēle daudziem izstrādātājiem, veidojot tīmekļa skrāpjus. Ir daudz iemeslu, kāpēc Python ir pirmā izvēle, taču šajā rakstā apskatīsim trīs galvenos iemeslus, kāpēc Python tiek izmantots datu nokasīšanai.

Bibliotēkas un kopienas atbalsts: ir vairākas lieliskas bibliotēkas, piemēram, BeautifulSoup, Scrapy, Selenium u.c., kas nodrošina lieliskas funkcijas efektīvai tīmekļa lapu nokasīšanai. Tā ir izveidojusi lielisku ekosistēmu tīmekļa skrāpēšanai, un arī tāpēc, ka daudzi izstrādātāji visā pasaulē jau izmanto Python, jūs varat ātri saņemt palīdzību, kad esat iestrēdzis.

Automatizācija: Python ir slavens ar savām automatizācijas iespējām. Ja mēģināt izveidot sarežģītu rīku, kas balstās uz skrāpēšanu, ir nepieciešams vairāk nekā tikai tīmekļa nokasīšana. Piemēram, ja vēlaties izveidot rīku, kas izseko preču cenas tiešsaistes veikalā, jums ir jāpievieno dažas automatizācijas iespējas, lai tas katru dienu varētu izsekot tarifiem un pievienot tos jūsu datubāzei. Python sniedz jums iespēju viegli automatizēt šādus procesus.

Datu vizualizācija: datu zinātnieki plaši izmanto tīmekļa nokasīšanu. Datu zinātniekiem bieži ir jāizņem dati no tīmekļa lapām. Izmantojot tādas bibliotēkas kā Pandas, Python padara datu vizualizāciju vienkāršāku no neapstrādātiem datiem.

Bibliotēkas tīmekļa skrāpēšanai programmā Python

Python ir pieejamas vairākas bibliotēkas, lai vienkāršotu tīmekļa skrāpēšanu. Apspriedīsim trīs populārākās bibliotēkas šeit.

  Dinamiskā periodiskā tabula ir interaktīvs rīks ķīmijas entuziastiem [Web]

#1. Skaista zupa

Viena no populārākajām bibliotēkām tīmekļa skrāpēšanai. BeautifulSoup ir palīdzējis izstrādātājiem nokasīt tīmekļa lapas kopš 2004. gada. Tas nodrošina vienkāršas metodes, kā pārvietoties, meklēt un modificēt parsēšanas koku. Beautifulsoup pati veic arī ienākošo un izejošo datu kodēšanu. Tas ir labi uzturēts un tajā ir lieliska kopiena.

#2. Skrapis

Vēl viens populārs datu ieguves ietvars. Scrapy vietnē GitHub ir vairāk nekā 43 000 zvaigžņu. To var izmantot arī datu nokasīšanai no API. Tam ir arī daži interesanti iebūvēti atbalsts, piemēram, e-pasta sūtīšana.

#3. Selēns

Selēns nav galvenokārt tīmekļa skrāpēšanas bibliotēka. Tā vietā tā ir pārlūkprogrammas automatizācijas pakotne. Taču mēs varam viegli paplašināt tā funkcionalitāti tīmekļa lapu nokasīšanai. Tas izmanto WebDriver protokolu dažādu pārlūkprogrammu vadīšanai. Selēns ir bijis tirgū gandrīz 20 gadus. Bet, izmantojot Selēnu, varat viegli automatizēt un izvilkt datus no tīmekļa lapām.

Izaicinājumi ar Python Web Scraping

Mēģinot iegūt datus no vietnēm, var saskarties ar daudzām problēmām. Pastāv tādas problēmas kā lēni tīkli, pretnokasīšanas rīki, bloķēšana uz IP, captcha bloķēšana utt. Šīs problēmas var radīt lielas problēmas, mēģinot nokasīt vietni.

Bet jūs varat efektīvi apiet problēmas, ievērojot dažus veidus. Piemēram, vairumā gadījumu vietne bloķē IP adresi, ja noteiktā laika intervālā ir nosūtīts vairāk nekā noteikts pieprasījumu skaits. Lai izvairītos no IP bloķēšanas, jums būs jākodē skrāpis, lai pēc pieprasījumu nosūtīšanas tas atdziest.

Izstrādātāji mēdz likt arī meduspodu slazdus skrāpjiem. Šie slazdi parasti ir neredzami cilvēka acīm, taču tos var pārmeklēt ar skrāpi. Ja nokopējat vietni, kurā ir ievietots šāds medus poda slazds, jums būs attiecīgi jākodē savs skrāpis.

Captcha ir vēl viena nopietna problēma ar skrāpjiem. Mūsdienās lielākā daļa vietņu izmanto captcha, lai aizsargātu robotu piekļuvi savām lapām. Šādā gadījumā, iespējams, būs jāizmanto captcha risinātājs.

Vietnes nokasīšana, izmantojot Python

Kā mēs apspriedām, mēs izmantosim BeautifulSoup, lai noņemtu vietni. Šajā apmācībā mēs nokasīsim Ethereum vēsturiskos datus no Coingecko un saglabāsim tabulas datus kā JSON failu. Pāriesim pie skrāpja veidošanas.

Pirmais solis ir instalēt BeautifulSoup un Requests. Šai apmācībai es izmantošu Pipenv. Pipenv ir Python virtuālās vides pārvaldnieks. Ja vēlaties, varat izmantot arī Venv, bet es dodu priekšroku Pipenv. Diskusijas par Pipenv neietilpst šīs apmācības ietvaros. Bet, ja vēlaties uzzināt, kā var izmantot Pipenv, izpildiet šo rokasgrāmatu. Vai arī, ja vēlaties izprast Python virtuālās vides, izpildiet šo rokasgrāmatu.

  Kā novērst Google Meet mikrofona nedarbošanos

Palaidiet Pipenv čaulu savā projekta direktorijā, palaižot komandu pipenv apvalks. Jūsu virtuālajā vidē tiks palaists apakšapvalks. Tagad, lai instalētu BeautifulSoup, palaidiet šādu komandu:

pipenv install beautifulsoup4

Un, lai instalētu pieprasījumus, palaidiet komandu, kas ir līdzīga iepriekšminētajai:

pipenv install requests

Kad instalēšana ir pabeigta, galvenajā failā importējiet nepieciešamās pakotnes. Izveidojiet failu ar nosaukumu main.py un importējiet pakotnes, kā norādīts tālāk:

from bs4 import BeautifulSoup
import requests
import json

Nākamais solis ir iegūt vēsturisko datu lapas saturu un parsēt tos, izmantojot HTML parsētāju, kas pieejams vietnē BeautifulSoup.

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

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

Iepriekš minētajā kodā lapai tiek piekļūts, izmantojot pieprasījumu bibliotēkā pieejamo iegūšanas metodi. Pēc tam parsētais saturs tiek saglabāts mainīgajā, ko sauc par zupu.

Sākotnējā skrāpēšanas daļa sākas tagad. Pirmkārt, jums būs pareizi jāidentificē tabula DOM. Atverot šo lapu un pārbaudot to, izmantojot pārlūkprogrammā pieejamos izstrādātāja rīkus, redzēsit, ka tabulā ir šīs klašu tabulas tabulas svītrains teksts-sm text-lg-normal.

Coingecko Ethereum vēsturisko datu tabula

Lai pareizi atlasītu šo tabulu, varat izmantot atrašanas metodi.

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)

Iepriekš minētajā kodā vispirms tabula tiek atrasta, izmantojot metodi soup.find, pēc tam, izmantojot metodi find_all, tiek meklēti visi tr elementi tabulā. Šie tr elementi tiek glabāti mainīgajā ar nosaukumu table_data. Tabulā ir daži virsraksta elementi. Lai saglabātu nosaukumus sarakstā, tiek inicializēts jauns mainīgais ar nosaukumu table_headings.

Pēc tam tabulas pirmajai rindai tiek palaista for cilpa. Šajā rindā tiek meklēti visi elementi ar th, un to teksta vērtība tiek pievienota sarakstam table_headings. Teksts tiek izvilkts, izmantojot teksta metodi. Ja tagad izdrukāsit mainīgo table_headings, varēsit redzēt šādu izvadi:

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

Nākamais solis ir nokasīt pārējos elementus, ģenerēt vārdnīcu katrai rindai un pēc tam pievienot rindas sarakstam.

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)

Šī ir koda būtiskā daļa. Katram mainīgajam tabulas_dati mainīgajam tr vispirms tiek meklēti th elementi. th elementi ir datums, kas parādīts tabulā. Šie elementi tiek glabāti mainīgā th. Tāpat visi td elementi tiek saglabāti mainīgajā td.

  10 labākie datu glabāšanas diskdziņi personīgai un profesionālai lietošanai

Tiek inicializēti tukši vārdnīcas dati. Pēc inicializācijas mēs pārskatām td elementu diapazonu. Katrai rindai vispirms mēs atjauninām vārdnīcas pirmo lauku ar th pirmo vienumu. Kods table_headings[0]: th[0].text piešķir atslēgas vērtības pāri datumam un pirmajam elementam.

Pēc pirmā elementa inicializācijas pārējie elementi tiek piešķirti, izmantojot data.update({table_headings[i+1]: td[i].text.replace(‘n’, )}). Šeit td elementu teksts vispirms tiek izvilkts, izmantojot teksta metodi, un pēc tam viss n tiek aizstāts, izmantojot aizstāšanas metodi. Pēc tam vērtība tiek piešķirta tabulas_headings saraksta i+1. elementam, jo ​​i-tais elements jau ir piešķirts.

Pēc tam, ja datu vārdnīcas garums pārsniedz nulli, vārdnīcu pievienojam sarakstam table_details. Lai pārbaudītu, varat izdrukāt sarakstu table_details. Bet mēs rakstīsim vērtības JSON failā. Apskatīsim šo kodu,

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

Šeit mēs izmantojam metodi json.dump, lai ierakstītu vērtības JSON failā table.json. Kad rakstīšana ir pabeigta, mēs konsolē izdrukājam datus, kas saglabāti json failā.

Tagad palaidiet failu, izmantojot šo komandu,

python run main.py

Pēc kāda laika konsolē varēsit redzēt tekstu Dati, kas saglabāti JSON failā…. Darba failu direktorijā redzēsit arī jaunu failu ar nosaukumu table.json. Fails izskatīsies līdzīgi šim JSON failam:

[
  {
    "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"
  },
// ...
// ... 
]

Jūs esat veiksmīgi ieviesis tīmekļa skrāpi, izmantojot Python. Lai skatītu visu kodu, varat apmeklēt šo GitHub repo.

Secinājums

Šajā rakstā tika apspriests, kā jūs varat ieviest vienkāršu Python skrāpējumu. Mēs apspriedām, kā BeautifulSoup varētu izmantot datu ātrai nokasīšanai no vietnes. Mēs apspriedām arī citas pieejamās bibliotēkas un to, kāpēc Python ir pirmā izvēle daudziem izstrādātājiem vietņu nokopšanai.

Varat arī apskatīt šīs tīmekļa nokopšanas sistēmas.