>> [Muziek]
ROBERT KRABEK: Hallo, jongens.
Mijn naam is Robert Krabek en Ik zal onderwijzen u guys
hoe het web schrapen met Nokogiri, een Ruby bibliotheek
en Kimono, dat is een Chrome-extensie.
>> Dus eerst is er een paar dingen die je
kan doen of misschien je bent geweest doet al het psets dusver
en uw werkruimte is een beetje vol.
We kunnen eigenlijk alleen maar gaan maak een nieuwe werkruimte voor u
gewoon een gloednieuw project te doen.
Dus als je wilt blijven werken in de CS50 template ID
dat u op dit moment, voel je vrij, en u kunt gewoon
Nokogiri installeren met CFLAGS equals-- gem installeren nokogiri.
Maar anders zal ik je laten zien hoe je een nieuw op te zetten.
En dan is dit in wezen dropping meer zijwieltjes.
En je bent codering alsof u net codering in Subliem of zoiets.
Dus als we verschuiven het over.
>> Dus zeggen dat dit je huidige CS 50 ID.
U kunt gewoon naar Cloud9 hier.
U kunt naar uw dashboard.
Het moet brengen tabblad werkruimten.
En dan kun je gewoon klikken hier, een nieuwe werkruimte.
Noem uw nieuwe werkruimte, misschien test, of schrapen.
En klik hier deze gewoonte tab, in plaats van het tabblad CS50 sjablonen.
En dan kun je gewoon gaan en het creëren van een nieuwe werkruimte.
>> Ik heb al een werkruimte hier.
Dus we zullen werken met deze.
En als je een nieuw aangemaakt werkruimte dus met het tabblad Aangepast
je kunt gewoon typen gem installeren nokogiri, die hier niet gaat.
OK, het is een beetje bevroren.
Maar u kunt typen gem installeren nokogiri.
En dat zou alles zijn dat is de installatie.
>> Zoals ik al zei, als je nog steeds werken in je CS50 template ID,
je hoeft alleen maar te typen CFLAGS evenaart gem installeren nokogiri.
En ik heb al geïnstalleerd hier dus ik zal dat niet doen.
Maar voor die volgende langs, voel je vrij om dat te doen.
>> Dus als je eenmaal hebt je Nokogiri werkruimte of bibliotheek geïnstalleerd,
Ik ga je een beetje van een spoedcursus in Ruby syntax
omdat Nokogiri is een Ruby bibliotheek.
Dus je moet weten een aantal fundamentele Ruby syntax voor het werken met Nokogiri.
Dus een aantal fundamentele verschillen van wat je gewend bent
misschien als je hebt gewerkt dusver in slechts C en PHP,
verklaart u variabelen zonder type.
Je hoeft geen puntkomma's gebruiken, dat is een soort van een opluchting.
Er is geen haakjes nu ongeveer voor of tijdens loops, bijvoorbeeld.
Je hebt gewoon een blok van de code, en dan zet je einde aan het einde van dat.
Er is geen plus plus of min min, dus gewoon
dat wanneer je doet voor loops,
gewoon gelijken plus en min gelijk.
En in plaats van hash omvatten, je zult gebruiken nodig en dan
wat bibliotheek proberen laden in uw programma.
>> Ruby is niet een gecompileerde taal.
Dus dat is een opluchting.
Het is meer vergelijkbaar met PHP, waar het is een geïnterpreteerde taal.
U kunt elke Ruby script dat schrijf je met Ruby gevolgd
door de naam van uw script of programma.
Aan te geven dat het een Ruby programma, je gewoon eindigen met .RB in plaats van .c.
Er zijn variabel sized arrays in Ruby,
dat is super handig als u bent schrapen en misschien wilt toevoegen
gegevens die u hebt geschraapt in een array.
Je hoeft niet naar een nieuwe array malloc en Kopieer de oude serie in de nieuwe array.
Je kunt gewoon voegen met de twee pijl tekenen.
En er zijn geen tekens, is er slechts één letter snaren.
Dus dat moet een beetje gemakkelijker.
>> Dus we zullen gewoon je sommige geven voorbeelden van een aantal fundamentele Ruby syntax.
Dus hier kun je dat in plaats van te zien de slash slash, te reageren in Ruby,
je gewoon gebruik maken van de hekje.
En variabele verklaring u typt u de variabele gelijken
wat je wilt het variabel te zijn.
Ze kunnen strings.
U kunt array, hebben die je vullen met waarden.
puts en prenten zijn vergelijkbaar.
Voor onze doeleinden, de enige verschil is echt
dat stelt, wat staat voor zet, maar zet een nieuwe lijn
teken op wat u afdrukt.
>> Dus als we een kleine demonstratie hier,
we kunnen lopen deze met-- opent een nieuwe terminal.
U kunt al deze te zien bestanden die zijn in mijn terminal.
En als ik het alleen nog maar Ruby, Ruby intro.rb het
steekt vijf Hallo Mather, Quincy, Carrier.
Adams.
Dus dat is alles wat er is te verklaren arrays.
PUBLIEK: Robert, kunt u lettertype een beetje groter?
ROBERT KRABEK: Ja.
En ik kan inzoomen, want je kunt niet inzoomen op terminal fonts blijkbaar.
>> Dus dat is hoe u afdrukt variabelen om uw terminal.
U kunt ook gebruik maken variabelen in een string.
Zo kort geleden in PHP, je zou kunnen hebben geleerd
dat er snaar interpolatie.
Dus als je hier een kijkje nemen, als ik verklaren drie variabelen, naam, bibliotheek,
en taal, en ik zet, I schrijf een string, Hallo mijn naam is.
En dan in plaats van de PHP versie van de string interpolatie
die ziet er een beetje meer als dit, heb je een hekje, en vervolgens
een accolade, en vervolgens de naam van de variabele.
En dat is hoe je zou afdrukken, zeggen: ongeacht de naam van de variabele is.
>> En dan kunt u ook aaneenschakelen strings.
Ruby maakt het super gemakkelijk met het plusteken.
Je hoeft alleen maar één snaar links plus een variabele
of een andere string en een string.
Dus als ik print deze uit, het moet gewoon zeggen Hallo, mijn naam is Robert.
Ik zal onderwijzen u nokogiri in Ruby.
>> En laten we gewoon bevestigen dat is inderdaad de case-- robijn intro.
Hallo, mijn naam is Robert.
Ik zal onderwijzen u nokogiri in Ruby.
>> Moving on, als andere verklaringen, het is een beetje anders
van wat je zou kunnen worden gebruikt om Als je hebt gewerkt in C.
U hoeft niet de haakjes nodig.
U niet de accolades nodig.
En in plaats van else if, het is een aaneengeschakelde elsif.
Dus hier, als ik heb verklaard x up hier, zoals we kunnen zien, is nog steeds 5 x.
Dus als x minder dan 3, zal het kleine zetten.
Als het minder dan 7, medium, anders groot.
Dus 5 is een medium getal.
En ik eind dit blok code met einde.
>> Hier is mijn lus.
En deze syntaxis ook een beetje anders.
De 0 tot vijf gewoon hoofdzaak is te verklaren een arrays van 0-5.
Er is dus vijf gleuven in de array.
En daarna voor elke sleuf, dat array, zal ik verhogen i.
Zo moet deze druk 0-5 of 0-4.
En dit moet medium afgedrukt.
>> En ik zal gewoon blaze door.
Jullie zullen toegang hebben deze code later.
Dus jullie kunnen deze zelf uit te voeren.
>> Dus dit is je basis, terwijl lus.
Dit zal gewoon afdrukken j, verhogen met 1 tot we hit 5.
>> Super snel Ruby spoedcursus over hoe een functie te schrijven.
In plaats van, zeg, int factoriële nummer, we hebben gewoon def.
En in wezen je bent definiëren van een functie in.
Dit gaat het worden naam van de functie,
en dit is van variabelen die u wil overgaan in de functie.
U kunt als verklaringen binnen te hebben.
U kunt terugkeren.
In dit geval zijn we definieert een recursief
geïmplementeerd faculteit-functie.
Dus we gewoon bellen functies in Ruby als deze.
>> Dus als ik heb dit, ik gedefinieerd kan faculteit noemen, pas in 3,
en 3 zal het aantal variabele die ik kan gebruiken in de functie.
En dit to_s is gewoon het draaien van de waarde van de faculteit terug in een string.
Anders zal dit gooien een fout zeggend oh, ik
kan een string-- niet afdrukken want zoals u herinneren,
puts wordt string-- gezet omdat deze factorieel een aantal teruggekeerd.
Dus we kunnen zetten dat een string als zodanig.
En omgekeerd, dan kunt u ook converteren een string naar een integer met to_i.
>> Dus het maken van alles super simpel, als ik dit alleen maar commentaar, opslaan
en uitvoeren van de faculteit-functie.
We moeten in staat zijn om te zien dat de faculteit van 3 is 6.
En dat is inderdaad waar.
>> Dus dat is uw crash cursus in Ruby.
En nu dat je weet Ruby, kunnen we verder gaan om de basis Nokogiri schrapen opgezet.
In wezen alles wat je hoeft te doen is, Ruby, vereisen de bibliotheken.
En voor onze doeleinden zullen we met behulp van de bibliotheek OpenURI evenals Nokogiri.
En dan wat je doen-- en het zal geven u de syntaxis voor dit--
is dat je de URL veel te openen als je zou in krul verzoek, dat een C URL.
>> Zodat je de URL van de te nemen de website in kwestie.
Je opslaan in een variabele.
En dan kun je zoeken door dat variabele unieke HTML-tags gebruiken
de .css commando.
En dan kun je de uitgang van de inhoud aan waar u maar wilt.
U kunt starten in een database.
U kunt de output in een file, of zelfs alleen maar af te drukken op het scherm.
>> Dus laten we u zien een basis schraper.
Dus hier kun je zien dat we hebben vereisen nokogiri, vereisen open uri.
Uw basis set-up, laten we noem het document of doc,
evenaart Nokogiri :: HTML geopend, dat is de commando door de OpenURI aan ons heeft
bibliotheek.
En we zullen op zoek gaan, voor die van u die in de quad zou wonen,
voor fietsen die in Boston opgesomd op de fiets sectie Boston Craigslist
website.
>> Dus als je niet bekend bent met krul, zal ik gewoon
laten zien echt snel wat cURL zal doen.
Als ik wilde alles van de URL te krijgen van de Craigslist site, als ik typ krul,
het gewoon dumpt alle URL van de Craigslist fiets website
op mijn terminal.
Dat is niet bijzonder handig omdat ik niet
handmatig wilt gaan door en vind het wat ik zoek.
Maar gewoon zodat u kunt zien dat ik eigenlijk
met behulp van de juiste code, als je kijkt op de URL voor Craigslist in bikes--
om wat voor reden het is niet gevonden.
Als je kijkt naar deze pagina en je kijkt naar de URL,
Dit dient identiek te zijn aan het cURL verzoek dat ik net te sturen.
En inderdaad, dat is wat het zijn opgeslagen in de doc variabele.
>> Dus als je terug naar onze code, we kan dan werken op dit doc variabele
met behulp van CSS.
Dus zeg ik wilde al krijgen de tags die span.txt zijn,
en alle een-tags binnen die tag.
En waarom zouden we willen dit doen, ik hoor je huilen?
>> Als we Inspecteer Element, het geeft je een geeft uitsplitsing hoe de URL wordt opgebouwd.
Als ik naar beneden scrollen door middel van Hier kunt u zien
wat elk van deze verschillende elementen vertegenwoordigt.
Dus misschien wil ik toegang dit specifieke element.
Dus ik ben met behulp van Chrome developer tools waarmee Inspect Element.
Ik kan hier beneden zien dat dit is een tag binnen een tijdsspanne
tag met een klasse van txt.
>> Dus dit krijgt om onze eerste handeling die
is doc.css spanwijdte, dat is de tag die Ik ben op zoek naar binnen al deze URL.
En dan werkt .txt net als CSS doet wanneer je net het schrijven van CSS
in uw HTML-bestanden het opgeven van een klasse.
Dus deze bijzondere exploitant zal geef een overspanning tag met klasse van txt.
En dan als ik een ruimte te laten, Dit gaat dan binnen die tag
en dan vinden een een tag binnen die.
>> Dus als ik dit alleen maar om te zetten de terminal, moet ik
in staat zijn om in wezen alles te zien dat is binnen dit tijdsbestek van klasse txt.
Dus we zullen geven dat een gaan.
ruby craigslist-schraper.
En inderdaad, dat geeft ons al deze tags van de verschillende aanbiedingen die
zijn op Craigslist pagina.
>> Dus als we terug gaan, kunnen we deze draaien in iets meer bruikbaar.
Misschien willen we gewoon de links.
Want binnen deze tag, zal ik ook de hyperlink van het pad
die deze pagina gaat.
Dus als je kijkt naar deze code hier, wat ik ga doen is in plaats van CSS,
Ik kan gaan at_css.
En dit zal gewoon de eerste element van al die dingen.
Dus als ik om dat te doen in de code ik eerder aangetoond,
in plaats van terug te keren alle dit, het zou gewoon
de eerste van die terugkeren.
Dus dat is hoe het at_css operator werkt.
>> Dus we willen het op te slaan pad gehele eerste een tag.
En omdat ons a-- geven dus we zijn nog steeds te .css gebruiken.
Maar omdat dit gaat geven ons weer een hele reeks van labels,
we gaan de toegang het eerste element.
Dus dit is een andere manier die u kunt toegang tot een bepaald element als je
een reeks elementen die wordt geretourneerd,
omdat je iets kan behandelen die .css keert terug als een array, wezen.
En dan gaan we de toegang hypertextverwijzing attribuut van dit.
>> Dus als je een kijkje nemen, indien je keek hier echt dicht,
als je gewoon wezen kijken naar de URL-balk,
Dit is het pad dat je gaat te schrapen.
Dus als we alleen deze opnieuw uitvoeren, en ervoor zorgen dat we hebben het gered.
U kunt thuis te controleren.
Dit past eigenlijk met deze link.
>> Dus waarom zouden we dit willen gebruiken?
Als u wilt schrapen de pagina en het heeft
een pagina met links, zoals Craigslist doet, je
Misschien wil je dan gaan in elk van deze banden
en vervolgens schraap de inhoud van die, welke
is precies wat we gaan doen.
>> Dus als je eenmaal weg als variabele, ik niet meer echt
zorg over het afdrukken van het uit.
Ik moet gewoon op te slaan als een variabele.
En dan kan ik een andere toegang pagina op dezelfde manier ik toegang
doc in de eerste plaats.
Tenzij met de URL, we gaan string interpolatie
zoals ik beschreef in Ruby eerder te voegen
het pad naar het einde van de wortel.
>> Dus wat dit gaat doen is dit gaat op de weg te zetten
dat ik eerder geschraapt en dan dat
in een nieuw item, wat je wilt noemen het-- first_listing, bijvoorbeeld.
Maar ik ga om te vertrekken het op punt voor nu,
want dat is wat ik hier gebruikt.
>> Dus zeg ik wilde de beschrijving krijgen van de eerste detachering in Craigslist.
Dus ik zou hier beneden te gaan.
Ik zou op Inspect Element opnieuw, omdat dit de beschrijving.
Ik zou hier beneden gaan en te zien als ik kan vinden hoe ik zou
in staat zijn om te zoeken naar deze unieke tag.
En in dit geval, heeft een ID, die ons leidt
naar onze volgende manier van zoeken naar labels, die met een hashtag.
>> Dus voor de klassen, kunt u gebruik maken van de puntoperator.
Dus .txt specificeert een klasse van txt, terwijl de hash specificeert een ID.
Dus in dit geval, de tag is sectie, en de ID is postingbody.
>> Dus dit gaat en vindt de first-- omdat we
gebruik at_css-- dit gaat en vindt het eerste element dat
komt met de tag van de sectie en de ID van postingbody.
En dan kun je toegang krijgen tot de tekst element van dat punt terug met .text.
En dan kunnen we opslaan die in de beschrijving.
>> Dus nu hebben we een variabele beschrijving,
we kunnen doen, laten we zeggen, file I / O. Dus file I / O in Ruby
is zeer vergelijkbaar met file I / O in C, waar we een bestand te openen.
We kunnen schrijven.
En dan zullen we dat bestand te sluiten.
>> Dus hier zijn we gewoon de naamgeving van de bestand, een aantal willekeurige variabele.
We zouden ook hebben alleen deze zet hier.
We hebben een variabele die we opslaan de open bestand met File.open.
En we schrijven naar dit bestand, dus we openen het met de w operator.
En dan zetten we string in de bestand met de .puts operator.
En dan zetten we de variabele die we wilt schrijven naar het bestand binnen die.
En dan hebben we net sluit het bestand.
>> Dus als we doorgaan en uitvoeren van deze, dit moet een document
met description.txt die zal hebben deze beschrijving daarin.
Dus als ik zonder het-- niet.
Het produceerde een tekstbestand met, hopelijk hetzelfde.
Dus er kan een nieuwe posting geweest dat is gekomen, terwijl ik heb gesproken.
En inderdaad, het lijkt erop dat er is geweest.
Dus als we naar deze klassieke fiets, 1962-1966, dat lijkt te passen.
En daar ga je.
>> Dus dat is de meest elementaire functionaliteit van schrapen.
We konden plaats hebben van gewoon schrijven naar dit bestand,
kunnen we de dingen toe te voegen aan een array.
Dus als ik verklaar drie arrays, titel, prijs en omschrijving.
En we werken nu op de doc punt.
We kunnen gaan door en vind alle span.txt.
En vergeet niet, dit geeft een array van alle items die het vindt.
En vervolgens in Ruby, dan kunt u gewoon gebruik maken van .Elke te doorlopen elk item
van de matrix.
En dan voor elk item, Ik ga gewoon om het te noemen
een link, want dat is in wezen wat het is.
>> Dus als ik elke link.css dot a.hdrlnk, Dit is in feite gaat om de link
en het vinden binnen die verwijzen andere HTML-element en de bijbehorende klasse.
Dus als we nog wat Dit was de span.txt,
u kunt zien- laat me gewoon terug echte quick-- binnen span.txt
we hebben veel van de andere klassen.
Dus binnen span.txt, zijn wij op zoek voor een tag met een klasse hdrlnk.
Dus laat ik vind gewoon dat voor jullie echt snel.
>> Zodat je hier kunt zien, is dit een een tag dat is binnen de spanwijdte van klasse txt
dat heeft de klasse hdrlnk.
En dat is inderdaad wat we proberen te krijgen.
>> Dus hebben we nu proberen om alle slaan van die links in de titel.
En dan gaan we om af te drukken uit elk van deze banden.
Nee sorry.
We gaan om uit te printen de prijs van elk van deze.
Dus laten we lopen dit werkelijk snelle en zie wat het doet.
>> Dus dit gewoon eigenlijk ging door elk van de verbindingen
op zijn beurt, toegankelijk het label in kwestie, en dan trok de prijs.
En het deed dat, omdat na heb je alles in de titel,
we hebben net opgeslagen de titel daar.
We hebben net opgeslagen op de link binnen de array titel.
En in deze lus operatie, waar in plaats van naar a.hdrlnk,
we zijn op zoek naar een span.price.
Dus als ik kan gewoon echt snel de prijs, als je het element te inspecteren,
je zult zien dat het een overspanning met de klasse van de prijs.
En dat is in wezen hoe krijgen we de prijs daar.
>> Dus dat is het echt fundamentele geval van schrapen.
Dat is hoe je alle de elementen op een pagina
dat, zeg, weet je al de URL van.
>> Dus als we willen krijgen beetje meer in de diepte,
kunnen we pagina's binnen pagina's te schrapen.
En voor dit voorbeeld, zal ik zijn het uitvoeren van een CSV-bestand.
Dus ik ben die csv hier omdat Ruby niet, binnen zelf,
hebben de functionaliteit gewoon uitgang CSV-bestanden.
Dus dat is super eenvoudig.
Laat me gewoon naar de volgende.
Wij vallen file I / O. Dus dit is vergelijkbaar met hoe het in C.
En voordat we overgaan tot Kimono, Ik zal gewoon laten zien hoe erg snel
naar sites binnen bezienswaardigheden schrapen.
>> Dus we al geleerd hoe arrays verklaren Ruby.
Dus ik ben gewoon waarbij een stelletje willekeurige arrays
dat ik zal het opslaan van gegevens binnen.
doc werkt op dezelfde manier net als in het vorige bestand.
We gaan in het vinden elke span.txt's.
We weten al dat.
Dat is de houder waarin elk koppeling heeft alle gegevens die we willen.
>> Dus hier wat we doen is voor elk koppeling van span class txt, we gaan in
en we vinden het een tag, het vinden van het eerste element van.
Vergeet niet, .css geeft een array, dus je kunt niet alleen toegang tot het als het is.
We gaan naar het eerste element te vinden.
Ook al is het een serie van één punt, moet u deze syntaxis gebruiken,
en trek het href attribuut.
>> Dus we hebben dit eerder.
Dus dit moet vertrouwd kijken.
En nu hebben we een array riep paden van al onze links
dat gaan we willen gebruiken.
Dus als we deze array van alle van de paden die we willen gebruiken,
We kunnen dan een item voor elke creëren van die pagina's wanneer we open die pagina.
Zo zagen we ook op de syntax voor, waarbij
doet snaar interpolatie met het pad hier, zodat de syntax is alleen voor pad.
En ik kon deze naam variabele elke willekeurige naam.
>> Dit is de belangrijkste.
Dit is de array die u zult zijn toegang tot elk element.
Maar als je zeggen pad in wegen, Dit betekent dat voor elk element in de paden,
noem het pad, en dat gebruiken.
Dit is in wezen zoals wanneer je doe een lus en u int ik gebruik.
Dus je kunt het pad als de te behandelen variabele dat is het verhogen.
>> En vervolgens voor elk van deze, gaan in elk van deze banden.
Omdat we deze opslaan in punt pagina, dus we zijn het creëren van een nieuwe pagina elke keer
We openen het.
En vervolgens binnen dat nieuwe pagina, vind span.postingtitletext, span.price,
en dan sectie # postingbody.
We hebben al gedekt sectie # postingbody toen we gekeken naar de beschrijving.
>> Dus we kunnen gaan zien in de Craigslist post, als je gewoon op zoek bent naar de titel,
je kunt het hier zien up, overspanning postingtitletext.
En dat is waarom het er is.
En dan voor de prijs, kunt u toegang tot het met span class van de prijs.
>> Dus we misschien ook zou kunnen willen de URL te slaan.
Dus we alleen deze run nogmaals, op te slaan in een array,
want als je op zoek bent op Craigslist, je bent
waarschijnlijk gaat om een ​​manier te willen, als zie je iets dat je interesseert,
ga terug naar die site.
Dus je wilt opslaan de URL naar referenties sake.
>> Dit is slechts in wezen andere syntaxis voor de lus.
Ik kon gewoon niet paths.each plaats voor pad in wegen met index.
En deze syntax is Ruby voor-- pad is wat we deden hier boven,
waarbij een variabele voor elk item.
En de index zich gedraagt ​​als de i in C voor lussen.
Zodat je kunt bijhouden wat de index.
>> Dus hier is slechts een beetje handig ding
voor als je gebruik maakt van de schraper.
Als je schrapen honderden pagina's, om ervoor te zorgen dat het niet opknoping,
het zal gewoon output, Ik ben de toegang tot deze pagina
en ervoor te zorgen dat het is nog steeds voort.
Maar voor onze doeleinden, omdat er is een honderd punten,
Ik ga om slechts drie van hen zodat we niet de tijd om hier.
>> Maar voordat we dat, ik ben gewoon ga je echt snel te laten zien,
Ik zal het uitvoeren van de titel, prijs, beschrijving en URL
van elk van de links die ik heb geschraapt.
En dan is dit nog maar het syntaxis voor het CSV-bibliotheek.
U opent een CSV.
Dit is wat ik ga noemen.
Open het met write do.
En dan wordt het CSV-bestand zijn dat je bent het invoeren van alles in.
Dit is slechts een sanity check voor me om te weten dat het draait.
En dit is mijn sanity check te weten dat het voltooid.
Dus ik ben om de titel in een rij in CSV, prijs, url, beschrijving,
allemaal in rijen in het CSV.
>> Dus als we gaan en uit te voeren dit now-- en ik
ervoor zorgen dat ik het-- hebt opgeslagen plaats van slechts uitvoeren naar de terminal,
we een CSV moeten hebben bestand dat is geproduceerd.
Dus hier kunnen we de CSV zien bestand dat is geproduceerd.
Dit is de uitgang van de scape dat ik net liep.
Zoals je hier kunt zien, Toegang tot pagina 0, 1, 2, 3.
Dit zijn de titels, prijzen, beschrijvingen.
En als we kijken naar deze CSV bestand dat we hebben gegenereerd,
je kunt zien hier zijn uitgevoerd.
Dit is niet van Excel, dus het is niet geformatteerd in rijen en kolommen.
Maar je kunt je voorstellen hoe het zou kunnen worden opgemaakt.
>> CSV staat voor komma's gescheiden waarden.
Dus je kunt voorstellen dat dit misschien een rij zijn.
En elke comma zou geven een aparte kolom.
Gewoon een woord van Voorzichtig- soms moet je bent
schrapen dingen met veel komma's.
Dus als je het uitvoeren het naar een CSV-bestand,
het misschien niet de output van de manier waarop je zou denken.
>> Dus dat is in wezen alles er te schrapen eenvoudige HTML-
pagina's met Nokogiri.
>> Dus internet wezen innovatief als het omhoog is gekomen
met een geautomatiseerde en GUI versie, zij het minder robuust
versie van schrapen verschillende websites.
En voor onze doeleinden Ik zal demonstreren
een Chrome-extensie genaamd Kimono.
En alles wat je hoeft te doen is je navigeren naar de pagina die u wilt schrapen.
U klikt op een veld van belang.
U kalibreert de velden, want het zal automatisch
detecteren wat het denkt u wilt worden schrapen,
en dan moet je gewoon zorgen voor een API.
>> Dus als we waren om het op te demonstreren Craigslist, het zou eigenlijk niet werken.
En dit is wat ik terug zou gaan zegt over dat het niet zo robuust.
Het heeft problemen met het maken van de API.
Maar als een demonstratie van wat het zou doen,
Als u de Chrome-extensie te installeren, alles wat je doet is je er op klikt.
Het Kimonofies de pagina, en dan moet je klik op de wat je wilt script.
>> Dus als ik klik op dat zou het hoogtepunt
wat het denkt dat ik wil zijn afschrapen die pagina.
Dus misschien noem ik deze aanbiedingen.
Dit is hoeveel items die ik heb geselecteerd.
En ik kan bevestigen of ontkennen wat van de andere voorgestelde lijsten
om deze toe te voegen aan wat zal worden geschraapt.
>> Dus nu kunnen we zien dat er honderd items geselecteerd.
Als ik wil een ander veld hebben dat ik wegvagen die voor deze,
zeggen dat ik wil om de prijs te schrapen als goed, dan kan ik hetzelfde doen.
>> Dus hier is een demonstratie van hoe het is veel minder robuust, want nu is het
oppakken van de stad plaats van alleen de prijs die ik wil.
En nu is het opgepikt 200 dingen.
U kunt terug gaan en te verwijderen.
U kunt het opnieuw proberen.
Maar geen garanties.
Dit is hoe het werkt soms.
Zoals u hier ziet, nu zegt het 96 hier.
Het meeste van de verbindingen opgehaald dat u wilt schrapen, maar niet
noodzakelijkerwijs allemaal.
>> Een ander nuttig instrument van Kimono al is kunt u naar Geavanceerde functies
hier, ga naar Advanced en het zal je laten zien
de afbraak van de unieke manier om de HTML
tags die je wilt schrapen.
Dus voor aanbiedingen, als je kijkt naar hier, Als u toegang div p overspanning bestrijken een,
je kunt eigenlijk gewoon gebruik dit in uw Nokogiri code
waarin voordat we hadden span.txt toegang tot elk van de aanbiedingen.
Als ik de tekst wil gewoon binnen de lijsten,
Ik kon ingang div ruimte p ruimte overspanning ruimte spanwijdte van een ruimte,
en het zou hetzelfde effect te bereiken.
En voor degenen onder u die geïnteresseerd zijn in het gebruik van reguliere expressies,
het gebeurt ook geven u de regelmatige expressie soort touw om input
om de dingen te vinden je probeert te vinden.
>> Dus er is nog een leuke functie van Kimono, waar u kunt pagineren,
die niet alleen ik schrapen de resultaten van deze pagina
Ik kan u op dit kleine hier button, paginering,
geef de knop die zou neem me naar de volgende pagina,
en dan zal het gewoon weten dat het kan herhalen naar de volgende pagina,
en dan al the-- zolang schrapen want het is het zelfde formaat van course--
scape al die banden ook.
>> Dus omdat Kimono niet wil werken met Craigslist, wat we gedaan hebben
is Ik heb Kimonofied de Harvard Crimson.
Ik heb trok een aantal van de soort top aanbevolen artikelen, bevestig hier.
Stel dat al deze.
Ik heb deze API gecompileerd voor u van tevoren.
Maar anders wat u zou doen is dat je zou gewoon op Gereed.
Voer uw API details.
Zet hem om ofwel automatische of handmatige kruipen.
Dus je zou kunnen werken en uw gegevens elke 15 minuten,
wekelijks, dagelijks, wat je wilt.
Noem uw API.
Maak de API.
Voor uw voordeel, ik heb gemaakt van de Crimson voorpagina API al.
>> Dus je gewoon zorgen voor een aanspreken op Kimono, en het
zullen al uw API's voor u opslaan.
Dus in wezen, dat is allemaal jouw aparte verschillende schaafwonden.
>> Dus als we hier kijken, dit is de adviezen links die ik heb verzameld.
Dit zijn de aanbevolen links die ik heb verzameld.
En dit zijn de meest gelezen links die ik heb verzameld
van deze meest recente API scape.
>> Dus als je hier kunt zien, Deze zou de aanbevolen,
deze zouden de adviezen, die in dit voorbeeld
Ik heb ze allemaal gecombineerd in één collectie.
Maar als je gewoon rond spelen met het een beetje, kunt u het opsplitsen
en verdeel het op hoe u wilt zo lang
zoals de opmaak is iets anders.
>> Gewoon rond te spelen met deze, de crawl opgericht, een van de nadelen
is kunt u alleen kruipen tot 25 pagina's tegelijk.
Dat is één van de beperkende factoren.
Maar hier, als u het handmatige kruipen, dit
is hoe je het kan vertellen om uw gegevens bij te werken.
En hier kunt u uw crawl geschiedenis zien van alles wat je hebt doorzocht.
En jullie terug kunt gaan, aanmelden, spelen met alle verschillende manieren
die u kunt aanpassen en gebruiken van uw gegevens.
>> Kimono kan worden ingesteld om schrapen links binnen koppelingen.
En zou je dat doen door eerst schrapen een lijst met links,
en vervolgens met behulp van dat API als jump off point voor een andere API
dat u het script te maken.
Maar dat is ingewikkelder dan wat we gaan krijgen in vandaag.
>> Dus dat is Kimono.
We praten over de voors en tegens van Nokogiri en Kimono.
>> Nokogiri, het is echt snel.
Het is makkelijk om te testen.
Je kunt gewoon zet iets te console, eenvoudig te configureren.
U kunt zelf bepalen wat u wilt schrapen en op te slaan.
Er zijn geen pagina grenzen.
Ik heb eigenlijk gebruikte het te schrapen, zoals 1800 Zuid-Afrikaanse scholen websites
voor e-mails voor een stage die ik deed.
>> Dus dat is mogelijk, maar de beste praktijken zou zijn om te splitsen het script.
Want als het niet lukt, dan je niets te krijgen.
Maar als je een honderd, misschien 200 pagina's tegelijk,
dan heb je een kans van ten minste krijgen van het stukje bij beetje, in het bijzonder
als je slechte internet.
>> Helaas kan alleen schrapen HTML.
Dus als je dynamisch geladen pages--
en ik zal je een voorbeeld zien als Kayak in een second--
Nokogiri helaas kan niet schrapen dat.
>> Kimono, maar is ook gemakkelijk te gebruiken.
Zoals je zag, het is in wezen een punt en klik.
Het kan schrapen JavaScript.
Helaas, er is een maximum hoeveel pagina's u kunt schrapen.
Soms is het een beetje moeilijk te configureren.
Het wordt in de war.
Maar het is zeker iets om te overwegen
als je niet proberen om een ​​hebben super robuust onderhoudbaar schrapen.
Als je gewoon wilt krijgen alles uit van een pagina snel,
dan Kimono is een echt goed hulpmiddel om te gebruiken.
En zoals ik al eerder zei, is er de geavanceerde functie van Kimono
dat laat zien hoe u toegang tot unieke HTML
element, die super handig zelfs als je werkt in Nokogiri.
>> Dus als we naar de Kayak website, Zo kunt u daar zien is--
of misschien kun je niet zien.
Maar als ik u de URL van Kayak, Dit is eigenlijk gewoon de bron URL.
Dit is de URL alvorens te worden gewijzigd door wat JavaScript-scripts
dat ze aan de hand.
En het gaat er anders uitzien van het inspecteren van het element.
>> Dus als je door te gaan en je overeenkomen met de Inspect Element
code om de broncode, het is daadwerkelijk gaat om anders te zijn.
En dit is in wezen de reden waarom Nokogiri kan niet schrapen dynamisch geladen sites.
Omdat Nokogiri is schrapen de bron URL,
terwijl Kimono is eigenlijk schrapen wat je in wezen bent
seeing in Select Element.
>> Dus als ik ga door en ik proberen en Kimonofy Kayak,
Ik kan eigenlijk gaan door en selecteer de prijs.
Het is een beetje moeilijker, en in dit geval is
eigenlijk het zien van deze prijs als verschillend van deze.
Dus terwijl u kunt configure-- of als dit niet dynamisch geladen,
je zou Nokogiri configureren al deze items.
>> Omdat de opmaak is iets verschillend voor deze aanbieding
als het wordt vergeleken met de rest van hen, en je kunt hier zien
het is eigenlijk verdwenen en geselecteerd alle prijzen van vluchten het.
Misschien wil ik om te selecteren tijd van de vlucht ook.
En ik kan gaan door en soort configureren dat.
Ik wil dat niet.
Ik wil gewoon de tijd van de volgende vlucht is.
En dan na een paar van deze doormaakt, krijgt het beeld.
Dus Kimono's behoorlijk slim.
Het is gewoon niet zo robuust.
>> Er zijn een aantal andere alternatieven die u kunt gebruiken.
En ik zal je ze hier laten zien.
Als u meer comfortabel in Python in plaats van Ruby misschien,
er is een bibliotheek genaamd Beautiful Soup.
U kunt gebruiken.
Het is zeer vergelijkbaar met Nokogiri.
Het heeft een paar meer functies.
U kunt een HTML-tag te vinden en vervolgens omhoog of zijwaarts bewegen.
>> Er is PyQt.
Dit kan eigenlijk schrapen dynamische sites, want het is een soort van
is een WebKit die pretendeert te zijn een browser zonder daadwerkelijk
wordt een browser.
Zo zou wachten tot alle JavaScript om eerst te laden, en dan
gaan en probeer en schraap de site.
>> Als je wilt aan de stok met Ruby, je kan een niveau uit Nokogiri gaan.
U kunt Capybara gebruiken een Poltergeist wrapper.
En dit kan eigenlijk in wezen hetzelfde doen
als PyQt, dat is het een WebKit.
Het wacht op de JavaScript om eerst te laden.
Als je knoeien met het genoeg, je kunt zelfs krijgen om te klikken op de dingen.
>> Dus als er een link die is niet een klassieke href waarbij
het pad is gemakkelijk te bereiken, en het is wat JavaScript ding dat detecteert
een klik, kun je eigenlijk doen.
De meer populaire bibliotheek een gebruiker simuleren
is in JavaScript, dat is PhantomJS.
Dit kan uiteraard dynamische schrapen sites, omdat dit in wezen
voorwenden om Chrome zonder dat de gebruikersinterface.
>> En dan natuurlijk de meest robuuste, maar langzaamste optie,
Selenium is een browser automatisering.
En helaas, je bent niet van plan om
in staat om dit te doen binnen uw CS50 IDE.
Want in wezen wat het doet is het laarzen omhoog uw Chrome,
Firefox, welke browser die u wilt gebruiken,
en volgt misschien uw muis beweging, wat je typt,
en het gewoon een soort van automatiseert dit proces.
Zo werd ontwikkeld als een soort website automatisering testing tool.
Maar veel mensen gebruiken Selenium om websites te schrapen
dat zij anders een veel moeite schrapen
met sommige andere, snellere gereedschappen.
>> Dus dat is alles wat ik heb voor web schrapen.
Plezier hebben.
>> Publiek: Vraag.
>> ROBERT KRABEK: Ja.
>> PUBLIEK: Is er een mechanisme om hash de website, zodat je kon eigenlijk
gaan door het later op.
ROBERT KRABEK: Ja.
Dus hebben we de, in onze Bijvoorbeeld, voor beiden,
we de hele website in doc.
En dus zou je eigenlijk gewoon de variabele doc en schrijven naar een bestand.
Dus als ik wilde, kon ik schrijf het uit als een HTML-bestand,
en vervolgens in plaats van OpenURI en een cURL verzoek
dan kon ik gewoon openstellen doc HTML en dan zoeken naar dat.
>> Publiek: Maar kun je bewaren het soort van online ervaring
terwijl je offline doen.
Bijvoorbeeld. als je die enkele uren,
Ik wil eigenlijk archief de hele website. [ONHOORBAAR]
>> ROBERT KRABEK: Ja, dat is exactly-- dus letterlijk wat dit doet
wordt het neemt alles dat zou op deze URL.
Dus als we liepen krullen, het is het nemen van dit alles HTML,
en het is op te slaan in het variabele document.
Dus dan kun je doen wat je wilt doen met doc.
U kan de uitgang naar een bestand.
Publiek: Maar het is niet aan elkaar gekoppeld.
Het is niet dynamisch.
Het is niet recursief, toch?
Zie je wat ik bedoel?
Ik probeer in feite een soort van hash de hele website op mijn harde schijf
zodat ik in principe zou kunnen doen enkele uren zonder internet.
>> ROBERT KRABEK: Recht.
Dus als ik had-- dus waar is mijn dossier I / O?
Dus dit is het bestand I / O. Dus in plaats daarvan zeggen dit noem ik dit craigslist.html.
Ik zou openen dat op.
Ik zou zet doc in.
Ik sluit het bestand.
En dan alleen omdat de CS50 IDE is op de wolk, dat is wat.
Ik kan hier gaan.
Ik kan het bestand te downloaden.
En dan zou dat op mijn harde schijf.
Dus je kunt het op die manier.
Of als u thuis bent, niet met behulp van de CS50 IDE, zoals Sublime of iets,
dit is nog eenvoudiger, omdat dit is allemaal lokaal beschikbaar,
niet gebonden aan het internet.
>> Publiek: Ik zie.
Dit is een bijzonder probleem.
Kun je het recursief te doen, zodat u ga meerdere lagen diep soort dingen?
>> ROBERT KRABEK: Ik kan mappen downloaden zo goed, als dat is wat je vraagt.
Publiek: Ja.
>> ROBERT KRABEK: Cool.