>> [Jouer de la musique]
ROBERT KRABEK: Bonjour, les gars.
Mon nom est Robert Krabek, et Je vais vous enseigner les gars
comment gratter le Web avec Nokogiri, qui est une bibliothèque Ruby,
et Kimono, qui est une extension Chrome.
>> Alors d'abord il ya une quelques choses que vous
peut faire si peut-être vous avez été faire toutes les psets jusqu'ici
et votre espace de travail est obtenir un peu complète.
Nous pouvons en fait juste aller créer un nouvel espace de travail pour vous
faire juste un tout nouveau projet en.
Donc, si vous ne voulez continuer travaillant dans l'ID du modèle de CS50
que vous avez actuellement, sentir libre, et vous pouvez juste
installer Nokogiri avec CFLAGS joyau equals-- installer nokogiri.
Mais sinon, je vais vous montrer comment définir un nouveau en place.
Et puis, cela est essentiellement l'abandon de plusieurs roues de formation.
Et vous codez comme si vous étiez juste codage Sublime ou quelque chose.
Donc, si nous passons au-dessus.
>> Donc, dire cela est votre actuelle CS 50 ID.
Vous pouvez simplement aller à Cloud9 ici.
Vous pouvez aller à votre tableau de bord.
Il devrait faire apparaître onglet Espaces de travail.
Et puis, vous pouvez simplement cliquer sur ici, de créer un nouvel espace de travail.
Nommez votre nouvel espace de travail, peut-test, ou grattage.
Et puis cliquez sur cet onglet personnalisé ici, au lieu de l'onglet des modèles de CS50.
Et puis vous pouvez simplement aller et de créer un nouvel espace de travail.
>> Je l'ai déjà créé un espace de travail ici.
Donc, nous allons travailler avec cela.
Et si vous avez créé un nouveau espace de travail de manière à l'onglet Personnaliser,
vous pouvez simplement taper gem install nokogiri, qui ne va pas ici.
OK, il est un peu gelé.
Mais vous pouvez taper gem install nokogiri.
Et cela devrait être tout ce qui il y a de l'installation.
>> Comme je l'ai déjà dit, si vous êtes encore travailler dans votre CS50 ID de modèle,
il vous suffit de taper CFLAGS égale gem install nokogiri.
Et je l'ai déjà installé ici donc je ne le ferai pas.
Mais pour ceux qui suivent long, se sentir libre de le faire.
>> Donc, une fois que vous avez votre Nokogiri espace de travail ou d'une bibliothèque installée,
Je vais vous donner un peu d'un cours intensif sur la syntaxe Ruby
parce Nokogiri est une bibliothèque Ruby.
Ainsi, vous aurez besoin de connaître certaines de base Ruby syntaxe pour travailler avec Nokogiri.
Ainsi, certaines différences fondamentales de ce que vous êtes habitué à
peut-être si vous avez travaillé jusqu'ici en seulement C et PHP,
vous déclarez les variables sans type.
Vous ne utilisez des points-virgules, qui est une sorte de soulagement.
Il n'y a pas parenthèses maintenant autour de pour tout ou boucles, par exemple.
Vous avez juste un bloc de code, et puis vous mettez fin à la fin de cela.
Il n'y a pas plus plus ou moins en moins, si juste
savoir que lorsque vous faites pour les boucles,
seulement égaux plus et moins égaux.
Et au lieu de hachage comprennent, vous utilisez require puis
quelle que soit la bibliothèque essayer à charger dans votre programme.
>> Ruby est pas un langage compilé.
Voilà donc un autre relief.
Il est plus similaire à PHP où il est un langage interprété.
Vous pouvez exécuter un script Ruby qui vous écrivez avec Ruby suivi
par le nom de votre script ou un programme.
Pour signifier qu'il est un programme Ruby, vous venez de finir avec .rb lieu de .c.
Et il ya des variables tableaux de taille en Ruby,
qui est super pratique quand vous êtes grattage et peut-être voulez ajouter
les données que vous avez gratté dans un tableau.
Vous ne devez pas malloc un nouveau tableau et copier l'ancien tableau dans le nouveau tableau.
Vous pouvez ajoutez juste avec les deux signes de flèche.
Et il n'y a pas de caractères, il seulement chaînes de lettres simples.
Alors que cela devrait être un peu plus facile.
>> Nous allons donc vous donner quelques des exemples de certaines syntaxe Ruby base.
Donc, ici vous pouvez voir que la place de le slash slash, de commenter en Ruby,
il suffit d'utiliser le signe dièse.
Et déclaration de variable, vous il suffit de taper les égaux variables
ce que vous voulez que la variable soit.
Ils peuvent être des chaînes.
Vous pouvez avoir tableau, ce qui vous remplissez avec des valeurs.
puts et gravures sont similaires.
Pour nos fins, la seule différence est vraiment
qui met, qui signifie puts, met juste une nouvelle ligne
caractère à ce que vous imprimez.
>> Donc, si nous donnons un petit démonstration ici,
nous pouvons exécuter ce avec-- ouvrir un nouveau terminal.
Vous pouvez voir tous ces fichiers qui sont dans mon terminal.
Et si je cours juste Ruby, intro.rb rubis, il
met sur cinq Bonjour Mather, Quincy, Carrier.
Adams.
Voilà donc tout ce qu'il ya à des tableaux déclarant.
PUBLIC: Robert, pouvez-vous faire votre police un peu plus grand?
ROBERT KRABEK: Oui.
Et je peux agrandir, car vous ne pouvez pas zoomer pour des polices du terminal apparemment.
>> Voilà donc comment vous imprimez les variables à votre terminal.
Vous pouvez également utiliser variables à l'intérieur d'une chaîne.
Ainsi récemment, en PHP, vous avez appris
qu'il y est une chaîne interpolation.
Donc, si vous jetez un oeil ici, si je déclarer trois variables, le nom, la bibliothèque,
et langue, et je met, je écrire une chaîne, bonjour mon nom est.
Et puis, au lieu de la PHP version de chaîne interpolation
qui ressemble un peu plus comme ça, vous avez un signe dièse, puis
une accolade, puis le nom de la variable.
Et voilà comment vous souhaitez imprimer, dites, quel que soit le nom de la variable est.
>> Et puis, vous pouvez aussi concaténer les chaînes.
Ruby rend super facile avec le signe plus.
Vous avez juste une corde sur la gauche, plus une variable
ou une autre chaîne, plus une chaîne.
Donc, si je imprimer ceci, il se doit juste dire Bonjour, mon nom est Robert.
Je vais vous apprends nokogiri en Ruby.
>> Et nous allons simplement confirmer que ce est en effet l'intro rubis case--.
Bonjour, mon nom est Robert.
Je vais vous apprends nokogiri en Ruby.
>> Sur la route, si else, il est un peu différent
de ce que vous pourriez être utilisé pour si vous avez travaillé en C.
Vous ne devez pas les parenthèses.
Vous ne devez pas les accolades.
Et au lieu d'autre si, il est un elsif enchaîné.
Donc, ici, si je l'ai déclaré X Jusqu'à ici, comme nous pouvons le voir, x est toujours 5.
Donc, si x est inférieur à 3, il va mettre petite.
Si elle est inférieure à 7, moyen, autre grande.
Donc 5 est un nombre moyen.
Et je finis ce bloc de code avec la fin.
>> Voici ma boucle for.
Et cette syntaxe est également légèrement différente.
Le 0 à cinq vient essentiellement est la déclaration d'un des tableaux de 0 à 5.
Donc, il ya cinq fentes dans le tableau.
Ensuite, pour chaque intervalle en ce que tableau, je serai incrémenter i.
Donc, cela devrait imprimer 0 à 5 ou 0 à 4.
Et cela devrait imprimer moyen.
>> Et je vais Just Blaze travers.
Les gars, vous aurez accès à ce code plus tard.
Alors vous les gars vous pouvez exécuter cette.
>> Donc ceci est votre boucle de base de tout.
Ce sera juste l'impression j, incrémentation de 1 jusqu'à nous avons atteint 5.
>> Cours super rapide crash Ruby sur la façon d'écrire une fonction.
Au lieu de, disons, int factorielle nombre, nous avons juste def.
Et vous êtes essentiellement définir une fonction ici.
Cela va être le nom de la fonction,
et cela est toutes les variables que vous vouloir passer dans la fonction.
Vous pouvez avoir si des énoncés prospectifs au.
Vous pouvez retourner.
Dans ce cas, nous sommes la définition d'une manière récursive
fonction factorielle en œuvre.
Donc, nous appelons simplement fonctions Ruby comme ça.
>> Donc, si je l'ai défini, je peut appeler factorielle, passer 3,
puis 3 sera la variable du numéro que je peux utiliser dans la fonction.
Et cela est juste to_s tourne la retourner valeur de factorielle dans une chaîne.
Sinon, cela jettera une erreur en disant oh, je
ne peut pas imprimer un string-- parce que vous vous souvenez,
puts est mis string-- parce que ce factorielle a renvoyé un certain nombre.
Donc, nous pouvons convertir cette à une chaîne comme tels.
Et à l'inverse, vous pouvez également convertir une chaîne en entier avec to_i.
>> Donc, faire tout ce super simple, si je viens de commenter ceci, enregistrez
et exécuter la fonction factorielle.
Nous devrions être en mesure de voir que factorielle de 3 est de 6.
Et cela est bien vrai.
>> Voilà donc notre cours intensif en Ruby.
Et maintenant que vous savez Ruby, nous pouvons aller sur à la base Nokogiri grattage mis en place.
Essentiellement tout ce que vous avez à faire est, en Ruby, nécessitent que les bibliothèques.
Et pour nos fins, nous allons utiliser la bibliothèque openURI ainsi que Nokogiri.
Et puis ce que vous do-- et il va vous donner la syntaxe pour this--
est que vous ouvrez l'URL comme vous le feriez dans une demande cURL, qui signifie C URL.
>> Donc, vous prenez l'URL le site en question.
Vous stockez dans une variable.
Et puis, vous pouvez rechercher à travers ce que variable pour les balises HTML uniques à l'aide
la commande Css.
Et puis, vous pouvez émettre le contenu à l'endroit où vous voulez.
Vous pouvez commencer dans une base de données.
Vous pouvez imprimer dans un fichier, ou même simplement l'imprimer à l'écran.
>> Donc, nous allons vous montrer un grattoir de base.
Donc, ici vous pouvez voir que nous avons exigeant nokogiri, exiger open-uri.
Votre configuration de base, nous allons appeler document ou doc,
est égal à Nokogiri :: HTML ouvert, qui est le commande qui nous sont fournis par le openURI
bibliothèque.
Et nous allons être à la recherche, pour ceux d'entre vous qui pourraient vivre dans le quad,
pour les vélos qui sont énumérés à Boston sur la section de vélo Boston Craigslist
site.
>> Donc, si vous n'êtes pas familier avec cURL, je vais juste
vous montrer très rapide ce cURL fera.
Si je voulais obtenir toutes les URL à partir de le site Craigslist, si je tape boucle,
il vide tout simplement de l'URL à partir du site bicyclette Craigslist
sur mon terminal.
Cela ne veut pas particulièrement utile, car je ne fais pas
vouloir aller manuellement à travers et trouver la chose que je cherche.
Mais juste pour que vous le pouvez vois que je suis en fait
en utilisant le bon code, si vous regardez à l'adresse de Craigslist bikes--
pour quelque raison il ne le trouve pas.
Si vous regardez cette page et vous regardez l'URL,
ceci devrait être identique à la cURL demande que je viens envoie.
Et en effet, voilà ce qui se stockée dans la variable doc.
>> Donc, quand vous allez revenir à notre code, nous peut alors fonctionner sur cette variable doc
en utilisant Css.
Alors dis que je voulais obtenir tous les balises qui sont span.txt,
et toutes les balises dans un ce tag.
Et pourquoi pourrions nous voulons ce faire, je vous entends pleurer?
>> Si nous Inspecter l'élément, il vous donne un répartition de la façon dont l'URL est structuré.
Si je défiler vers le bas Ici, vous pouvez voir
que chacun de ces différents éléments représente.
Alors peut-être que je veux accéder cet élément particulier.
Donc, je suis en utilisant Chrome développeur des outils pour inspecter Element.
Je vois ici que cette est une une étiquette dans un laps
tag avec une classe de txt.
>> Donc, cela devient à notre première opération qui
est doc.css durée, qui est la balise qui Je suis à la recherche au sein de toute cette URL.
Et puis .txt fonctionne largement comme CSS fait lorsque vous êtes en train d'écrire CSS
dans vos fichiers HTML par spécifiant une classe.
Donc, cet opérateur volonté particulière spécifier une balise span avec la classe de txt.
Et puis, si je laisse un espace, ce sera ensuite au sein de cette balise
et de trouver ensuite un une étiquette au sein de cette.
>> Donc, si je viens de mettre cela à le terminal, je devrais
être capable de voir l'essentiel tout qui est dans ce laps de txt de classe.
Donc, nous allons donner ce un aller.
Ruby Craigslist-grattoir.
Et en effet, ce qui nous donne tous ces étiquettes des diverses annonces qui
sont sur la page Craigslist.
>> Donc, si nous revenons, nous pouvons transformer cette dans quelque chose d'un peu plus utile.
Peut-être que nous voulons seulement les liens.
Parce que dans ce tag, je vais aussi avoir le lien hypertexte du chemin
que cette page va.
Donc, si vous regardez ce code ici, ce que je vais faire est lieu de Css,
Je peux aller at_css.
Et ce sera juste obtenir le premier élément de toutes ces choses.
Donc, si je devais le faire dans le Code Je viens démontré précédemment,
au lieu de retourner tous De ce fait, il serait tout simplement
renverra le premier de ceux-ci.
Voilà donc comment l'opérateur de at_css fonctionne.
>> Donc, nous voulons stocker le chemin totalité de la première d'une balise.
Et parce que nous donnera a-- donc nous allons encore utiliser Css.
Mais parce que cela va donner nous ramène un tableau entier de balises,
nous allons accès le premier élément.
Donc, c'est une autre façon que vous pouvez accéder à un élément particulier si vous
disposer une matrice d'éléments qui est retourné,
parce que vous pouvez traiter tout ce qui retours .css comme un tableau, essentiellement.
Et puis nous allons accéder à la attribut de référence de cette hypertexte.
>> Donc, si vous jetez un oeil, si vous avez regardé vraiment proche ici,
si vous venez de l'essentiel regardez la barre d'URL,
ce qui est le chemin vous allez être grattage.
Donc, si nous ne courons ce nouveau, et assurez-vous que nous avons économisé.
Vous pouvez vérifier à la maison.
Cela correspond en fait avec ce lien.
>> Alors pourquoi nous pourrions vouloir utiliser cette?
Si vous voulez gratter la page et il a
une page de liens comme Craigslist fait, vous
peut-être envie d'aller ensuite dans chacune de ces liens
puis gratter le contenu de ce qui
est exactement ce que nous allons faire.
>> Donc, une fois que vous avez tracé comme variables, je ne vraiment
soucier de l'imprimer.
Je dois juste l'enregistrer comme une variable.
Et puis, je peux accéder à un autre la page de la même façon je accéder
doc en premier lieu.
Sauf avec l'URL, nous allons à utiliser interpolation de chaîne
comme je décrivais dans Ruby plus tôt à ajouter
le chemin d'accès à l'extrémité de la racine.
>> Alors qu'est-ce que cela va faire est cela va mettre sur la voie
que je grattais déjà puis transformer ce
dans un nouvel élément, ce que vous voulez appellent it-- first_listing, par exemple.
Mais je vais laisser sur l'article pour le moment,
parce que ce que je suis en utilisant ici.
>> Donc, dire que je voulais obtenir la description de la première affectation à Craigslist.
Alors, je descendrais ici.
Je voudrais cliquez sur Inspecter l'élément encore une fois, parce que cela est la description.
Je descends ici et vois si je peux trouver comment je pourrais
être capable de rechercher pour cette étiquette unique.
Et dans ce cas, il a une pièce d'identité, ce qui nous mène
à notre prochain façon de chercher balises, qui est avec un hashtag.
>> Donc, pour les classes, vous pouvez utiliser l'opérateur point.
Donc .txt spécifie une classe de txt, tandis que le hachage spécifie un ID.
Donc dans ce cas, la balise est section, et l'ID est postingbody.
>> Donc cela va et trouve l'first-- parce que nous sommes
at_css-- utilisant ce va et constate que le premier élément
arrive avec l'étiquette de l'article et l'ID de postingbody.
Et puis, vous pouvez accéder à l'élément de texte de cet article retourné avec .text.
Et puis nous pouvons stocker que dans la description.
>> Alors, maintenant que nous avons une Description de la variable,
nous pourrions être en mesure de le faire, par exemple, File I / O. Donc déposer I / O en Ruby
est très similaire au fichier I / O en C où nous ouvrons un fichier.
Nous pourrions écrire.
Et puis nous allons fermer ce fichier.
>> Donc, ici, nous sommes juste de nommer le déposer, une variable arbitraire.
Nous aurions aussi pu simplement mettre cela ici.
Nous avons une variable que nous allons stocker le fichier ouvert avec File.open.
Et nous écrivons à ce fichier, de sorte que nous ouvrons avec l'opérateur w.
Et puis nous avons mis dans la chaîne déposer auprès de l'opérateur de .puts.
Et puis nous avons mis la variable que nous vouloir écrire sur le fichier dans ce.
Et puis nous fermons simplement le fichier.
>> Donc, si nous allons de l'avant et lancer ce, cela devrait produire un document
avec description.txt qui sera cette description sein.
Donc, si je ne cours aucun it--.
Il est produit un fichier texte avec, je l'espère, la même chose.
Donc, il y aurait eu une nouvelle affectation qui est venu pendant que je vous ai parlé.
Et en effet, il semble qu'il y ait eu.
Donc, si nous allons à cette moto classique, 1962 à 1966, qui semble correspondre.
Et là vous allez.
>> Voilà donc le plus élémentaire fonctionnalité de raclage.
Nous pourrions avoir de la place en train d'écrire dans ce fichier,
nous pouvons ajouter des choses à un tableau.
Donc, si je déclare trois tableaux, titre, le prix et la description.
Et nous fonctionnons sur le point de doc maintenant.
Nous pouvons passer et trouver tous les span.txt.
Et rappelez-vous, ce retourne un tableau de tous les articles qu'il trouve.
Et puis en Ruby, vous pouvez simplement utiliser .Chaque pour parcourir chaque article
de la matrice.
Et puis, pour chaque article, Je vais l'appeler
un lien, parce que ce essentiellement ce qu'il est.
>> Donc, si je mets chaque a.hdrlnk link.css de dot, ce qui se passe réellement sur le lien
et de trouver dans ce lien une autre Élément HTML et la classe correspondante.
Donc, si nous nous souvenons de ce que ce fut, le span.txt,
vous pouvez voir- permettez-moi de revenir quick-- réelle au sein span.txt
nous avons beaucoup d'autres classes.
Donc l'intérieur span.txt, nous sommes à la recherche pour une une balise avec un hdrlnk de classe.
Alors laissez-moi juste trouve que pour vous les gars réel rapide.
>> Donc vous pouvez voir ici, ceci est un un tag qui est en l'espace de txt de classe
qui a le hdrlnk de classe.
Et voilà bien ce que nous essayons de faire.
>> Donc, nous essayons maintenant de stocker tous de ces liens à l'intérieur du titre.
Et puis nous allons imprimer sur chacun de ces liens.
Non désolé.
Nous allons imprimer le prix de chacun de ceux-ci.
Donc, nous allons courir ce vraiment rapide et voir ce qu'il fait.
>> Donc, ce juste fondamentalement allé à travers chacune des liaisons
à son tour, consultée le tag en question, puis sorti le prix.
Et il l'a fait que parce que, après vous avez tout dans le titre,
nous avons simplement stocké le titre là.
Nous venons stocké le lien dans le titre du tableau.
Et dans ce pour le fonctionnement de la boucle, où, au lieu d'aller à a.hdrlnk,
nous recherchons un span.price.
Donc, si je peux vraiment trouver rapidement le prix, si vous inspectez l'élément,
vous verrez qu'il est un laps avec la classe de prix.
Et qui est essentiellement de savoir comment nous obtenons le prix là-bas.
>> Voilà donc le vraiment cas de base de grattage.
Voilà comment vous obtenez tous les éléments sur une page
que, par exemple, vous savez déjà l'URL.
>> Donc, si nous voulons obtenir un peu plus en profondeur,
nous pouvons gratter pages de pages.
Et pour cet exemple, je vais être sortie vers un fichier CSV.
Donc, je suis exigeant csv ici parce que Ruby ne fait pas, à l'intérieur de lui-même,
avoir la fonctionnalité juste sortie des fichiers CSV.
Voilà donc super simple.
Permettez-moi de passer à la suivante.
Nous avons couvert fichier I / O. Donc cela est similaire à la façon dont il est en C.
Et avant que nous passions à Kimono, Je vais vous montrer comment vraiment rapide
pour gratter sites au sein de sites.
>> Donc nous avons déjà appris comment de déclarer les tableaux en Ruby.
Donc, je suis juste déclarant une tas de tableaux arbitraires
que je serai stocker des données au sein.
doc fonctionne de la même façon comme il l'a fait dans le fichier précédent.
Nous allons dans, trouver chacun des span.txt de.
Nous savons déjà que.
Voilà le conteneur dans lequel chaque lien dispose de toutes les données que nous voulons.
>> Alors, voici ce que nous faisons est pour chaque lien txt span class, nous allons dans
et nous allons trouver la balise, trouver le premier élément de cela.
Rappelez-vous, Css retourne un tableau, de sorte que vous ne pouvez pas y accéder comme il est.
Nous allons trouver le premier élément.
Même si elle est un tableau d'un article, vous devez utiliser cette syntaxe,
puis retirez l'attribut href.
>> Donc nous avons fait cela plus tôt.
Donc, cela devrait vous sembler familier.
Et maintenant nous avons un tableau appelés chemins de tous nos liens
que nous allons vouloir utiliser.
Donc, si nous avons ce tableau de tous des chemins que nous voulons utiliser,
nous pouvons alors créer un élément pour chaque de ces pages quand nous ouvrons cette page.
Donc, comme nous avons vu aussi sur la syntaxe avant, où
faire interpolation de chaîne avec le chemin ici, alors la syntaxe est juste pour le chemin.
Et je pourrais nommer cette variable de tout nom arbitraire.
>> Ceci est l'important.
Ceci est le tableau que vous aurez être accéder à chaque élément.
Mais quand vous dites pour le chemin dans les chemins, cela signifie que pour chaque élément de chemins,
appeler chemin, et l'utiliser.
Ceci est essentiellement comme quand vous faire une boucle et que vous utilisez int i.
Ainsi, vous pouvez traiter le chemin que le la variable qui est incrémentée.
>> Ensuite, pour chacun de ceux-ci, aller dans chacune de ces liens.
Parce que nous sommes le stocker dans la page de l'article, si nous créons une nouvelle page à chaque fois
nous accédons.
Et puis, au sein de cette nouvelle page, trouver span.postingtitletext, span.price,
puis la section # postingbody.
Nous avons déjà couvert la section # postingbody lorsque nous avons examiné la description.
>> Donc, nous pouvons aller voir dans le poste Craigslist, si vous êtes simplement en regardant le titre,
vous pouvez le voir ici, postingtitletext durée.
Et voilà pourquoi il est là.
Et puis, pour le prix, vous pouvez accéder avec span class de prix.
>> Donc, nous avons peut-être aussi pourrait vouloir stocker l'URL.
Nous allons donc lancer ça à nouveau, le stocker dans un tableau,
parce que si vous êtes à la recherche sur Craigslist, vous êtes
probablement vouloir un moyen de se vous voyez quelque chose qui vous intéresse,
revenir à ce site.
Donc, vous voulez juste pour stocker l'URL pour l'amour de références.
>> Ceci est juste l'essentiel une autre syntaxe de la boucle.
Je ne pouvais tout simplement ne paths.each place de chemin pour les chemins ayant un indice de.
Et cette syntaxe est Ruby pour-- chemin que nous avons fait ici,
déclarer une variable pour chaque élément.
Et l'indice se comporte comme i en C pour boucles.
Ainsi, vous pouvez garder la trace de ce que l'indice est.
>> Donc, voici juste un chose peu pratique
lorsque vous utilisez le grattoir.
Si vous raclage des centaines de pages, faire en sorte que ça ne pendaison,
Il va juste sortie, Je accéder cette page,
et faire en sorte que il est toujours en cours.
Mais pour nos besoins, parce il ya une centaine d'articles,
Je vais accéder seulement trois d'entre eux de sorte que nous ne courons pas de temps ici.
>> Mais avant d'en arriver là, je suis juste vais vous montrer très rapide,
Je vais délivrer le titre, prix, la description et l'URL
de chacun des liens que je l'ai gratté.
Et alors ceci est juste le la syntaxe pour la bibliothèque CSV.
Vous ouvrez un fichier CSV.
Ceci est ce que je vais l'appeler.
Ouvrez-le avec écriture do.
Et puis CSV sera le fichier vous êtes tout dans l'entrée.
Ceci est juste un test de cohérence pour je sais qu'il est en cours d'exécution.
Et ceci est mon test de cohérence à savoir qu'il est terminé.
Donc, je suis en train de titre en une ligne dans CSV, prix, URL, description,
tout en lignes dans le fichier CSV.
>> Donc, si nous allons and run ce maintenant-- et je viens
assurez-vous que je l'ai sauvé it-- place de délivrer en sortie seulement au terminal,
nous devrions avoir un CSV fichier qui est produit.
Donc, ici, nous pouvons voir le CSV fichier qui a été produite.
Ceci est la sortie de la Scape que je viens de rencontrer.
Comme vous pouvez le voir ici, Accès à la page 0, 1, 2, 3.
Ce sont les titres, prix, descriptions.
Et si nous regardons cette CSV fichier que nous avons généré,
vous pouvez voir son émis ici.
Cela ne veut pas Excel, il est donc pas formaté en lignes et colonnes.
Mais vous pouvez imaginer comment il pourrait être formaté.
>> CSV défend des valeurs séparées par des virgules.
Donc vous pouvez imaginer que cela pourrait être une rangée.
Et chaque virgule serait indiquer une colonne séparée.
Juste un mot d'caution-- parfois vous êtes
racler les choses avec beaucoup de virgules.
Donc, si vous êtes sortie dans un fichier CSV,
il ne pourrait pas la sortie comme vous pourriez le penser.
>> Voilà donc essentiellement tout il est au grattage base HTML
pages avec Nokogiri.
>> Donc, l'Internet étant innovant car il est venu
avec un plus automatisé et GUI la version, bien moins robuste
version de raclage divers sites Web.
Et pour nos fins Je vais démontrer
une extension Chrome appelé Kimono.
Et tout ce que vous avez à faire est de naviguer à la page que vous voulez gratter.
Vous cliquez sur un domaine d'intérêt.
Vous calibrer les domaines, car il va automatiquement
détecter ce qu'il pense vous voulez être grattage,
et puis vous venez de créer une API.
>> Donc, si nous étions à démontrer sur Craigslist, il serait effectivement pas travailler.
Et voici ce que je rentrais à dire à ce sujet ne pas être aussi robuste.
Il a du mal à la création de l'API.
Mais comme une démonstration de ce qu'il allait faire,
si vous installez l'extension Chrome, vous ne faites que vous cliquez dessus.
Il Kimonofies la page, et puis vous cliquez sur la chose que vous voulez script.
>> Donc, si je devais cliquer sur cela, il mettrait en évidence
ce qu'il pense que je veux être racler cette page.
Alors peut-être ce que je appelle annonces.
Ceci est le nombre d'articles que je l'ai choisi.
Et je peux juste confirmer ou de nier une certaine des autres listes proposées
pour le faire ajouter à ce sera grattée.
>> Alors maintenant, nous pouvons voir qu'il ya une centaine d'articles sélectionnés.
Si je veux avoir un autre domaine que je racler aussi qui est liée à cela,
dis que je veux gratter le prix ainsi, alors je peux faire la même chose.
>> Alors, voici une démonstration de la façon dont il est beaucoup moins robuste, parce que maintenant il est
ramasser la ville à la place de tout le prix que je veux.
Et maintenant il est ramassé 200 choses.
Vous pouvez revenir en arrière et supprimer.
Vous pouvez essayer de nouveau.
Mais aucune garantie.
Voilà comment cela fonctionne parfois.
Comme vous le voyez ici, maintenant il est dit 96 ici.
Il a ramassé la plupart des liens que vous voulez gratter, mais pas
nécessairement toutes.
>> Un autre outil utile de Kimono bien est que vous pouvez aller à des fonctionnalités avancées
ici, aller à avancée, et il va vous montrer
la répartition de l'unique moyen d'accéder au HTML
étiquettes que vous voulez gratter.
Donc, pour les annonces, si vous regardez ici, si vous accédez div p durée couvrent un,
vous pouvez réellement utiliser simplement ceci dans votre code Nokogiri,
là où auparavant nous avions span.txt pour accéder à chacune des listes.
Si je veux juste le texte dans les annonces,
Je pouvais entrée espace div p espace durée space durée d'un,
et il permettrait d'atteindre le même effet.
Et pour ceux d'entre vous qui sont intéressés en utilisant des expressions régulières,
il arrive également vous donner la régulière expression sorte de chaîne à l'entrée
pour trouver les choses vous essayez de trouver.
>> Donc, il ya une autre fonctionnalité intéressante de Kimono où vous pouvez paginer,
qui est non seulement je peux gratter les résultats de cette page,
Je peux cliquer sur ce petit bouton ici, la pagination,
spécifier le bouton qui me prendre à la page suivante,
puis il va juste savoir que il peut parcourir à la page suivante,
et puis gratter tous the-- aussi longtemps car il est le même format de course--
scape tous ces liens ainsi.
>> Ainsi, parce que Kimono ne veut pas travaillons avec Craigslist, ce que nous avons fait
est que je l'ai Kimonofied le Harvard Crimson.
Je suis sorti un peu du genre de top vedette des articles, confirment ici.
Dites tout cela.
Je ai compilé cette API pour vous à l'avance.
Mais sinon, ce que vous feriez est vous simplement cliquez sur Terminé.
Entrez les détails de votre API.
Réglez-le soit crawl automatisé ou manuel.
Ainsi, vous pouvez mettre à jour votre des données toutes les 15 minutes,
hebdomadaire, quotidienne, ce que vous voulez.
Nommez votre API.
Créer l'API.
Pour votre bénéfice, je l'ai créé Crimson déjà en première page API.
>> Donc, vous créez juste une compte sur Kimono, et il
stockera toutes vos APIs pour vous.
Donc, essentiellement, voilà tout votre éraflures séparés différents.
>> Donc, si nous regardons ici, ceci est le liens opinions que je l'ai recueillie.
Ce sont la vedette liens que je l'ai recueillie.
Et ceux-ci sont les plus lus liens que je ai recueillies
de cette plus récente scape API.
>> Donc, si vous pouvez le voir ici, ceux-ci seraient la vedette,
celles-ci seraient les opinions, qui, dans cet exemple,
Je les ai combiné tous en une seule collection.
Mais si vous jouez juste autour avec elle un peu, vous pouvez scinder
et le diviser cependant vous voulez aussi longtemps
comme la mise en forme est légèrement différente.
>> Juste pour jouer avec cela, le crawl mis en place, l'un des inconvénients
est que vous ne pouvez ramper 25 pages à la fois.
Voilà l'un des facteurs limitants.
Mais ici, si vous définissez à ramper manuel, cette
comment vous pouvez dire que ce de mettre à jour vos données.
Et ici vous pouvez voir votre historique d'analyse de tout ce que vous avez rampé.
Et vous les gars peuvent revenir, inscrivez-vous, jouer avec toutes les différentes façons
que vous pouvez modifier et utiliser vos données.
>> Kimono peut être configuré pour racler les liens au sein des liens.
Et vous voulez le faire en premier grattant une liste de liens,
et puis en utilisant cette API comme un sauter point de départ pour une autre API
que vous créez le script.
Mais cela est plus compliqué que ce que nous allons entrer dans aujourd'hui.
>> Voilà donc Kimono.
Nous allons parler des avantages et les inconvénients de Nokogiri et kimono.
>> Nokogiri, il est très rapide.
Il est facile de tester.
Vous pouvez simplement met rien à console, facile à configurer.
Vous pouvez décider exactement ce que vous voulez gratter et magasin.
Il n'y a pas de limite de pages.
En fait, je l'utilisais pour gratter comme 1800 sites Web des écoles sud-africaines
des e-mails pour un stage que je l'ai fait.
>> Alors que cela est possible, bien que les meilleures pratiques serait de diviser le script.
Parce que si elle échoue, alors vous ne recevez rien.
Mais si vous faites une centaine, peut-être 200 pages à la fois,
alors vous avez une chance d'au moins obtenir de façon fragmentaire, en particulier
si vous avez un mauvais Internet.
>> Malheureusement, il ne peut gratter HTML.
Donc, si vous avez pages-- chargée dynamiquement
et je vais vous montrer un exemple comme Kayak dans un second--
Malheureusement Nokogiri ne peut pas gratter que.
>> Mais Kimono est aussi facile à utiliser.
Comme vous l'avez vu, il est essentiel un point et clic.
Il peut gratter JavaScript.
Malheureusement, il ya un maximum à combien de pages vous pouvez gratter.
Parfois, il est un peu difficile à configurer.
Il devient confus.
Mais il est certainement quelque chose à considérer
si vous n'êtes pas essayer d'avoir un super-robuste scrape maintenable.
Si vous voulez juste pour obtenir le tout hors tension d'une page rapidement,
puis Kimono est vraiment bon outil à utiliser.
Et comme je l'ai mentionné auparavant, il ya la fonctionnalité avancée de Kimono
que vous montre comment accéder au HTML uniques
élément, qui est super utile même si vous travaillez dans Nokogiri.
>> Donc, si nous allons sur le site Kayak, pour par exemple, vous pouvez y voir est--
ou peut-être vous ne pouvez pas voir.
Mais si je vous montre l'URL de Kayak, ceci est en fait juste l'URL source.
Ceci est l'URL avant d'être modifiée par tous les scripts JavaScript
qu'ils ont passe.
Et ça va être différent d'inspecter l'élément.
>> Donc, si vous allez à travers et vous correspondre les Inspecter l'élément
code pour le code source, il est en fait va être différent.
Et cela est essentiellement pourquoi Nokogiri ne peut pas gratter les sites chargés dynamiquement.
Parce Nokogiri est grattant l'URL source,
tandis Kimono est en fait raclage ce que vous êtes essentiellement
voir dans Sélectionner un élément.
>> Donc, si je vais à travers et je essayer de Kimonofy Kayak,
Je peux effectivement passer par et sélectionnez le prix.
Il est un peu plus difficile, et dans ce cas, il est
voir réellement ce prix comme différent de ceux-ci.
Ainsi, alors que vous pouvez ou configure-- si cela n'a pas été chargé dynamiquement,
vous pouvez configurer Nokogiri pour obtenir tout cela.
>> Étant donné que la mise en forme est légèrement différent pour cette annonce
comme il est comparé au reste d'entre eux, et vous pouvez voir ici
il est effectivement disparu et choisis tous les prix de vol.
Peut-être que je veux choisir temps de vol ainsi.
Et je ne peux passer et sorte de configurer cela.
Je ne veux pas que.
Je veux juste le temps du prochain vol.
Et puis, après un couple de ces en passant par, il obtient l'image.
Donc Kimono est assez intelligent.
Il est tout simplement pas aussi robuste.
>> Il ya quelques autres alternatives que vous pouvez utiliser.
Et je vais vous montrer ici.
Si vous êtes plus à l'aise dans Python au lieu de Ruby peut-être,
il ya une bibliothèque appelée la Belle soupe.
Vous pouvez l'utiliser.
Il est très similaire à Nokogiri.
Il a un peu plus de fonctionnalités.
Vous pouvez trouver une balise HTML et puis déplacer ou se déplacer latéralement.
>> Il ya PyQt.
Cela peut effectivement gratter dynamique sites, car il est une sorte de
WebKit est un qui prétend être un navigateur sans qu'il y fait
étant un navigateur.
Donc, il serait d'attendre pour tout le JavaScript pour charger d'abord, puis
aller et essayer de gratter le site.
>> Si vous voulez coller avec Ruby, vous peut remonter d'un niveau de Nokogiri.
Vous pouvez utiliser Capybara avec une enveloppe Poltergeist.
Et cela peut effectivement essentiellement faire la même chose
que PyQt, qui est, il est un WebKit.
Il attend la JavaScript pour charger en premier.
Si vous bricoler avec elle assez, vous pouvez même obtenir à cliquer sur les choses.
>> Donc, si il ya un lien qui est pas un href classique où
le chemin est facilement accessible, et il est quelque chose qui détecte JavaScript
un clic, vous pouvez réellement faire.
La bibliothèque plus populaire pour simuler un utilisateur
est en JavaScript, qui est PhantomJS.
Cela peut évidemment gratter dynamique sites, car cela est essentiel
faire semblant d'être Chrome sans l'interface utilisateur.
>> Et puis, bien sûr le plus robuste, mais l'option la plus lente,
est une automatisation du navigateur de sélénium.
Et malheureusement, tu ne vas pas être
mesure de le faire au sein de votre CS50 IDE.
En raison essentiellement ce que fait est qu'il démarre votre Chrome,
Firefox, quel que soit le navigateur que vous souhaitez utiliser,
et il suit peut-être votre souris mouvement, tout ce que vous tapez dans,
et ce juste une sorte de automatise ce processus.
Donc, il a été développé comme une sorte de site web outil de test d'automatisation.
Mais beaucoup de gens utilisent Sélénium pour gratter sites
qu'ils ont un autre beaucoup de difficulté à gratter
avec certains de ces autres outils plus rapides.
>> Voilà donc tout ce que je dois pour le web grattage.
S'amuser.
>> AUDIENCE: Question.
>> ROBERT KRABEK: Oui.
>> Public: Y at-il un mécanisme de hachage le site vous pouvez donc essentiellement
passer par la suite.
ROBERT KRABEK: Ouais.
Donc, nous avons mis le, dans notre Ainsi, pour chacun d'eux,
nous avons mis l'ensemble du site en doc.
Et si vous pouviez juste prendre le doc variable et écrire dans un fichier.
Donc, si je le voulais, je pouvais l'écrire dans un fichier HTML,
puis au lieu d'utiliser OpenURI et une demande cURL,
alors je ne pouvais tout simplement ouvrir doc HTML et ensuite chercher pour cela.
>> AUDIENCE: Mais pouvez-vous préserver le genre d'expérience en ligne
pendant que vous faites hors ligne.
Par exemple. quand tu es vol pendant plusieurs heures,
Je veux essentiellement archives l'ensemble du site. [INAUDIBLE]
>> ROBERT KRABEK: Ouais, qui est exactly-- si littéralement ce que cela est fait
est ça prend tout ce serait à cette URL.
Donc, si nous avons couru cURL, il est prenant tout cela HTML,
et il est le stocker l'intérieur de la doc variable.
Ainsi donc, vous pouvez faire ce que vous voulez faire avec doc.
Vous pouvez imprimer dans un fichier.
AUDIENCE: Mais il est pas lié jusqu'à.
Il est pas dynamique.
Il est pas récursif, non?
Vous voyez ce que je veux dire?
Je suis en train de fondamentalement une sorte de hachage l'ensemble du site sur mon disque dur
de sorte que je pouvais le faire essentiellement pendant plusieurs heures sans internet.
>> ROBERT KRABEK: Droit.
Donc, si je had-- alors où est mon fichier I / O?
Alors ceci est l'image d'E / S. Donc, dire à la place De ce fait, ce que je appelle craigslist.html.
Je voudrais ouvrir que jusqu'à.
Je ferais puts doc en elle.
Je ferme le fichier.
Et puis, juste parce que le CS50 IDE est sur le nuage, que cela soit.
Je peux aller ici.
Je peux télécharger le fichier.
Et puis ce serait sur mon disque dur.
Ainsi, vous pouvez le faire de cette façon.
Ou si vous êtes à la maison, ne pas utiliser le CS50 IDE, comme Sublime ou quelque chose,
cela est encore plus facile, parce tout cela est disponible localement,
ne sont pas liés à l'Internet.
>> AUDIENCE: Je vois.
Ceci est pour un problème particulier.
Pouvez-vous le faire de manière récursive afin que vous aller plusieurs couches profondes genre de chose?
>> ROBERT KRABEK: Je peux télécharger des dossiers ainsi, si cela est ce que vous demandez.
AUDIENCE: Ouais.
>> ROBERT KRABEK: Cool.