>> [REPRODUCCIÓN DE MÚSICA]
ROBERT KRABEK: Hola, chicos.
Mi nombre es Robert Krabek, y Voy a estar enseñando chicos
cómo raspar la web con Nokogiri, que es una biblioteca Ruby,
y kimono, que es una extensión de Chrome.
>> Así que primero hay un par de cosas que usted
puede hacer si tal vez usted ha estado haciendo todos los conjuntos de procesadores hasta el momento
y el espacio de trabajo es conseguir un poco lleno.
Podemos en realidad sólo ir y crear un nuevo espacio de trabajo para usted
que acaba de hacer un nuevo proyecto de la marca en.
Así que si usted desea continuar trabajando en el ID de plantilla CS50
que tiene actualmente, sentirse libre, y usted puede simplemente
instalar Nokogiri con CFLAGS joya equals-- instalar nokogiri.
Pero por lo demás te voy a mostrar cómo establecer un nuevo uno.
Y entonces este es esencialmente cayendo más ruedas de entrenamiento.
Y usted está codificando como si fueras simplemente la codificación en Sublime o algo así.
Así que si cambiamos la vuelta.
>> Así que decir que este es su actual CS 50 ID.
Usted puede ir a Cloud9 aquí.
Usted puede ir a su tablero de instrumentos.
Debe abrir pestaña Espacios de trabajo.
Y entonces usted puede simplemente haga clic aquí, crear un nuevo espacio de trabajo.
El nombre de su nuevo espacio de trabajo, tal prueba o raspado.
Y a continuación, haga clic en esta ficha costumbre aquí, lugar de la ficha plantillas CS50.
Y entonces usted puede ir y crear un nuevo espacio de trabajo.
>> Yo ya he creado un espacio de trabajo aquí.
Así que vamos a trabajar con esto.
Y si ha creado una nueva espacio de trabajo por lo que con la ficha Personalizar,
que sólo puede escribir gem install nokogiri, que no está pasando aquí.
OK, que es un poco congelado.
Pero puede escribir joya instalar nokogiri.
Y eso debería ser todo lo que hay a la instalación.
>> Como he dicho antes, si usted todavía está trabajando en su CS50 plantilla de ID,
sólo tiene que escribir CFLAGS es igual a gem install nokogiri.
Y yo ya he instalado desde aquí, así que no lo hará.
Pero para aquellos que siguen junto, no dude en hacerlo.
>> Así que una vez que tenga su Nokogiri área de trabajo o en la biblioteca instalada,
Voy a darle un poco de un curso intensivo en la sintaxis de Ruby
porque Nokogiri es una biblioteca de Ruby.
Por lo que usted necesita saber algunos básicos Sintaxis de Ruby para trabajar con Nokogiri.
Así que algunas diferencias básicas de lo que estamos acostumbrados
tal vez si usted ha estado trabajando hasta ahora en tan sólo C y PHP,
declara variables sin tipo.
No utilice punto y coma, que es una especie de alivio.
No hay paréntesis ahora alrededor para o mientras bucles, por ejemplo.
Sólo tienes un bloque de código, y a continuación, poner fin al final de eso.
No hay plus plus o menos negativo, por lo que sólo
saber que para cuando que estás haciendo por bucles,
sólo iguales más y menos iguales.
Y en lugar de hachís incluyen, vamos a usar requerir y luego
cualquiera que sea la biblioteca tratando cargar en su programa.
>> Ruby no es un lenguaje compilado.
Así que eso es otro alivio.
Es más similar a PHP donde es un lenguaje interpretado.
Puede ejecutar cualquier script Ruby que se escribe con Ruby siguió
por el nombre de su script o programa.
Para indicar que se trata de un programa de Ruby, que acaba de terminar con .rb lugar de .c.
Y no son variables matrices de tamaño en Ruby,
lo cual es muy práctico cuando estás raspado y tal vez desee añadir
datos que usted ha raspado en una matriz.
Usted no tiene que malloc una nueva matriz y copiar la matriz de edad en la nueva matriz.
Sólo puede añadir con los dos signos de flecha.
Y no hay caracteres, hay sólo cadenas de una sola letra.
Así que debe ser un poco más fácil.
>> Así que sólo te daremos algunos ejemplos de algunas sintaxis básica de Ruby.
Así que aquí se puede ver que en lugar de la barra barra, para comentar en Ruby,
sólo tiene que utilizar el signo libra.
Y la declaración de variables, que sólo tienes que escribir los iguales variables
lo que quieras la variable sea.
Pueden ser cadenas.
Usted puede tener matriz, que rellena con valores.
puts y las impresiones son similares.
Para nuestros propósitos, la única diferencia es realmente
que pone, lo que significa pone, simplemente pone una nueva línea
carácter en lo que está imprimiendo.
>> Así que si le damos un pequeño demostración aquí,
podemos ejecutar este con-- abrir una nueva terminal.
Puedes ver todos estos archivos que están en mi terminal.
Y si me quedo Ruby, intro.rb rubí, que
pone a cinco Hola Mather, Quincy, Carrier.
Adams.
Así que eso es todo lo que hay a las matrices que declaran.
AUDIENCIA: Robert, ¿puedes hacer su fuente un poco más grande?
ROBERT KRABEK: Sí.
Y puedo acercar porque no se puede acercar a las fuentes de terminal aparentemente.
>> Así es como imprimir las variables a su terminal.
También puedes usar variables dentro de una cadena.
Así recientemente en PHP, que podría haber aprendido
que hay interpolación cadena.
Así que si usted echa un vistazo aquí, si me declare tres variables, el nombre, la biblioteca,
y de lenguaje, y pone, me escribir una cadena, hola mi nombre es.
Y entonces, en lugar del PHP versión de la interpolación cadena
el que se ve un poco de la misma familia, usted tiene un signo de número y, a continuación,
una llave, y luego el nombre de la variable.
Y así es como desea imprimir, dice, cualquiera que sea el nombre de la variable es.
>> Y luego también puede concatenar cadenas.
Rubí hace super fácil con el signo más.
Sólo tienes una cuerda a la izquierda, más una variable
o otra cadena más una cadena.
Así que si puedo imprimir esto hacia fuera, lo que debería acaba de decir hola, mi nombre es Robert.
Voy a estar enseñando Nokogiri en Ruby.
>> Y vamos a confirmar que ese es de hecho la introducción ruby ​​caso--.
Hola, mi nombre es Robert.
Voy a estar enseñando Nokogiri en Ruby.
>> Cambiando de tema, si else, que es un poco diferente
de lo que podría ser utilizado para si usted ha estado trabajando en C.
Usted no necesita los paréntesis.
Usted no necesita las llaves.
Y en lugar de otra persona si, es un elsif concatenados.
Así que aquí, si me he declarado x arriba aquí, como podemos ver, x es todavía 5.
Así que si x es menor que 3, que va a poner pequeñas.
Si es inferior a 7, mediano, de lo grande.
Así 5 es un número medio.
Y termino este bloque de código con el extremo.
>> Aquí está mi bucle for.
Y esta sintaxis es también levemente diferente.
El 0 a cinco simplemente esencialmente está declarando una series de 0-5.
Así que hay cinco ranuras de la matriz.
Y a continuación, para cada ranura en ese matriz, que será incrementar i.
Así que este debe imprimir 0 a 5, o de 0 a 4.
Y esto debe imprimir medio.
>> Y voy a Just Blaze a través.
Ustedes tendrán acceso a este código más adelante.
Así que ustedes pueden ejecutar esta ustedes mismos.
>> Así que este es el bucle básico rato.
Esta será sólo la impresión de j, por incremento a 1 hasta que llegamos a 5.
>> Super rápido curso acelerado de Ruby sobre cómo escribir una función.
En lugar de, por ejemplo, int factorial número, sólo tenemos def.
Y esencialmente estás definir una función aquí.
Este va a ser el nombre de la función,
y esto es cualquier variable que quieren pasar a la función.
Usted puede tener si declaraciones prospectivas dentro.
Usted puede regresar.
En este caso, estamos la definición de una forma recursiva
función factorial aplicado.
Así que sólo nos llamamos funciones en Ruby como este.
>> Así que si he definido esto, puede llamar factorial, pase en 3,
y luego 3 será la variable número que puedo usar dentro de la función.
Y esto es sólo to_s convirtiendo la valor del factorial volver en una cadena.
De lo contrario esto va a tirar diciendo un error oh,
sin poder imprimir un string-- porque como usted recuerda,
pone las que se pone string-- porque este factorial ha vuelto un número.
Así que podemos convertir ese a una cadena como tales.
Y a la inversa, también puede convertir una cadena a un entero con to_i.
>> Así que hacer todo super simple, si acabo de comentar esto, guarde
y ejecutar la función factorial.
Debemos ser capaces de ver que factorial de 3 es 6.
Y eso es cierto.
>> Así que esa es tu curso intensivo en Ruby.
Y ahora que sabes Ruby, podemos seguir a la Nokogiri básica raspado configurar.
Básicamente todo lo que tienes que hacer es, en Ruby, requieren las bibliotecas.
Y para nuestros propósitos vamos a estar utilizando la biblioteca OpenURI así como Nokogiri.
Y entonces lo que hacer-- y va le dará la sintaxis para esto--
es abrir la URL tanto como lo haría en una solicitud cURL, que significa C URL.
>> Así que toma el URL de la página web en cuestión.
Puede almacenar en una variable.
Y entonces usted puede buscar a través de ese variable para etiquetas HTML únicos usando
el comando .css.
Y entonces usted puede dar salida a la contenido a donde quieras.
Puede comenzar en una base de datos.
Usted puede dar salida en un archivo, o incluso sólo imprimirlo en la pantalla.
>> Así que le mostraremos un raspador básica.
Así que hasta aquí se puede ver que tenemos requiriendo nokogiri, requerir-uri abierta.
Su configuración básica, vamos a llamarlo documento o doc,
es igual a Nokogiri :: HTML abierto, que es el comando proporcionada a nosotros por el OpenURI
biblioteca.
Y vamos a estar buscando, para aquellos de ustedes que podrían estar viviendo en el patio,
para bicicletas que se encuentran en Boston enumeran en la sección de bicicleta de Boston Craigslist
sitio.
>> Así que si usted no está familiarizado con cURL, sólo voy a
mostrar lo cURL hará muy rápido.
Si quisiera obtener toda la URL desde el sitio Craigslist, si escribo rizo,
sólo vuelca toda la URL desde el sitio de la bicicleta Craigslist
en mi terminal.
Eso no es todo útil porque no lo hago
quiero ir manualmente a través y encontrar lo que estoy buscando.
Pero para que lo puedas veo que estoy en realidad
utilizando el código de derecho, si nos fijamos en la URL de Craigslist en bikes--
por alguna razón no lo ha encontrado.
Si nos fijamos en esta página y nos fijamos en la URL,
esto debe ser idéntica a la solicitud cURL que acabo de envío.
Y de hecho, eso es lo que está siendo almacenado en la variable doc.
>> Así que cuando usted vuelve a nuestro código, a continuación, puede operar en esta variable doc
mediante el uso de .css.
Así que digo yo quería conseguir todos las etiquetas que son span.txt,
y todos los a etiquetas dentro esa etiqueta.
¿Y por qué podríamos querer hacer esto, te escucho llorar?
>> Si inspeccionamos Element, que le da un desglose de cómo se estructura la URL.
Si me desplazo hacia abajo a través aquí, se puede ver
lo que cada uno de estos diferentes elementos representa.
Así que tal vez quiero acceder este elemento particular.
Así que estoy usando desarrollador de Chrome herramientas para Inspeccionar Elemento.
Veo aquí que esta es un una etiqueta en un lapso
etiquetar con una clase de txt.
>> Así que ahora se pone a nuestro primera operación que
es palmo doc.css, que es la etiqueta que Busco dentro de toda esta URL.
Y luego .txt funciona muy parecido a CSS hace cuando estás escribiendo CSS
en sus archivos HTML por especificando una clase.
Así que este operador en particular lo hará especificar una etiqueta span con la clase de txt.
Y luego, si les dejo un espacio, esto luego ir dentro de esa etiqueta
y luego encontrar un una etiqueta dentro de ese.
>> Así que si acabo de poner esto a la terminal, que debería
podrá ver esencialmente todo es decir dentro de este lapso de clase txt.
Así que vamos a dar que una oportunidad.
rubí craigslist-rascador.
Y, en efecto, que nos da todas estas etiquetas de los diferentes listados que
están en la página Craigslist.
>> Así que si nos remontamos, podemos convertir esto en algo un poco más útil.
Tal vez queremos sólo los vínculos.
Porque dentro de esta etiqueta, voy también tener el hipervínculo de la ruta
que esta página va a.
Así que si nos fijamos en el código aquí lo que voy a hacer es en lugar de .css,
Puedo ir at_css.
Y esto acaba de obtener el primer elemento de todas esas cosas.
Así que si yo fuera a hacer eso en el código Acabo demostrado anteriormente,
en lugar de devolver todo de este, que sería sólo
entregará el primero de ellos.
Así es como funciona el operador at_css.
>> Así que queremos almacenar el ruta de toda la primera una etiqueta.
Y porque nos dará una A-- por lo que todavía vamos a utilizar .css.
Pero debido a que este se va a dar nosotros volver a todo un conjunto de etiquetas,
vamos a acceso el primer elemento.
Así que esta es otra manera que pueda acceder a cualquier elemento en particular si
tener un conjunto de elementos que se devuelve,
porque se puede tratar cualquier cosa que vuelve .css como una matriz, esencialmente.
Y luego vamos a tener acceso a la atributo de referencia de hipertexto de esta.
>> Así que si usted echa un vistazo, si te veías muy cerca de aquí,
si lo que esencialmente mirar la barra de URL,
este es el camino que usted va a ser raspado.
Así que si nos corremos esto de nuevo, y asegurarnos de que hemos ahorrado él.
Usted puede comprobar en casa.
Este hecho coincide con este enlace.
>> ¿Entonces por qué podríamos querer usar esto?
Si desea raspar la página y tiene
una página de enlaces como Craigslist hace,
puede ser que desee ir a continuación en cada uno de esos enlaces
y luego raspar la contenido de ese, que
es exactamente lo que vamos a hacer.
>> Así que una vez que tenga trayectoria como variables, ya no muy
se preocupan por imprimirlo.
Sólo tengo que guardarlo como una variable.
Y entonces puedo acceder a otro La página de la misma manera puedo acceder
doc en el primer lugar.
Excepto con la URL, vamos utilizar interpolación de cadenas
como si estuviera describiendo en Rubí anterior sobre anexar
el camino hasta el final de la raíz.
>> Así que lo que esto va a hacer es esto va a poner en el camino
que Raspé previamente y luego convertir ese
en un nuevo elemento, lo que quieras llaman it-- first_listing, por ejemplo.
Pero yo voy a dejar que sobre el tema, por ahora,
porque eso es lo que estoy usando aquí.
>> Así que decir que me quería conseguir la descripción de la primera publicación en Craigslist.
Así que me gustaría ir por aquí.
Me clic en Inspeccionar Elemento de nuevo, porque se trata de la descripción.
Me gustaría ir aquí y veo si puedo encontrar cómo podría
ser capaces de buscar esta etiqueta única.
Y en este caso, tiene una identificación, lo que nos lleva
a nuestro siguiente manera de buscar etiquetas, que es con un hashtag.
>> Así que para las clases, puede utilizar el operador punto.
Así .txt está especificando una clase de txt, mientras que el hash especifica un ID.
Así pues, en este caso, la etiqueta es sección y el ID es postingbody.
>> Así que esto va y encuentra el primero-- porque somos
utilizando at_css-- este va y Busca el primer elemento que
viene con la etiqueta de la sección y el ID de postingbody.
Y entonces usted puede acceder al elemento de texto de ese artículo devuelto con .text.
Y entonces podemos almacenar que en la descripción.
>> Así que ahora que tenemos una descripción de la variable,
podríamos ser capaces de hacer, por ejemplo, File I / O. Así presentar de E / S en Ruby
es muy similar al archivo de E / S en C, donde abrimos un archivo.
Podríamos escribir en él.
Y luego vamos a cerrar ese archivo.
>> Así que aquí, sólo estamos nombrando el presentar, alguna variable arbitraria.
También podríamos haber sólo hay que poner esto aquí.
Tenemos una variable que estamos almacenando el archivo abierto como con File.open.
Y estamos escribiendo a este archivo, así que lo abrimos con el operador w.
Y luego ponemos cadena en la presentar ante el operador .puts.
Y luego ponemos la variable que nos quiero escribir en el fichero dentro de ese.
Y luego pues sólo cerramos el archivo.
>> Así que si seguimos adelante y ejecutar esto, esto debería producir un documento
con description.txt que lo hará tener esta descripción dentro de ella.
Así que si me quedo it-- no.
Se produce un archivo de texto con, con suerte, la misma cosa.
Así que podría haber habido un nuevo anuncio que ha surgido mientras yo he estado hablando.
Y de hecho parece que se ha producido.
Así que si nos vamos a esta moto clásica, 1.962 a 1966, que parece coincidir.
Y ahí lo tienes.
>> Así que eso es lo más básico funcionalidad de raspado.
Podríamos tener lugar de sólo escribir a este archivo,
podemos añadir cosas a una matriz.
Así que si me declaro tres matrices, título, precio y descripción.
Y estamos operando en el elemento doc ahora.
Podemos ir a través y encontrar toda la span.txt.
Y recuerde, esto devuelve una matriz de todos los elementos que encuentra.
Y luego, en Rubí, sólo puede utilizar .Cada para recorrer cada artículo
de la matriz.
Y a continuación, para cada artículo, Yo sólo voy a llamarlo
un vínculo, porque eso es esencialmente lo que es.
>> Así que si me pongo cada a.hdrlnk punto link.css, este es en realidad va al enlace
y encontrar dentro de ese enlace otra Elemento HTML y la clase correspondiente.
Así que si tenemos en cuenta lo este fue el span.txt,
puede ver- permítanme volver quick-- real dentro span.txt
tenemos un montón de otras clases.
Así que dentro de span.txt, estamos buscando para una una etiqueta con un hdrlnk clase.
Así que permítanme encuentro que para ustedes muy rápido.
>> Así que usted puede ver aquí, este es un una etiqueta eso es en el lapso de clase txt
que tiene el hdrlnk clase.
Y eso es precisamente lo que que estamos tratando de conseguir.
>> Así que ahora estamos tratando de almacenar todos de esos vínculos dentro del título.
Y luego vamos a imprimir a cabo cada uno de esos enlaces.
No, lo siento.
Vamos a imprimir el precio de cada uno de esos.
Así que vamos a correr esta realidad rápido y ver lo que hace.
>> Así que esto sólo básicamente fue a través de cada uno de los enlaces
a su vez, visitada la etiqueta en cuestión, y luego sacó el precio.
Y lo hizo porque después lo tienes todo en el título,
que acabamos guardaron el título allí.
Acabamos guardaron el enlace dentro del título matriz.
Y en esto para el funcionamiento de bucle, donde en lugar de ir a a.hdrlnk,
estamos buscando un span.price.
Así que si puedo realmente encontrar rápidamente el precio, si usted examina el elemento,
verás que es un lapso con la clase de precio.
Y eso es básicamente cómo estamos recibiendo el precio allí.
>> Así que esa es la verdad caso básico de raspado.
Así es como se consigue todo los elementos de una página
que, por ejemplo, que ya conocen la URL de.
>> Así que si queremos conseguir un poco más en profundidad,
podemos raspar las páginas de páginas.
Y para este ejemplo, voy a ser la salida a un archivo CSV.
Así que estoy requiriendo csv aquí porque Ruby no tiene, dentro de sí mismo,
tener la funcionalidad a archivos CSV salida justa.
Así que eso es super simple.
Déjenme ir a la siguiente.
Cubrimos archivo de E / S. Así que esto es similar a lo que pasa en C.
Y antes de pasar a Kimono, Voy a mostrarles que realmente rápida cómo
para raspar los sitios dentro de lugares de interés.
>> Así que ya aprendimos para declarar matrices en Ruby.
Así que estoy declarando un manojo de matrices arbitrarias
que va a almacenar datos dentro.
doc está funcionando de la misma manera como lo hizo en el archivo anterior.
Vamos a entrar, encontrando cada uno de los de span.txt.
Ya sabemos que.
Ese es el recipiente dentro del cual cada enlace tiene todos los datos que queremos.
>> Así que aquí lo que estamos haciendo es que cada enlace de span class txt, vamos en
y estamos encontrando la una etiqueta, encontrar el primer elemento de eso.
Recuerde, .css devuelve una matriz, por lo que no sólo puede acceder a ella de inmediato.
Vamos a encontrar el primer elemento.
Incluso si se trata de una matriz de un solo artículo, usted tiene que utilizar esta sintaxis,
y luego sacar el atributo href.
>> Así lo hicimos antes.
Así que esto debe parecer familiar.
Y por lo que ahora tenemos una matriz llamados caminos de todos nuestros enlaces
que vamos a querer utilizar.
Así que si tenemos este conjunto de todos de los caminos que queremos utilizar,
entonces podemos crear un artículo para cada uno de esas páginas cuando abrimos esa página.
Así como también vimos en la sintaxis antes, donde
haciendo interpolación cadena con la ruta aquí, por lo que la sintaxis es sólo para la ruta.
Y yo podría llamar a esta variable de cualquier nombre arbitrario.
>> Este es el importante.
Esta es la matriz que Tú ser acceder a cada elemento.
Pero cuando dices de ruta en caminos, esto significa para cada elemento de caminos,
llamarlo camino, y usar eso.
Esto es esencialmente igual que cuando hacer un bucle y se utiliza int i.
Así que usted puede tratar el camino que el variable que está incrementando.
>> Y a continuación, para cada uno de aquellos, entrar en cada uno de esos enlaces.
Porque estamos almacenarlo en la página del artículo, por lo que estamos creando una nueva página cada vez que
accedemos a ella.
Y luego dentro de esa nueva página, encontrará span.postingtitletext, span.price,
y luego la sección # postingbody.
Ya hemos cubierto la sección # postingbody cuando nos fijamos en la descripción.
>> Así que podemos ir a ver en el post Craigslist, si lo que buscas en el título,
se puede ver aquí, postingtitletext palmo.
Y es por eso que está ahí.
Y luego por el precio, que puede acceder a ella con span class de precio.
>> Así que quizá también podría desea almacenar la URL.
Así que sólo tendremos que ejecutar este de nuevo, guárdelo en una matriz,
porque si lo que buscas en Craigslist, eres
probablemente va a querer una manera, si usted ve algo que le interesa,
volver a ese sitio.
Así que lo que desea es almacenar la dirección URL de referencias sake.
>> Esto es sólo esencialmente otra sintaxis del bucle for.
Yo sólo pude hacer paths.each lugar por un camino en caminos con índice.
Y esta es la sintaxis de Ruby para-- camino es lo que hemos hecho hasta aquí,
declarar una variable para cada elemento.
Y el índice se comporta como el i en C para los bucles.
Así que usted puede realizar un seguimiento de lo que el índice es.
>> Así que aquí es sólo una pequeña cosa conveniente
para cuando se está ejecutando el rascador.
Si usted está raspando cientos de páginas, para asegurarse de que no está colgado,
Se acaba de salida, Estoy acceder a esta página,
y asegurarse de que todavía está continuando.
Pero para nuestros propósitos, ya que hay un centenar de artículos,
Voy a tener acceso a sólo tres de ellos por lo que no nos quedemos sin tiempo aquí.
>> Pero antes de llegar a eso, yo sólo soy va a mostrar que realmente rápida,
Voy a emitir el título, precio, descripción y URL
de cada uno de los enlaces que he raspado.
Y entonces esto es sólo el sintaxis para la biblioteca de CSV.
Usted abre un archivo CSV.
Esto es lo que voy a llamarlo.
Abra con escritura do.
Y luego CSV será el archivo que usted está introduciendo todo en.
Esto es sólo una prueba de cordura para yo sé que se está ejecutando.
Y esta es mi prueba de cordura saber que se ha completado.
Así que me voy a poner el título en una fila CSV, precio, URL, descripción,
todos en las filas de la CSV.
>> Así que si vamos y ejecución este ahora-- y yo
asegurarse de que me he ahorrado it-- lugar de tan sólo dar salida a la terminal,
debemos tener un archivo CSV archivo que se produce.
Así que aquí podemos ver el CSV archivo que se ha producido.
Esta es la salida del Scape que me acabo de encontrar.
Como se puede ver aquí, Acceso a la página 0, 1, 2, 3.
Estos son los títulos, precios, descripciones.
Y si nos fijamos en este CSV archivo que hemos generado,
se puede ver su emitida aquí.
No se trata de Excel, así que no es formateado en filas y columnas.
Pero usted puede imaginar cómo podría ser formateado.
>> CSV significa valores separados por comas.
Así que usted puede imaginar que esto podría ser una fila.
Y cada coma haría indicar una columna separada.
Sólo una palabra de caution-- a veces eres
raspando las cosas con una gran cantidad de comas.
Así que si estás salida en un archivo CSV,
Puede que no la salida del manera usted podría pensar.
>> Así que eso es esencialmente todo lo que hay que raspar HTML básico
páginas con Nokogiri.
>> Así el ser internet innovadora, ya que ha llegado
con un más automatizado y GUI versión, aunque menos robusta
versión de raspado de varios sitios web.
Y para nuestros propósitos Voy a estar demostrando
una extensión de Chrome llamada kimono.
Y todo lo que tienes que hacer es navegar a la página que desea raspar.
Hace clic en un campo de interés.
Calibrar los campos, porque automáticamente
detectar lo que piensa quieres ser raspado,
y entonces usted acaba de crear una API.
>> Así que si tuviéramos que demostrarlo en Craigslist, que en realidad no iba a funcionar.
Y esto es lo que iba a volver a diciendo de que no fuera tan robusta.
Tiene problemas para crear la API.
Pero como una demostración de lo que iba a hacer,
si instala la extensión de Chrome, todo lo que hacemos es hacer clic en él.
Se Kimonofies la página, y luego haz click con el que quiero guión.
>> Así que si yo fuera a hacer clic en que, sería resaltar
lo que piensa que quiero ser raspado de esa página.
Así que tal vez yo llamo esta lista de propiedades.
Este es el número de elementos que he seleccionado.
Y yo sólo puedo confirmar o negar algunos de las otras listas sugeridas
para conseguir que añadir a lo que se raspa.
>> Así que ahora podemos ver que hay un centenar de artículos seleccionados.
Si quiero tener otro campo que yo También raspar que se relaciona con esto,
digo que quiero raspar el precio así, entonces yo puedo hacer lo mismo.
>> Así que aquí está una demostración de cómo es mucho menos robusta, porque ahora es
recogiendo la ciudad en lugar de sólo el precio que yo quiero.
Y ahora se recogió 200 cosas.
Usted puede volver atrás y borrar.
Puedes intentarlo de nuevo.
Pero no hay garantías.
Así es como funciona esto a veces.
Como se puede ver aquí, ahora dice 96 aquí.
Se recogió la mayor parte de los enlaces que desea raspar, pero no
necesariamente todos ellos.
>> Otra herramienta útil de kimono aunque es que usted puede ir a las funciones avanzadas
aquí, vaya a Avanzado, y se le mostrará
la ruptura de la única manera de acceder al HTML
etiquetas que desea raspar.
Así que para los anuncios, si nos fijamos en aquí, si accede div p lapso abarcan una,
en realidad se puede utilizar sólo esto en su código Nokogiri,
donde antes habíamos span.txt para acceder a cada uno de los anuncios.
Si sólo quiero el texto dentro de los listados,
Pude entrada espacio div p lapso space lapso espacio una,
y sería lograr el mismo efecto.
Y para aquellos de ustedes que están interesados en el uso de expresiones regulares,
pasa a también le dará la regularidad expresión de ordenación de la cadena a la entrada
para encontrar las cosas usted está tratando de encontrar.
>> Así que hay otra característica interesante Kimono de donde se puede paginar,
que no sólo puedo raspar los resultados de esta página,
Puedo hacer clic en este pequeño botón Los, paginación,
especificar el botón que llévame a la página siguiente,
y luego se acaba de saber que se puede repetir a la siguiente página,
y luego raspar todos el-- siempre ya que es el mismo formato de supuesto--
scape todos esos vínculos también.
>> Así pues kimono no quiere Trabajamos con Craigslist, lo que hemos hecho
es que he Kimonofied el Harvard Crimson.
He saqué algunos de la clase de top artículos destacados, confirman aquí.
Decir todo esto.
He compilado esta API para usted antes de tiempo.
Pero por lo demás lo que harías es que usted simplemente le clic en Listo.
Introduzca sus datos de API.
Ajústelo a cualquiera rastreo automatizado o manual.
Así que usted puede actualizar su datos cada 15 minutos,
semanal, diario, lo que quieras.
El nombre de su API.
Cree el API.
Para su beneficio, he creado el Carmesí página API delante ya.
>> Así que usted acaba de crear una cuenta en kimono, y
almacenará todos sus APIs para usted.
Así que, esencialmente eso es todo lo que su raspaduras diferentes separadas.
>> Así que si miramos aquí, este es el dictámenes enlaces que he recogido.
Estos son los destacados enlaces que he recogido.
Y estos son los más leídos vínculos que yo he recogido
de esta última scape API.
>> Así que si usted puede ver aquí, éstos serían los presentados,
estos serían los dictámenes, que en este ejemplo,
Los he combinado todos en una colección.
Pero si usted acaba de jugar un rato con él un poco, puede dividirlo
y dividirlo embargo desea, siempre y
como el formato es ligeramente diferente.
>> Sólo para jugar con esto, el rastreo de configurar, uno de los inconvenientes
es que sólo puede rastrear hasta 25 páginas a la vez.
Ese es uno de los factores limitantes.
Pero aquí, si se establece al arrastre manual, este
es cómo se puede decir que Para actualizar sus datos.
Y aquí se puede ver el historial de rastreo de todo lo que usted ha rastreado.
Y ustedes pueden volver, crea, jugar con todas las diferentes maneras
que se puede modificar y utilizar sus datos.
>> Kimono puede ser configurado para raspar enlaces dentro de enlaces.
Y usted hacerlo primero raspando una lista de enlaces,
y luego utilizar esa API como una saltar de punto para otro API
que crea la secuencia de comandos.
Pero eso es más complicado que lo que vamos a conseguir en la actualidad.
>> Así que eso es kimono.
Vamos a hablar de los pros y contras de Nokogiri y kimono.
>> Nokogiri, es muy rápido.
Es fácil de probar.
Usted puede simplemente pone nada consola, fácil de configurar.
Usted puede decidir exactamente lo quiere raspar y almacenar.
No hay límite de páginas.
En realidad, yo usé para raspar como 1800 sitios web sudafricanos escolares
mensajes de correo electrónico para una pasantía de haberlo hecho.
>> Así que eso es posible, aunque las mejores prácticas sería dividir el guión.
Porque si no, a continuación, usted no consigue nada.
Pero si lo hace un centenar, tal vez 200 páginas a la vez,
entonces usted tiene alguna posibilidad de, al menos, conseguir que poco a poco, sobre todo
si usted tiene mal internet.
>> Por desgracia, sólo se puede raspar HTML.
Así que si usted tiene pages-- cargada dinámicamente
y yo te mostraré un ejemplo como Kayak en un second--
Nokogiri desgracia no puede raspar eso.
>> Pero Kimono también es fácil de usar.
Como se vio, es esencialmente un punto y clic.
Se puede raspar JavaScript.
Desafortunadamente, no hay un máximo a la cantidad de páginas que puede raspar.
A veces es un poco difícil de configurar.
Se se confunde.
Pero es sin duda algo a considerar
si usted no está tratando de tener una raspadura mantenible súper robusta.
Si lo que desea es obtener todo lo que fuera de una página rápidamente,
entonces Kimono es una realidad buena herramienta a utilizar.
Y como he mencionado antes, no hay la característica avanzada de Kimono
que la forma de muestra acceder al HTML único
elemento, que es super útil incluso si está trabajando en Nokogiri.
>> Así que si vamos al sitio de Kayak, por ejemplo, se puede ver que hay es--
o tal vez usted no puede ver.
Pero si yo te mostraré la URL de Kayak, esto en realidad es sólo la URL de origen.
Este es el URL antes de ser modificado por cualquier scripts de JavaScript
que han pasando.
Y que va a tener un aspecto diferente inspeccionar el elemento.
>> Así que si usted va a través y usted coincide con el elemento Inspeccione
código al código fuente, es en realidad va a ser diferente.
Y esta es la razón fundamental por Nokogiri no puede raspar sitios cargados dinámicamente.
Porque es Nokogiri raspando la URL de origen,
mientras que kimono es en realidad raspar lo que está esencialmente
viendo en Seleccionar elemento.
>> Así que si voy a través y yo tratar de Kimonofy Kayak,
De hecho, me puedo pasar por y seleccione el precio.
Es un poco más difícil, y en este caso, es
realmente ver este precio como diferente de estos.
Así que mientras que usted puede configure-- o si esto no se carga dinámicamente,
podría configurar Nokogiri para conseguir todos estos.
>> Debido a que el formato es ligeramente diferente para este listado
como se compara con el resto de ellos, y usted puede ver aquí
se ha ido realmente y seleccionados todos los precios de los vuelos.
Tal deseo seleccionar tiempo de vuelo también.
Y puedo ir a través y tipo de configurar ese.
Yo no quiero eso.
Sólo quiero el tiempo del próximo vuelo.
Y luego, después de un par de estos pasando, se pone la imagen.
Así kimono de muy inteligente.
Es que no es tan robusto.
>> Hay alguna otra alternativas que se pueden utilizar.
Y te voy a mostrar aquí.
Si usted está más cómodo en Python en lugar de Rubí, tal vez,
hay una biblioteca llamada Hermosa sopa.
Usted puede usar eso.
Es muy similar a Nokogiri.
Tiene algunas características más.
Puede encontrar una etiqueta HTML y a continuación, desplazarse hacia arriba o mover hacia los lados.
>> Hay PyQt.
En realidad, esto puede raspar dinámica sitios, porque es una especie de
es una WebKit que pretende ser un navegador sin que en realidad
ser un navegador.
Así que sería esperar a que todo el JavaScript para cargar primero, y luego
entrar y tratar de raspar el sitio.
>> Si quieres seguir con Ruby, puede ir un nivel arriba de Nokogiri.
Puede utilizar Carpincho con un envoltorio de Poltergeist.
Y esto puede en realidad esencialmente lo mismo
como PyQt, que es que es un WebKit.
Se espera a que el JavaScript para cargar primero.
Si el violín alrededor con él lo suficiente, incluso se puede conseguir que se haga clic en las cosas.
>> Así que si hay un enlace que no es un clásico en el href
el camino es de fácil acceso, y es algo que detecta JavaScript
un clic, usted puede realmente hacer eso.
La biblioteca más populares para simular un usuario
es en JavaScript, que es PhantomJS.
Obviamente, esto puede raspar dinámica sitios porque esto es esencialmente
pretendiendo ser Cromo sin la interfaz de usuario.
>> Y luego, por supuesto, el más robusto, pero la opción más lenta,
es una automatización navegador selenio.
Y, por desgracia, no vas a ser
capaz de hacer esto dentro de su IDE CS50.
Porque en esencia lo que hace es que arranca su Chrome,
Firefox, cualquier navegador que desea utilizar,
y hace un seguimiento de tal vez el puntero del ratón movimiento, lo que usted escribe en,
y es sólo una especie de automatiza este proceso.
Por lo tanto, se desarrolló como una especie de herramienta de prueba de automatización de página web.
Pero un montón de gente utiliza El selenio para raspar sitios web
que de otro modo tienen una muchas dificultades para raspar
con algunas de estas otras herramientas, más rápidos.
>> Así que eso es todo lo que tengo para el raspado web.
Diviértete.
>> AUDIENCIA: Pregunta.
>> ROBERT KRABEK: Sí.
>> AUDIENCIA: ¿Existe un mecanismo para discutir el sitio web por lo que podría básicamente
pasar por ella más adelante.
ROBERT KRABEK: Sí.
Así que ponemos el, en nuestra ejemplo, para ambos,
ponemos todo el sitio web en el doc.
Y por lo que podría en realidad sólo tomar la doc variable y escribir en un archivo.
Así que si yo quería, yo podría escribirlo como un archivo HTML,
y luego en lugar de utilizar OpenURI y una solicitud cURL,
entonces yo podría simplemente abrir doc HTML y luego buscar eso.
>> AUDIENCIA: ¿Pero puedes conservar el tipo de experiencia en línea
mientras que usted hace fuera de línea.
Por ejemplo. Cuando tu estas volar durante varias horas,
Quiero básicamente archivo toda la página web. [INAUDIBLE]
>> ROBERT KRABEK: Sí, eso es exactly-- así que, literalmente, lo que esto está haciendo
se está tomando todo que sería en esta dirección URL.
Así que si nos encontramos con cURL, es teniendo todo esto en HTML,
y es almacenarlo dentro del documento variable.
Así que usted puede hacer lo que quieres hacer con el doc.
Usted puede dar salida a un archivo.
AUDIENCIA: Pero no conectó.
No es dinámico.
No es recursivo, ¿verdad?
¿Ves lo que quiero decir?
Estoy tratando básicamente una especie de picadillo todo el sitio web en mi disco duro
para que yo pudiera hacerlo, básicamente, durante varias horas sin internet.
>> ROBERT KRABEK: Correcto.
Así que si yo had-- ¿dónde está mi archivo de E / S?
Así que este es el archivo de E / S. Así lo dicen en su lugar de esto, yo llamo a esto craigslist.html.
Me abro a eso.
Yo había pone doc en ella.
Cierro el archivo.
Y luego sólo porque el CS50 IDE está en la nube, eso es lo que sea.
Puedo ir aquí.
Yo puedo descargar el archivo.
Y entonces eso sería en mi disco duro.
Así que usted puede hacerlo de esa manera.
O si estás en casa, no se utiliza el CS50 IDE, como Sublime o algo así,
esto es aún más fácil, porque esto es todo lo disponible a nivel local,
no atado a internet.
>> AUDIENCIA: Ya veo.
Esto es para un problema particular.
¿Puede hacerlo de forma recursiva para que ir varias capas de profundidad tipo de cosas?
>> ROBERT KRABEK: Puedo descargar carpetas así, si eso es lo que estás pidiendo.
AUDIENCIA: Sí.
>> ROBERT KRABEK: Cool.