[REPRODUCCIÓ DE MÚSICA] ROBERT KRABEK: Hola, nois. El meu nom és Robert Krabek, i Vaig a estar ensenyant nois com raspar la web amb Nokogiri, que és una biblioteca Ruby, i quimono, que és una extensió de Chrome. Així que primer hi ha un parell de coses que vostè pot fer si potser vostè ha estat fent tots els conjunts de processadors fins al moment i l'espai de treball és aconseguir una mica ple. Podem en realitat només anar i crear un nou espai de treball per a vostè que acaba de fer un nou projecte de la marca a. Així que si vol continuar treballant en la identificació de plantilla CS50 que té actualment, sentir-se lliure, i vostè pot simplement instal·lar Nokogiri amb CFLAGS joia equals-- instal·lar nokogiri. Però d'altra banda et vaig a mostrar com establir un nou un. I llavors aquest és essencialment caient més rodes d'entrenament. I vostè està codificant com si fossis simplement la codificació en Sublim o alguna cosa així. Així que si canviem la volta. Així que dir que aquest és el seu actual CS 50 ID. Vostè pot anar a Cloud9 aquí. Vostè pot anar al seu tauler d'instruments. Ha d'obrir pestanya Espais de treball. I llavors vostè pot simplement feu clic aquí, crear un nou espai de treball. El nom del seu nou espai de treball, tal prova o raspat. I a continuació, feu clic a aquesta fitxa costum aquí, lloc de la fitxa plantilles CS50. I llavors vostè pot anar i crear un nou espai de treball. Jo ja he creat un espai de treball aquí. Així que treballarem amb això. I si ha creat una nova espai de treball pel que amb la fitxa Personalitzar, que només pot escriure gem install nokogiri, que no està passant aquí. OK, que és una mica congelat. Però pot escriure joia instal·lar nokogiri. I això hauria de ser tot el que hi ha a la instal·lació. Com he dit abans, si vostè encara està treballant en el seu CS50 plantilla d'ID, només ha d'escriure CFLAGS és igual a gem install nokogiri. I jo ja he instal·lat des d'aquí, així que no ho farà. Però per a aquells que segueixen junt, no dubti en fer-ho. Així que una vegada que tingui el seu Nokogiri àrea de treball oa la biblioteca instal·lada, Vaig a donar-li una mica d'un curs intensiu en la sintaxi de Ruby perquè Nokogiri és una biblioteca de Ruby. Pel que vostè necessita saber alguns bàsics Sintaxi de Ruby per treballar amb Nokogiri. Així que algunes diferències bàsiques del que estem acostumats potser si vostè ha estat treballant fins ara en tan sols C i PHP, declara variables sense tipus. No utilitzeu un punt i coma, que és una espècie d'alleujament. No hi ha parèntesis ara al voltant per o mentre bucles, per exemple. Només tens un bloc de codi, i a continuació, posar fi al final d'això. No hi ha plus plus o menys negatiu, de manera que només saber que per quan que estàs fent per bucles, només iguals més i menys iguals. I en lloc d'haixix inclouen, farem servir requerir i després qualsevol que sigui la biblioteca tractant carregar en el seu programa. Ruby no és un llenguatge compilat. Així que això és un altre alleujament. És més similar a PHP on és un llenguatge interpretat. Podeu executar qualsevol script Ruby que s'escriu amb Ruby va seguir pel nom de la seva script o programa. Per indicar que es tracta d'un programa de Ruby, que acaba d'acabar amb .rb lloc de .c. I no són variables matrius de grandària en Ruby, la qual cosa és molt pràctic quan estàs raspat i potser vulgueu afegir dades que vostè ha raspat en una matriu. No ha de malloc una nova matriu i copiar la matriu d'edat en la nova matriu. Només pot afegir amb els dos signes de fletxa. I no hi ha caràcters, hi ha només cadenes d'una sola lletra. Així que ha de ser una mica més fàcil. Així que només et donarem alguns exemples d'algunes sintaxi bàsica de Ruby. Així que aquí es pot veure que en lloc de la barra barra, per comentar en Ruby, només ha d'utilitzar el signe lliura. I la declaració de variables, que només has d'escriure els iguals variables el que vulguis la variable sigui. Poden ser cadenes. Vostè pot tenir matriu, que omple amb valors. puts i les impressions són similars. Per als nostres propòsits, la única diferència és realment que posa, el que significa posa, simplement posa una nova línia caràcter en el que està imprimint. Així que si li donem un petit demostració aquí, podem executar aquest con-- obrir una nova terminal. Pots veure tots aquests arxius que estan en el meu terminal. I si em quedo Ruby, intro.rb robí, que posa a cinc Hola Mather, Quincy, Carrier. Adams. Així que això és tot el que hi ha a les matrius que declaren. AUDIÈNCIA: Robert, pots fer la seva font una mica més gran? ROBERT KRABEK: Sí. I puc acostar perquè no es pot apropar les fonts de terminal aparentment. Així és com imprimir les variables al seu terminal. També pot utilitzar variables dins d'una cadena. Així recentment a PHP, que podria haver après que hi ha interpolació cadena. Així que si vostè fes un cop d'ull aquí, si em declari 3 variables, el nom, la biblioteca, i de llenguatge, i posa, em escriure una cadena, hola el meu nom és. I llavors, en lloc del PHP versió de la interpolació cadena el que es veu una mica de la mateixa família, vostè té un signe de nombre i, a continuació, una clau, i després el nom de la variable. I així és com voleu imprimir, diu, qualsevol que sigui el nom de la variable és. I després també pot concatenar cadenes. Rubí fa super fàcil amb el signe més. Només has una corda a l'esquerra, més una variable o una altra cadena més una cadena. Així que si puc imprimir això cap a fora, el que hauria acaba de dir hola, el meu nom és Robert. Vaig a estar ensenyant Nokogiri en Ruby. I anem a confirmar que aquest és de fet la introducció ruby ​​cas--. Hola, el meu nom és Robert. Vaig a estar ensenyant Nokogiri en Ruby. Canviant de tema, si else, que és una mica diferent del que podria ser utilitzat per si vostè ha estat treballant en C. Vostè no necessita els parèntesis. Vostè no necessita les claus. I en lloc d'una altra persona si, és un elsif concatenats. Així que aquí, si m'he declarat x dalt aquí, com podem veure, x és encara 5. Així que si x és menor que 3, que posarà petites. Si és inferior a 7, mitjà, del gran. Així 5 és un nombre mitjà. I acabo aquest bloc de codi amb l'extrem. Aquí està el meu bucle for. I aquesta sintaxi és també lleugerament diferent. El 0 a cinc simplement essencialment està declarant una sèries de 0-5. Així que hi ha cinc ranures de la matriu. I a continuació, per a cada ranura en aquest matriu, que serà incrementar i. Així que aquest ha d'imprimir 0 a 5, o de 0 a 4. I això ha d'imprimir mitjà. I vaig a Just Blaze a través. Vostès tindran accés a aquest codi més endavant. Així que vostès poden executar aquesta vostès mateixos. Així que aquest és el bucle bàsic estona. Aquesta serà només la impressió de j, per increment a 1 fins que vam arribar a 5. Super ràpid curs accelerat de Ruby sobre com escriure una funció. En lloc de, per exemple, int factorial nombre, només tenim def. I essencialment estàs definir una funció aquí. Aquest serà el nom de la funció, i això és qualsevol variable que volen passar a la funció. Vostè pot tenir si declaracions prospectives dins. Vostè pot tornar. En aquest cas, estem la definició d'una forma recursiva funció factorial aplicat. Així que només ens diem funcions en Ruby com aquest. Així que si he definit això, pot trucar factorial, passi a 3, i després 3 serà la variable nombre que puc utilitzar dins de la funció. I això és només to_s convertint la valor del factorial tornar en una cadena. Altrament això va a tirar dient un error oh, sense poder imprimir un string-- perquè com vostè recorda, posa les que es posa string-- perquè aquest factorial ha tornat un nombre. Així que podem convertir aquest a una cadena com a tals. I al revés, també pot convertir una cadena a un enter amb to_i. Així que fer tot super simple, si acabo de comentar això, guardi i executar la funció factorial. Hem de ser capaços de veure que factorial de 3 és 6. I això és cert. Així que aquesta és el teu curs intensiu en Ruby. I ara que saps Ruby, podem seguir a la Nokogiri bàsica raspat configurar. Bàsicament tot el que has de fer és, en Ruby, requereixen les biblioteques. I per als nostres propòsits estarem utilitzant la biblioteca OpenURI així com Nokogiri. I llavors el que fer-- i va li donarà la sintaxi per esto-- és obrir la URL tant com ho faria en una sol·licitud cURL, que significa C URL. Així que pren l'URL de la pàgina web en qüestió. Pot emmagatzemar en una variable. I llavors vostè pot cercar a través d'aquest variable per etiquetes HTML únics usant la comanda .css. I llavors vostè pot donar sortida a la contingut a on vulguis. Pot començar en una base de dades. Vostè pot donar sortida a un arxiu, o fins i tot només imprimir-ho en la pantalla. Així que li mostrarem un raspador bàsica. Així que fins aquí es pot veure que tenim requerint nokogiri, requerir-uri oberta. La seva configuració bàsica, anem a cridar document o doc, és igual a Nokogiri :: HTML obert, que és el comandament proporcionada a nosaltres pel OpenURI biblioteca. I estarem buscant, per a aquells de vostès que podrien estar vivint al pati, per a bicicletes que es troben a Boston s'enumeren a la secció de bicicleta de Boston Craigslist lloc. Així que si vostè no està familiaritzat amb cURL, només vaig a mostrar el cURL farà molt ràpid. Si volgués obtenir tota la URL des el lloc Craigslist, si escric ris, només bolca tota la URL des del lloc de la bicicleta Craigslist en el meu terminal. Això no és tot útil perquè no ho faig vull anar manualment a través i trobar el que estic buscant. Però perquè el puguis veig que estic en realitat utilitzant el codi de dret, si ens fixem a l'URL de Craigslist en bikes-- per alguna raó no l'ha trobat. Si ens fixem en aquesta pàgina i ens fixem en la URL, això ha de ser idèntica a la sol·licitud cURL que acabo d'enviament. I de fet, això és el que està sent emmagatzemat en la variable doc. Així que quan vostè torna al nostre codi, a continuació, pot operar en aquesta variable doc mitjançant l'ús de .css. Així que dic jo volia aconseguir tots les etiquetes que són span.txt, i tots els a etiquetes dins aquesta etiqueta. ¿I per què podríem voler fer això, t'escolto plorar? Si inspeccionem Element, que li dóna un desglossament de com s'estructura la URL. Si em desplaço cap avall a través aquí, es pot veure el que cada un d'aquests diferents elements representa. Així que potser vull accedir aquest element particular. Així que estic fent servir desenvolupador de Chrome eines per Inspeccionar Element. Veig aquí que aquesta és un una etiqueta en un lapse etiquetar amb una classe de txt. Així que ara es posa al nostre primera operació que és pam doc.css, que és l'etiqueta que Busco dins de tota aquesta URL. I després .txt funciona molt semblant a CSS fa quan estàs escrivint CSS en els seus arxius HTML per especificant una classe. Així que aquest operador en particular ho farà especificar una etiqueta span amb la classe de txt. I després, si els deixo un espai, això després anar dins d'aquesta etiqueta i després trobar un una etiqueta dins d'aquest. Així que si acabo de posar això a la terminal, que hauria podrà veure essencialment tot és a dir dins d'aquest lapse de classe txt. Així que anem a donar que una oportunitat. robí craigslist-rascador. I, en efecte, que ens dóna totes aquestes etiquetes dels diferents llistats que són a la pàgina Craigslist. Així que si ens remuntem, podem convertir això en una cosa una mica més útil. Potser volem només els vincles. Perquè dins d'aquesta etiqueta, vaig també tenir l'hipervincle de la ruta que aquesta pàgina va. Així que si ens fixem en el codi aquí el que vaig a fer és en lloc de .css, Puc anar at_css. I això acaba d'obtenir el primer element de totes aquestes coses. Així que si jo fos a fer això al codi Acabo demostrat anteriorment, en lloc de retornar tot d'aquest, que seria només lliurarà el primer d'ells. Així és com funciona l'operador at_css. Així que volem emmagatzemar el ruta de tota la primera una etiqueta. I perquè ens donarà una A-- de manera que encara utilitzarem .css. Però com que aquest es va a donar nosaltres tornar a tot un conjunt d'etiquetes, anem a accés el primer element. Així que aquesta és una altra manera que pugui accedir a qualsevol element en particular si tenir un conjunt d'elements que es torna, perquè es pot tractar qualsevol cosa que torna .css com una matriu, essencialment. I després tindrem accés a la atribut de referència d'hipertext d'aquesta. Així que si vostè fes un cop d'ull, si et veies molt a prop d'aquí, si el que essencialment mirar la barra d'URL, aquest és el camí que vostè va a ser raspat. Així que si ens correm això de nou, i assegurar-nos que hem estalviat ell. Vostè pot comprovar a casa. Aquest fet coincideix amb aquest enllaç. Llavors per què podríem voler utilitzar això? Si voleu raspar la pàgina i té una pàgina d'enllaços com Craigslist fa, pot ser que vulgui anar a continuació en cada un d'aquests enllaços i després raspar la contingut d'aquest, que és exactament el que farem. Així que una vegada que tingui trajectòria com variables, ja no molt es preocupen per imprimir-lo. Només he de guardar-lo com una variable. I llavors puc accedir a un altre La pàgina de la mateixa manera puc accedir doc en el primer lloc. Excepte amb la URL, anem utilitzar interpolació de cadenes com si estigués descrivint en Rubí anterior sobre annexar el camí fins al final de l'arrel. Així que el que això va a fer és això posarà en el camí que raspi prèviament i després convertir aquest en un nou element, el que vulguis diuen it-- first_listing, per exemple. Però jo vaig a deixar que sobre el tema, per ara, perquè això és el que estic fent servir aquí. Així que dir que em volia aconseguir la descripció de la primera publicació en Craigslist. Així que m'agradaria anar per aquí. Em clic a Inspeccionar Element de nou, perquè es tracta de la descripció. M'agradaria anar aquí i veig si puc trobar com podria ser capaços de cercar aquesta etiqueta única. I en aquest cas, té una identificació, el que ens porta al nostre següent manera de buscar etiquetes, que és amb un hashtag. Així que per a les classes, pot utilitzar l'operador punt. Així .txt està especificant una classe de txt, mentre que el hash especifica un ID. Així doncs, en aquest cas, l'etiqueta és secció i la identificació és postingbody. Així que això va i troba el primer-- perquè som utilitzant at_css-- aquest va i Busca el primer element que ve amb l'etiqueta de la secció i la identificació de postingbody. I llavors vostè pot accedir a l'element de text d'aquest article tornat amb .text. I llavors podem emmagatzemar que en la descripció. Així que ara que tenim una descripció de la variable, podríem ser capaços de fer, per exemple, File I / O. Així presentar d'E / S en Ruby és molt similar a l'arxiu d'E / S en C, on obrim un arxiu. Podríem escriure-hi. I després anem a tancar aquest arxiu. Així que aquí, només estem nomenant el presentar, alguna variable arbitrària. També podríem haver-hi només cal posar això aquí. Tenim una variable que estem emmagatzemant l'arxiu obert com amb File.open. I estem escrivint a aquesta imatge, així que l'obrim amb l'operador w. I després posem cadena a la presentar davant l'operador .puts. I després posem la variable que ens vull escriure al fitxer d'aquest. I aleshores només tanquem l'arxiu. Així que si seguim endavant i executar això, això hauria de produir un document amb description.txt que ho farà tenir aquesta descripció dins d'ella. Així que si em quedo it-- no. Es produeix un arxiu de text amb, amb sort, la mateixa cosa. Així que podria haver hagut un nou anunci que ha sorgit mentre jo he estat parlant. I de fet sembla que s'ha produït. Així que si ens anem a aquesta moto clàssica, 1962-1966, que sembla coincidir. I aquí el tens. Així que això és el més bàsic funcionalitat de raspat. Podríem tenir lloc de només escriure a aquesta imatge, podem afegir coses a una matriu. Així que si em declaro tres matrius, títol, preu i descripció. I estem operant en l'element doc ara. Podem anar a través i trobar tota la span.txt. I recordi, això retorna una matriu de tots els elements que troba. I després, a Rubí, només pot utilitzar .Cada Per recórrer cada article de la matriu. I a continuació, per a cada article, Jo només vaig a dir- un vincle, perquè això és essencialment el que és. Així que si em poso cada a.hdrlnk punt link.css, aquest és en realitat va a l'enllaç i trobar dins d'aquest enllaç altra Element HTML i la classe corresponent. Així que si tenim en compte el aquest va ser el span.txt, pot veure- permetin-me tornar quick-- real dins span.txt tenim un munt d'altres classes. Així que d'aquí a span.txt, estem buscant per a una una etiqueta amb un hdrlnk classe. Així que permetin-me trobada que per a vostès molt ràpid. Així que vostè pot veure aquí, aquest és un una etiqueta això és en el lapse de classe txt que té el hdrlnk classe. I això és precisament el que que estem tractant d'aconseguir. Així que ara estem tractant d'emmagatzemar tots d'aquests vincles dins del títol. I després anem a imprimir a terme cada un d'aquests enllaços. No, ho sento. Anem a imprimir el preu de cada un d'aquests. Així que anem a córrer aquesta realitat ràpid i veure el que fa. Així que això només bàsicament va ser a través de cada un dels enllaços al seu torn, visitada l'etiqueta en qüestió, i després va treure el preu. I ho va fer perquè després ho tens tot en el títol, que acabem guardar el títol allà. Acabem van guardar l'enllaç dins el títol matriu. I en això per al funcionament de bucle, on en lloc d'anar a a.hdrlnk, estem buscant un span.price. Així que si puc realment trobar ràpidament el preu, si vostè examina l'element, veuràs que és un lapse amb la classe de preu. I això és bàsicament com estem rebent el preu allà. Així que aquesta és la veritat cas bàsic de raspat. Així és com s'aconsegueix tot els elements d'una pàgina que, per exemple, que ja coneixen l'URL de. Així que si volem aconseguir un mica més en profunditat, podem raspar les pàgines de pàgines. I per aquest exemple, vaig a ser la sortida a un fitxer CSV. Així que estic requerint csv aquí perquè Ruby no té, dins de si mateix, tenir la funcionalitat a arxius CSV sortida justa. Així que això és super simple. Deixin-me anar a la següent. Cobrim arxiu d'E / S. Així que aquest és similar al que passa en C. I abans de passar a Kimono, Vaig a mostrar-los que realment ràpida com per raspar els llocs dins de llocs d'interès. Així que ja vam aprendre per declarar matrius en Ruby. Així que estic declarant un manat de matrius arbitràries que va a emmagatzemar dades dins. doc està funcionant de la mateixa manera com ho va fer a l'arxiu anterior. Anem a entrar, trobant cada un dels de span.txt. Ja sabem que. Aquest és el recipient dins el qual cada enllaç té totes les dades que volem. Així que aquí el que estem fent és que cada enllaç de span class txt, anem a i estem trobant la una etiqueta, trobar el primer element d'això. Recordeu, .css retorna una matriu, per la qual cosa no només pot accedir-hi immediatament. Anem a trobar el primer element. Fins i tot si es tracta d'una matriu d'un sol article, vostè ha d'utilitzar aquesta sintaxi, i després treure l'atribut href. Així ho vam fer abans. Així que això ha de semblar familiar. I pel que ara tenim una matriu anomenats camins de tots els nostres enllaços que anem a voler utilitzar. Així que si tenim aquest conjunt de tots dels camins que volem utilitzar, llavors podem crear un article per a cada un d'aquestes pàgines quan vam obrir aquesta pàgina. Així com també vam veure en la sintaxi abans, on fent interpolació cadena amb la ruta aquí, de manera que la sintaxi és només per a la ruta. I jo podria anomenar aquesta variable de qualsevol nom arbitrari. Aquest és l'important. Aquesta és la matriu que Tu ser accedir a cada element. Però quan dius de ruta en camins, això significa per a cada element de camins, cridar camí, i usar això. Això és essencialment igual que quan fer un bucle i s'utilitza int i. Així que vostè pot tractar el camí que el variable que està incrementant. I a continuació, per a cada un d'aquells, entrar a cada un d'aquests enllaços. Perquè estem emmagatzemar-lo en la pàgina de l'article, pel que estem creant una nova pàgina cada vegada que accedim a ella. I després dins d'aquesta nova pàgina, trobarà span.postingtitletext, span.price, i després la secció # postingbody. Ja hem cobert la secció # postingbody quan ens fixem en la descripció. Així que podem anar a veure al post Craigslist, si el que busques en el títol, es pot veure aquí, postingtitletext pam. I és per això que hi és. I després pel preu, que pot accedir-hi amb span class de preu. Així que potser també podria voleu emmagatzemar la URL. Així que només haurem d'executar aquest de nou, deseu-lo en una matriu, perquè si el que busques en Craigslist, ets probablement voldrà una manera, si vostè veu alguna cosa que li interessa, tornar a aquest lloc. Així que el que desitja és emmagatzemar l'adreça URL de referències sake. Això és només essencialment una altra sintaxi del bucle for. Jo només vaig poder fer paths.each lloc per un camí en camins amb índex. I aquesta és la sintaxi de Ruby para-- camí és el que hem fet fins aquí, declarar una variable per a cada element. I l'índex es comporta com l'i en C per als bucles. Així que vostè pot fer un seguiment del que l'índex és. Així que aquí és només una petita cosa convenient per quan s'està executant el rascador. Si vostè està raspant centenars de pàgines, per assegurar-se que no està penjat, S'acaba de sortida, Estic accedir a aquesta pàgina, i assegurar-se que encara està continuant. Però per als nostres propòsits, ja que hi ha un centenar d'articles, Vaig a tenir accés a només tres d'ells per la qual cosa no ens quedem sense temps aquí. Però abans d'arribar a això, jo només sóc va a mostrar que realment ràpida, Vaig a emetre el títol, preu, descripció i URL de cada un dels enllaços que he raspat. I llavors això és només el sintaxi per a la biblioteca de CSV. Vostè obre un fitxer CSV. Això és el que vaig a cridar-ho. Obriu amb escriptura do. I després CSV serà l'arxiu que vostè està introduint tot en. Això és només una prova de seny per jo sé que s'està executant. I aquesta és la meva prova de seny saber que s'ha completat. Així que em vaig a posar el títol en una fila CSV, preu, URL, vista general, tots en les files de la CSV. Així que si anem i execució aquest ara-- i jo assegurar-se que m'he estalviat it-- lloc de tan sols donar sortida a la terminal, hem de tenir un fitxer CSV arxiu que es produeix. Així que aquí podem veure el CSV arxiu que s'ha produït. Aquesta és la sortida del Scape que m'acabo de trobar. Com es pot veure aquí, Accés a la pàgina 0, 1, 2, 3. Aquests són els títols, preus, descripcions. I si ens fixem en aquest CSV arxiu que hem generat, es pot veure el seu emesa aquí. No es tracta d'Excel, així que no és formatat en files i columnes. Però vostè pot imaginar com podria ser formatat. CSV significa valors separats per comes. Així que vostè pot imaginar que això podria ser una fila. I cada coma faria indicar una columna separada. Només una paraula de caution-- de vegades ets raspant les coses amb una gran quantitat de comes. Així que si estàs sortida en un arxiu CSV, Potser no la sortida del manera vostè podria pensar. Així que això és essencialment tot el que cal raspar HTML bàsic pàgines amb Nokogiri. Així l'ésser internet innovadora, ja que ha arribat amb un més automatitzat i GUI versió, encara que menys robusta versió de raspat de diversos llocs web. I per als nostres propòsits Vaig a estar demostrant una extensió de Chrome anomenada quimono. I tot el que has de fer és navegar a la pàgina que voleu raspar. Fa clic en un camp d'interès. Calibrar els camps, perquè automàticament detectar el que pensa vols ser raspat, i llavors vostè acaba de crear una API. Així que si haguéssim de demostrar-ho en Craigslist, que en realitat no anava a funcionar. I això és el que anava a tornar a dient que no fos tan robusta. Té problemes per crear l'API. Però com una demostració del que anava a fer, si instal l'extensió de Chrome, tot el que fem és fer clic. Es Kimonofies la pàgina, i després fes clic amb el que vull guió. Així que si jo fos a fer clic a que, seria ressaltar el que pensa que vull ser raspat d'aquesta pàgina. Així que potser jo dic aquesta llista de propietats. Aquest és el nombre d'elements que he seleccionat. I jo només puc confirmar o negar alguns de les altres llistes suggerides per aconseguir que afegir a el que es raspa. Així que ara podem veure que hi ha un centenar d'articles seleccionats. Si vull tenir un altre camp que jo També raspar que es relaciona amb això, dic que vull raspar el preu així, llavors jo puc fer el mateix. Així que aquí està una demostració de com és molt menys robusta, perquè ara és recollint la ciutat en lloc de només el preu que jo vull. I ara es va recollir 200 coses. Vostè pot tornar enrere i esborrar. Pots intentar-ho de nou. Però no hi ha garanties. Així és com funciona això de vegades. Com es pot veure aquí, ara diu 96 aquí. Es va recollir la major part dels enllaços que desitja raspar, però no necessàriament tots ells. Una altra eina útil de quimono encara és que vostè pot anar a les funcions avançades aquí, aneu a Avançat, i se li mostrarà la ruptura de l'única manera d'accedir a l'HTML etiquetes que desitja raspar. Així que per als anuncis, si ens fixem en aquí, si accedeix div p lapse abasten una, en realitat es pot utilitzar només això en el seu codi Nokogiri, on abans havíem span.txt per accedir a cada un dels anuncis. Si només vull el text dins dels llistats, Vaig poder entrada espai div p lapse space lapse espai un, i seria aconseguir el mateix efecte. I per a aquells de vostès que estan interessats en l'ús d'expressions regulars, passa a també li donarà la regularitat expressió d'ordenació de la cadena a l'entrada per trobar les coses vostè està tractant de trobar. Així que hi ha una altra característica interessant Quimono d'on es pot paginar, que no només puc raspar els resultats d'aquesta pàgina, Puc fer clic en aquest petit botó Els, paginació, especificar el botó que duu-me a la pàgina següent, i després s'acaba de saber que es pot repetir a la següent pàgina, i després raspar tots ell-- sempre ja que és el mateix format de clar-- scape tots aquests vincles també. Així doncs quimono no vol Treballem amb Craigslist, el que hem fet és que he Kimonofied el Harvard Crimson. He vaig treure alguns de la classe de top articles destacats, confirmen aquí. Dir tot això. He compilat aquesta API per a vostè abans d'hora. Però d'altra banda el que faries és que vostè simplement li clic a Fet. Introdueixi les seves dades d'API. Ajusti'l a qualsevol rastreig automatitzat o manual. Així que vostè pot actualitzar el seu dades cada 15 minuts, setmanal, diari, el que vulguis. El nom de la seva API. Creu el API. Per al seu benefici, he creat el Carmesí pàgina API davant ja. Així que vostè acaba de crear una compte en quimono, i emmagatzemarà tots els seus APIs per a vostè. Per tant, bàsicament això és tot el que el seu raspadures diferents separades. Així que si mirem aquí, aquest és el dictàmens enllaços que he recollit. Aquests són els destacats enllaços que he recollit. I aquests són els més llegits vincles que jo he recollit d'aquesta última scape API. Així que si vostè pot veure aquí, aquests serien els presentats, aquests serien els dictàmens, que en aquest exemple, Els he combinat tots en una col·lecció. Però si vostè acaba de jugar una estona amb ell una mica, pot dividir- i dividir això desitja, sempre i com el format és lleugerament diferent. Només per jugar amb això, el rastreig de configurar, un dels inconvenients és que només pot rastrejar fins 25 pàgines alhora. Aquest és un dels factors limitants. Però aquí, si s'estableix l'arrossegament manual, aquest és com es pot dir que Per actualitzar les seves dades. I aquí es pot veure l'historial de rastreig de tot el que vostè ha rastrejat. I vostès poden tornar, crea, jugar amb totes les diferents maneres que es pot modificar i utilitzar les seves dades. Quimono pot configurar per raspar enllaços dins d'enllaços. I vostè fer-ho primer raspant una llista d'enllaços, i després utilitzar aquesta API com una saltar de punt per a un altre API que crea la seqüència de comandaments. Però això és més complicat que el que anem a aconseguir en l'actualitat. Així que això és quimono. Anem a parlar dels pros i contres de Nokogiri i quimono. Nokogiri, és molt ràpid. És fàcil de provar. Vostè pot simplement posa res consola, fàcil de configurar. Vostè pot decidir exactament el vol raspar i emmagatzemar. No hi ha límit de pàgines. En realitat, jo vaig fer servir per raspar com 1800 llocs web sud-africans escolars missatges de correu electrònic per a una passantia d'haver-ho fet. Així que això és possible, tot i que les millors pràctiques seria dividir el guió. Perquè si no, a continuació, vostè no aconsegueix res. Però si ho fa un centenar, potser 200 pàgines alhora, llavors vostè té alguna possibilitat de, almenys, aconseguir que a poc a poc, sobretot si vostè té mal internet. Per desgràcia, només es pot raspar HTML. Així que si vostè té pages-- carregada dinàmicament i jo et mostraré un exemple com Caiac en un second-- Nokogiri desgràcia no pot raspar això. Però Quimono també és fàcil d'utilitzar. Com es va veure, és essencialment un punt i clic. Es pot raspar JavaScript. Desafortunadament, no hi ha un màxim a la quantitat de pàgines que pot raspar. A vegades és una mica difícil de configurar. Es es confon. Però és sens dubte alguna cosa a considerar si vostè no està tractant de tenir una raspadura mantenible súper robusta. Si el que desitja és obtenir tot el que fos d'una pàgina ràpidament, llavors Quimono és una realitat bona eina a utilitzar. I com he esmentat abans, no hi ha la característica avançada de Kimono que la forma de mostra accedir a l'HTML únic element, que és super útil fins i tot si està treballant en Nokogiri. Així que si anem al lloc de Caiac, per exemple, es pot veure que hi ha és-- o potser vostè no pot veure. Però si jo et mostraré la URL de Caiac, això en realitat és només la URL d'origen. Aquest és l'URL abans de ser modificat per qualsevol scripts de JavaScript que han passant. I que va a tenir un aspecte diferent inspeccionar l'element. Així que si vostè va a través i vostè coincideix amb l'element Inspeccioni codi al codi font, és en realitat serà diferent. I aquesta és la raó fonamental per Nokogiri no pot raspar llocs carregats dinàmicament. Perquè és Nokogiri raspant la URL d'origen, mentre que kimono és en realitat raspar el que està essencialment veient a Seleccionar element. Així que si vaig a través i jo tractar de Kimonofy Caiac, De fet, em puc passar per i seleccioneu el preu. És una mica més difícil, i en aquest cas, és realment veure aquest preu com diferent d'aquests. Així que mentre que vostè pot configure-- o si això no es carrega dinàmicament, podria configurar Nokogiri per aconseguir tots aquests. A causa de que el format és lleugerament diferent per aquest llistat com es compara amb la resta d'ells, i vostè pot veure aquí s'ha anat realment i seleccionats tots els preus dels vols. Tal desig seleccionar temps de vol també. I puc anar a través i tipus de configurar aquest. Jo no vull això. Només vull el temps del proper vol. I després, després d'un parell d'aquests passant, es posa la imatge. Així quimono de molt intel·ligent. És que no és tan robust. Hi ha alguna altra alternatives que es poden utilitzar. I et vaig a mostrar aquí. Si vostè està més còmode en Python en lloc de Rubí, potser, hi ha una biblioteca anomenada Bella sopa. Vostè pot usar això. És molt similar a Nokogiri. Té algunes característiques més. Podeu trobar una etiqueta HTML i a continuació, desplaçar-se cap amunt o moure cap als costats. Hi ha PyQt. En realitat, això pot raspar dinàmica llocs, perquè és una mena de és una WebKit que pretén ser un navegador sense que en realitat ser un navegador. Així que seria esperar que tot el JavaScript per carregar primer, i després entrar i tractar de raspar el lloc. Si vols seguir amb Ruby, pot anar un nivell amunt de Nokogiri. Podeu utilitzar Carpincho amb un embolcall de Poltergeist. I això pot en realitat essencialment el mateix com PyQt, que és que és un WebKit. S'espera que el JavaScript per carregar primer. Si el violí voltant amb ell prou, fins i tot es pot aconseguir que es faci clic a les coses. Així que si hi ha un enllaç que no és un clàssic en el href el camí és de fàcil accés, i és una cosa que detecta JavaScript un clic, vostè pot realment fer això. La biblioteca més populars per simular un usuari és en JavaScript, que és PhantomJS. Òbviament, això pot raspar dinàmica llocs perquè això és essencialment pretenent ser Crom sense la interfície d'usuari. I després, per descomptat, el més robust, però l'opció més lenta, és una automatització navegador seleni. I, per desgràcia, no seràs capaç de fer això dins del seu IDE CS50. Perquè en essència el que fa és que arrenca la seva Chrome, Firefox, qualsevol navegador que voleu utilitzar, i fa un seguiment de potser el punter del ratolí moviment, el que vostè escriu en, i és només una mena de automatitza aquest procés. Per tant, es va desenvolupar com una mena de eina de prova d'automatització de pàgina web. Però un munt de gent utilitza El seleni per raspar llocs web que d'una altra manera tenen una moltes dificultats per raspar amb algunes d'aquestes altres eines, més ràpids. Així que això és tot el que tinc per al raspat web. Diverteix-te. AUDIÈNCIA: Pregunta. ROBERT KRABEK: Sí. AUDIÈNCIA: Existeix un mecanisme per discutir el lloc web pel que podria bàsicament passar per ella més endavant. ROBERT KRABEK: Sí. Així que posem el, en la nostra exemple, per a tots dos, posem tot el lloc web en el doc. I pel que podria en realitat només prendre la doc variable i escriure en un arxiu. Així que si jo volia, jo podria escriure com un arxiu HTML, i després en lloc d'utilitzar OpenURI i una sol·licitud cURL, llavors jo podria simplement obrir doc HTML i després buscar això. AUDIÈNCIA: Però pots conservar el tipus d'experiència en línia mentre que vostè fa fora de línia. Per exemple. quan estàs volar durant diverses hores, Vull bàsicament arxiu tota la pàgina web. [Inaudible] ROBERT KRABEK: Sí, això és exactly-- així que, literalment, el que això està fent s'està prenent tot que seria en aquesta direcció URL. Així que si ens trobem amb cURL, és tenint tot això en HTML, i és emmagatzemar- dins el document variable. Així que vostè pot fer el que vols fer amb el doc. Vostè pot donar sortida a un fitxer. AUDIÈNCIA: Però no va connectar. No és dinàmic. No és recursiu, oi? Veus el que vull dir? Estic tractant bàsicament una espècie de picada tot el lloc web en el meu disc dur perquè jo pogués fer-ho, bàsicament, durant diverses hores sense internet. ROBERT KRABEK: Correcte. Així que si jo had-- on és el meu arxiu d'E / S? Així que aquest és l'arxiu d'E / S. Així ho diuen en el seu lloc d'això, jo dic a això craigslist.html. M'obro a això. Jo havia posa doc en ella. Tanco l'arxiu. I després només perquè el CS50 IDE està en el núvol, això és el que sigui. Puc anar aquí. Jo puc descarregar l'arxiu. I llavors això seria en el meu disc dur. Així que vostè pot fer-ho d'aquesta manera. O si estàs a casa, no s'utilitza el CS50 IDE, com Sublim o alguna cosa així, això és encara més fàcil, perquè això és tot el disponible a nivell local, no lligat a internet. AUDIÈNCIA: Ja veig. Això és per a un problema particular. Pot fer-ho de forma recursiva perquè anar diverses capes de profunditat tipus de coses? ROBERT KRABEK: Puc descarregar carpetes així, si això és el que estàs demanant. AUDIÈNCIA: Sí. ROBERT KRABEK: Cool.