Metāllūžņi

Tīmekļa nokasīšana ar Python lūžņu moduli

Tīmekļa nokasīšana ar Python lūžņu moduli
Tīmekļa skrāpēšanas prasme šodien ir kļuvusi zeltaina, tāpēc uzzināsim, kā mēs varam iegūt nepieciešamos datus no tīmekļa lapām. Šajā rakstā mēs runāsim par Scrapy Python bibliotēku, to, ko tā var darīt un kā to izmantot. Sāksim.

Kāpēc lūžņi?

Scrapy ir spēcīga tīmekļa nokasīšanas bibliotēka, kas nodrošina iespēju zibens ātrumā lejupielādēt tīmekļa lapas, attēlus un jebkādus datus, par kuriem jūs varētu iedomāties. Ātrumam ir liela nozīme skaitļošanā, un Scrapy strādā pie tā, asinhroni apmeklējot vietnes un veicot daudz fona darbu, padarot visu uzdevumu vieglu.

Jāsaka, ka Python ir citas bibliotēkas, kuras var izmantot, lai nokasītu datus no vietnēm, taču neviena nav salīdzināma ar Scrapy, kad runa ir par efektivitāti.

Uzstādīšana

Apskatīsim, kā šo jaudīgo bibliotēku var instalēt jūsu datorā.

Tāpat kā lielākajā daļā Python bibliotēku, Scrapy var instalēt, izmantojot pip moduli:

PIP instalēt lūžņi

Jūs varat pārbaudīt, vai instalēšana ir bijusi veiksmīga, importējot atkritumus Python interaktīvajā apvalkā.

$ pitons
Python 3.5.2 (noklusējums, 2017. gada 14. septembris, 22:51:06)
[GCC 5.4.0 20160609] uz Linux

Lai iegūtu papildinformāciju, ierakstiet “palīdzība”, “autortiesības”, “kredīti” vai “licence”.

>>> importēt lūžņus

Tagad, kad instalēšana ir pabeigta, iedziļināsimies visdažādākajās lietās.

Tīmekļa nokasīšanas projekta izveide

Instalēšanas laikā ceļam tika pievienots atslēgvārds, lai mēs varētu izmantot atslēgvārdu tieši no komandrindas. Mēs to izmantotu visas bibliotēkas lietošanas laikā.

Izvēlētajā direktorijā izpildiet šādu komandu:

metāllūžņu startproject tīmekļa skrāperis

Tas izveidotu direktoriju ar nosaukumu tīmekļa skrāperis pašreizējā direktorijā un metāllūžņos.CFG fails. Iekš tīmekļa skrāperis  direktorijā būtu __tajā__.py, priekšmeti.py, starpprodukti.py, cauruļvadi.py, iestatījumi.py failus un direktoriju ar nosaukumu zirnekļi.

Mūsu zirnekļa faili i.e. skripts, kas mums veic tīmekļa nokasīšanu, tiktu saglabāts zirnekļi direktorijā.

Rakstot mūsu zirnekli

Pirms mēs sākam rakstīt savu zirnekli, paredzams, ka mēs jau zinām, kuru vietni mēs vēlamies nokasīt. Šī raksta vajadzībām mēs nokasām Webscraping vietnes paraugu: http: // example.tīmekļa nokasīšana.com.

Šai vietnei ir tikai valstu nosaukumi un to karogi ar dažādām lapām, un mēs trīs lapas izmetīsim. Trīs lappuses, pie kurām mēs strādātu, ir:

http: // piemērs.tīmekļa nokasīšana.com / places / default / index / 0
http: // piemērs.tīmekļa nokasīšana.com / vietas / noklusējums / indekss / 1
http: // piemērs.tīmekļa nokasīšana.com / vietas / noklusējums / indekss / 2

Atgriežoties pie mūsu zirnekļa, mēs izveidosim zirnekļa paraugu.py zirnekļu direktorijā. No termināla, vienkārši pieskarieties sample_spider.py komanda palīdzētu izveidot jaunu failu.

Pēc faila izveidošanas mēs to aizpildīsim ar šādām koda rindām:

importa lūžņi
 
klase SampleSpider (metāllūžņi.Zirneklis):
nosaukums = "paraugs"
start_urls = [
"http: // piemērs.tīmekļa nokasīšana.com / vietas / noklusējums / indekss / 0 ",
"http: // piemērs.tīmekļa nokasīšana.com / vietas / noklusējums / indekss / 1 ",
"http: // piemērs.tīmekļa nokasīšana.com / vietas / noklusējums / indekss / 2 "
]
 
def parse (pats, atbilde):
page_number = atbilde.URL.sadalīt ('/') [- 1]
file_name = "lapa .html ".formāts (lapas_numurs)
ar atvērtu (faila_nosaukums, 'wb') kā failu:
failu.rakstīt (atbilde.ķermenis)

No projekta direktorija augšējā līmeņa izpildiet šādu komandu:

metāllūžņu pārmeklēšanas paraugs

Atgādināsim, ka mēs devām savu SpiderSpider a klase nosaukums atribūts paraugs.

Pēc šīs komandas izpildes jūs pamanīsit, ka trīs faili ar nosaukumu page0.html, 1. lapa.html, 2. lapa.html tiek saglabāti direktorijā.

Apskatīsim, kas notiek ar kodu:

importa lūžņi

Vispirms mēs importējam bibliotēku savā vārdu telpā.

klase SampleSpider (metāllūžņi.Zirneklis):
nosaukums = "paraugs"

Tad mēs izveidojam zirnekļa klasi, kuru mēs saucam SpiderSpider. Mūsu zirneklis manto no lūžņi.zirneklis. Visiem mūsu zirnekļiem ir jāmanto no metāllūžņiem.zirneklis. Pēc klases izveidošanas mēs savam zirneklim piešķiram a nosaukums atribūts, šis nosaukums atribūtu izmanto, lai izsauktu zirnekli no termināla. Ja atceraties, mēs vadījām metāllūžņu pārmeklēšanas paraugs komandu palaist mūsu kodu.

start_urls = [
 
"http: // piemērs.tīmekļa nokasīšana.com / vietas / noklusējums / indekss / 0 ",
"http: // piemērs.tīmekļa nokasīšana.com / vietas / noklusējums / indekss / 1 ",
"http: // piemērs.tīmekļa nokasīšana.com / vietas / noklusējums / indekss / 2 "
]

Mums ir arī to zirnekļu apmeklēto vietrāžu URL saraksts. Saraksts ir jāizsauc start_urls. Ja vēlaties sarakstam piešķirt citu nosaukumu, mums būtu jādefinē a start_requests funkcija, kas dod mums vēl dažas iespējas. Lai uzzinātu vairāk, varat iepazīties ar metāllūžņu dokumentāciju.

Neatkarīgi no tā, neaizmirstiet iekļaut saitēm http: // vai https: //, lai citādi jums būtu jārisina trūkstoša shēmas kļūda.

def parse (pats, atbilde):

Pēc tam mēs paziņojam parsēšanas funkciju un piešķiram tai atbildes parametru. Kad kods tiek palaists, tiek izsaukta parsēšanas funkcija un tiek nosūtīts atbildes objekts, kurā ir visa apmeklētās tīmekļa lapas informācija.

page_number = atbilde.URL.sadalīt ('/') [- 1]
file_name = "lapa .html ".formāts (lapas_numurs)

Ko mēs esam darījuši ar šo kodu, ir sadalīt virkni, kurā ir adrese, un lapas numuru saglabājis tikai a page_number mainīgais. Tad mēs izveidojam a faila nosaukums mainīgais, ievietojot page_number virknē, kas būtu izveidojamo failu faila nosaukums.

ar atvērtu (faila_nosaukums, 'wb') kā failu:
failu.rakstīt (atbilde.ķermenis)

Tagad mēs esam izveidojuši failu un tīmekļa lapas saturu ierakstām failā, izmantojot ķermeņa atribūts atbildi objekts.

Mēs varam ne tikai saglabāt tīmekļa lapu. Bibliotēku var izmantot, lai parsētu ķermeņa.atbildi. Ja neesat pazīstams ar bibliotēku, varat apskatīt šo BeautiulSoup apmācību.

No lapas, kas jāiznīcina, šeit ir izvilkums no HTML, kurā ir mums vajadzīgie dati:

Jūs pamanījāt, ka visi nepieciešamie dati ir iekļauti div tagos, tāpēc mēs pārrakstīsim kodu, lai parsētu html.
Šis ir mūsu jaunais skripts:

importa lūžņi
no bs4 importa BeautifulSoup
 
klase SampleSpider (metāllūžņi.Zirneklis):
nosaukums = "paraugs"
 
start_urls = [
"http: // piemērs.tīmekļa nokasīšana.com / vietas / noklusējums / indekss / 0 ",
"http: // piemērs.tīmekļa nokasīšana.com / vietas / noklusējums / indekss / 1 ",
"http: // piemērs.tīmekļa nokasīšana.com / vietas / noklusējums / indekss / 2 "
]
 
def parse (sevis, atbildes reakcija):
page_number = atbilde.URL.sadalīt ('/') [- 1]
file_name = "lapa .txt ".formāts (lapas_numurs)
ar atvērtu (faila_nosaukums, 'w') kā failu:
html_content = BeautifulSoup (atbilde.ķermenis, "lxml")
div_tags = html_content.atrast ("div", "id": "rezultāti")
country_tags = div_tags.find_all ("div")
valsts_nosaukums_pozīcija = zip (diapazons (len (valsts_tags)), valsts_tags)
pozīcijai valsts_nosaukums valsts_nosaukums_pozīcijā:
failu.rakstīt ("valsts numurs : \ n".formāts (pozīcija + 1, valsts_nosaukums.teksts))

Kods ir gandrīz tāds pats kā sākotnējais, tomēr es esmu pievienojis BeautifulSoup mūsu vārdu vietai un esmu mainījis parsēšanas funkcijas loģiku.

Apskatīsim loģiku ātri.

def parse (sevis, atbildes reakcija):

Šeit mēs esam definējuši parsēšanas funkciju un devuši tai atbildes parametru.

page_number = atbilde.URL.sadalīt ('/') [- 1]
file_name = "lapa .txt ".formāts (lapas_numurs)
ar atvērtu (faila_nosaukums, 'w') kā failu:

Tas dara to pašu, kas apspriests intiālajā kodā, vienīgā atšķirība ir tā, ka mēs strādājam ar teksta failu, nevis html failu. Mēs saglabātu nokasītos datus teksta failā, nevis visu tīmekļa saturu HTML formātā, kā tas tika darīts iepriekš.

html_content = BeautifulSoup (atbilde.ķermenis, "lxml")

Šajā koda rindiņā mēs esam nosūtījuši atbildi.ķermeņa kā argumentu BeautifulSoup bibliotēkai un rezultātus piešķīra html_content mainīgais.

div_tags = html_content.atrast ("div", "id": "rezultāti")

Ņemot HTML saturu, mēs to parsējam šeit, meklējot div tagu, kuram ir arī un id atribūts ar rezultātiem tā kā tā ir vērtība, tad mēs to varam saglabāt a div_tags mainīgais.

country_tags = div_tags.find_all ("div")

Atcerieties, ka valstis pastāvēja div tagus, tagad mēs vienkārši iegūstam visus div tagus un saglabājot tos kā sarakstu valsts_tags mainīgais.

valsts_nosaukums_pozīcija = zip (diapazons (len (valsts_tags)), valsts_tags)
 
pozīcijai valsts_nosaukums valsts_nosaukums_pozīcijā:
failu.rakstīt ("valsts numurs : \ n".formāts (pozīcija + 1, valsts_nosaukums.teksts))

Šeit mēs atkārtojam valstu stāvokli starp visiem valstu tagiem, pēc tam mēs saglabājam saturu teksta failā.

Tātad teksta failā jums būs kaut kas līdzīgs:

valsts numurs 1: Afganistāna
valsts numurs 2: Ālandu salas
valsts numurs 3: Albānija

Secinājums

Scrapy neapšaubāmi ir viena no visspēcīgākajām bibliotēkām, tā ir ļoti ātra un būtībā lejupielādē tīmekļa lapu. Pēc tam tas ļauj jums brīvi izvēlēties visu, ko vēlaties, izmantojot tīmekļa saturu.

Mums jāatzīmē, ka lūžņi var paveikt daudz vairāk, nekā mēs šeit esam pārbaudījuši. Ja vēlaties, datus varat parsēt, izmantojot Scrapy CSS vai Xpath selektorus. Jūs varat izlasīt dokumentāciju, ja jums ir jādara kaut kas sarežģītāks.

Cīņa par Vesnota apmācību
Cīņa par Vesnotu ir viena no populārākajām atvērtā koda stratēģijas spēlēm, kuru jūs varat spēlēt šajā laikā. Šī spēle ir izstrādāta ne tikai ļoti ilg...
0 A.D. Apmācība
No daudzajām stratēģijas spēlēm 0 A.D. izdodas izcelties kā visaptverošs nosaukums un ļoti dziļa, taktiska spēle, neskatoties uz to, ka tā ir atvērtā ...
Unity3D apmācība
Ievads Vienotībā 3D Unity 3D ir spēcīgs spēļu izstrādes dzinējs. Tā ir pārrobežu platforma, kas ļauj izveidot spēles mobilajām ierīcēm, tīmeklim, gald...