>> [Música tocando]
ROBERT KRABEK: Olá, pessoal.
Meu nome é Robert Krabek, e I estará ensinando-lhe caras
como raspar a web com Nokogiri, que é uma biblioteca Ruby,
e Kimono, que é uma extensão do Chrome.
>> Então, primeiro há uma Algumas coisas que você
pode fazer se talvez você tenha sido fazendo todas as Série de Exercícios até agora
e seu espaço de trabalho é ficando um pouco cheio.
Na verdade, podemos apenas ir e criar um novo espaço de trabalho para você
apenas para fazer um novo projeto no.
Então, se você quiser continuar trabalhando na identificação do modelo CS50
que você tem atualmente, sinta-se livre, e você pode apenas
instalar Nokogiri com CFLAGS gem equals-- instalar nokogiri.
Mas por outro lado eu vou lhe mostrar como definir um novo up.
E então este é, essencialmente, caindo mais rodas de treinamento.
E você está programando como se estivesse apenas a codificação em Sublime ou algo assim.
Então, se nós transferi-lo de novo.
>> Então, dizer que este é o seu atual CS 50 ID.
Você pode simplesmente ir para Cloud9 aqui.
Você pode ir ao seu painel.
Ele deve trazer guia espaços de trabalho.
E então você pode simplesmente clicar aqui, criar um novo espaço de trabalho.
Nome do seu novo espaço de trabalho, talvez teste, ou raspagem.
E, em seguida, clique neste separador personalizado aqui, em vez da guia modelos CS50.
E então você pode simplesmente ir e criar um novo espaço de trabalho.
>> Eu já criou um espaço de trabalho aqui.
Então vamos trabalhar com isso.
E se você criou um novo espaço de trabalho para com a guia Personalizar,
você pode simplesmente digitar gem install nokogiri, o que não está acontecendo aqui.
OK, é um pouco congelado.
Mas você pode digitar gem install nokogiri.
E isso deve ser tudo o que existe para a instalação.
>> Como eu disse antes, se você ainda estiver trabalhando em seu CS50 modelo de ID,
você só precisa digitar CFLAGS é igual a gem install nokogiri.
E eu já instalado -lo aqui para que eu não vou fazer isso.
Mas para aqueles que seguem junto, não hesite em fazê-lo.
>> Portanto, uma vez que você tenha seu Nokogiri espaço de trabalho ou biblioteca instalado,
Vou dar-lhe um pouco de um curso intensivo de sintaxe de Ruby
Nokogiri porque é uma biblioteca Ruby.
Então você precisa saber algumas informações básicas Sintaxe Ruby para trabalhar com Nokogiri.
Por isso, algumas diferenças básicas a partir do que você está acostumado a
talvez se você está trabalhando até agora em apenas C e PHP,
você declarar variáveis ​​sem tipo.
Você não usa ponto e vírgula, que é uma espécie de alívio.
Não há agora cerca de parênteses for ou while loops, por exemplo.
Você apenas tem um bloco de código, e então você colocar fim no final desse.
Não há nenhuma plus plus ou menos de menos, então apenas
sabemos que para quando você está fazendo para loops,
apenas mais iguais e menos iguais.
E, em vez de haxixe incluem, você vai usar e depois exigir
o que quer tentar biblioteca para carregar em seu programa.
>> Ruby não é uma linguagem compilada.
Então, isso é outra alívio.
É mais semelhante ao PHP onde é uma linguagem interpretada.
Você pode executar qualquer script Ruby que você escreve com Ruby seguido
com o nome de seu script ou programa.
Para significar que é um programa Ruby, você acabou de terminar com .rb em vez de .c.
E há variável matrizes de tamanho em Ruby,
que é super conveniente quando você estiver raspagem e talvez deseja anexar
dados que você raspou em uma matriz.
Você não tem que malloc uma nova matriz e copiar a matriz antiga para a nova matriz.
Você pode apenas anexar com os dois sinais de seta.
E não há caracteres, não apenas a sequências de letras individuais.
De modo que deve ser um pouco mais fácil.
>> Então vamos dar-lhe algum exemplos de alguns sintaxe básica Ruby.
Então, aqui você pode ver que em vez de a barra barra, para comentar, em Ruby,
você só usar o sinal de libra.
E declaração de variável, você basta digitar as variáveis ​​iguais
o que quiser a variável a ser.
Eles podem ser strings.
Você pode ter matriz, que você preencher com os valores.
puts e estampas são semelhantes.
Para nossos propósitos, o única diferença é realmente
que coloca, que significa puts, apenas coloca uma nova linha
caráter em tudo o que está imprimindo.
>> Então, se nós damos uma pequena demonstração aqui,
podemos executar este com-- abrir um novo terminal.
Você pode ver todos estes arquivos que estão em meu terminal.
E se eu simplesmente executar Ruby, intro.rb rubi, ele
põe para fora cinco Olá Mather, Quincy, portador.
Adams.
Então, isso é tudo o que há para matrizes que declaram.
AUDIÊNCIA: Robert, você pode fazer o tipo de letra um pouco maior?
ROBERT KRABEK: Sim.
E eu posso aumentar o zoom, porque você não pode ampliar a fontes terminais aparentemente.
>> Então é assim que você imprime variáveis ​​para o seu terminal.
Você também pode usar variáveis ​​dentro de uma seqüência de caracteres.
Então, recentemente em PHP, você poderia ter aprendido
que há interpolação de string.
Então, se você der uma olhada aqui, se eu declarar três variáveis, nome, biblioteca,
e língua, e eu puts, eu escrever uma corda, Olá meu nome é.
E, em seguida, em vez de o PHP versão de interpolação de string
que parece um pouco mais goste disto, você tem um sinal de libra, e, em seguida,
uma chaveta, e, em seguida, o nome da variável.
E é assim que você imprimir, digamos, qualquer que seja o nome da variável é.
>> E então você também pode concatenar strings.
Rubi torna super fácil com o sinal de mais.
Você só tem uma corda no lado esquerdo, mais uma variável
ou outra seqüência mais uma cadeia.
Então, se eu imprimir esta fora, que deveria apenas dizer Olá, meu nome é Robert.
I estará ensinando-lhe Nokogiri em Ruby.
>> E vamos apenas confirmar que que é de fato o ruby ​​introdução case--.
Olá, meu nome é Robert.
I estará ensinando-lhe Nokogiri em Ruby.
>> Seguindo em frente, se else, é um pouco diferente
a partir do que você pode ser usado para se você está trabalhando em C.
Você não precisa dos parênteses.
Você não precisa as chaves.
E em vez de outra pessoa se, é um elsif concatenada.
Então, aqui, se eu tiver declarado x up aqui, como podemos ver, ainda x 5 é.
Então, se x é inferior a 3, ele vai colocar pequena.
Se for inferior a 7, médio, outra grande.
Assim, 5 é um número médio.
E eu acabar este bloco de código com end.
>> Aqui está o meu loop for.
E essa sintaxe é também ligeiramente diferente.
O 0 a cinco apenas essencialmente é declarar um matrizes de 0-5.
Portanto, há cinco slots na matriz.
E, em seguida, para cada intervalo de tempo em que array, eu vou estar incrementando i.
Portanto, este deve imprimir 0-5, ou 0-4.
E isso deve imprimir médio.
>> E eu vou brilhar através.
Vocês terão acesso a este código mais tarde.
Então vocês podem executar este vós.
>> Portanto, este é o seu ciclo básico enquanto.
Esta será apenas imprimir j, incrementando por 1 até chegarmos 5.
>> Super rápido curso intensivo de Ruby sobre como escrever uma função.
Em vez de, digamos, int fatorial número, só temos def.
E, essencialmente, você está definindo uma função aqui.
Este vai ser o nome da função,
e isto é todas as variáveis ​​que você quer passar para a função.
Você pode ter se declarações dentro.
Você pode retornar.
Neste caso, estamos definição de uma forma recursiva
função fatorial implementado.
Então, nós apenas chamar funções em Ruby como este.
>> Então, se eu defini isso, eu pode chamar fatorial, passar em 3,
e, em seguida, 3 será a variável número que eu posso usar dentro da função.
E este é apenas to_s transformando o valor dos fatorial voltar em uma string.
Caso contrário, este vai jogar um erro dizendo oh, I
Não é possível imprimir um string-- porque como você se lembra,
coloca é colocado string-- porque este fatorial retornou um número.
Assim, podemos converter esse para uma string como tal.
E, inversamente, você também pode converter uma string para um inteiro com to_i.
>> Assim, fazer tudo o super simples, se eu comentar isto, salvar
e executar a função fatorial.
Devemos ser capazes de ver que fatorial de 3 a 6.
E isso é verdade.
>> Então, esse é o seu curso intensivo em Ruby.
E agora que você sabe Ruby, podemos continuar ao Nokogiri básica raspagem configurar.
Essencialmente tudo o que você tem a fazer é, em Ruby, exigir que as bibliotecas.
E para os nossos propósitos vamos estar usando o OpenURI biblioteca bem como Nokogiri.
E então o que você fazer-- e ele vai dar-lhe a sintaxe para isto--
é de abrir o URL tanto quanto você faria em um pedido cURL, que significa C URL.
>> Então você pega a URL o site em questão.
Armazená-lo em uma variável.
E então você pode procurar por essa variável para tags HTML originais usando
o comando CSS.
E então você pode produzir o conteúdo para onde quiser.
Você pode começar em um banco de dados.
Você pode dar saída em um arquivo, ou mesmo apenas imprimi-lo para a tela.
>> Então, vamos mostrar-lhe um raspador de base.
Então, aqui você pode ver, temos exigindo nokogiri, exigem open-uri.
Sua configuração básica, vamos chamá-lo de documento ou doc,
é igual a Nokogiri :: HTML aberto, que é o comando que nos é fornecida pela OpenURI
biblioteca.
E nós vamos estar à procura, para aqueles de você que poderia estar vivendo no quad,
para motos que estão em Boston listada na seção de bicicleta Boston Craigslist
local.
>> Portanto, se você não estiver familiarizado Com Onda, vou apenas
mostrar bem rápido o que vai fazer cURL.
Se eu quisesse obter toda a URL de site Craigslist, se eu digitar onda,
ele simplesmente despeja toda a URL a partir do site da bicicleta do Craigslist
para o meu terminal.
Isso não é particularmente útil, porque eu não fazer
quer ir manualmente através de e encontrar a coisa que eu estou procurando.
Mas só assim você pode ver que eu sou realmente
usando o código correto, se você olhar na URL para Craigslist em bikes--
por algum motivo não for encontrado.
Se você olhar para esta página e você olhar para a URL,
esta deve ser idêntico ao pedido cURL que eu acabei de enviar.
E, de fato, é isso que está sendo armazenado na variável doc.
>> Então, quando você voltar ao nosso código, nós pode então operar nesta variável doc
usando css.
Então, digamos que eu queria ter todos as marcas que são span.txt,
e todas as marcas de dentro dessa tag.
E por que pode queremos fazer isso, eu ouço você chorar?
>> Se Inspect Element, dá-lhe um análise de como a URL é estruturada.
Se eu rolar para baixo através aqui, você pode ver
o que cada um deles diferente elementos representa.
Então, talvez eu quiser acessar este elemento particular.
Então, eu estou usando desenvolvedor Chrome ferramentas para Inspect Element.
Eu posso ver aqui embaixo que este é uma uma marcação dentro de um intervalo
tag com uma classe de txt.
>> Então isso fica para a nossa primeira operação que
é doc.css extensão, que é a marca que Eu estou olhando para dentro de todo esse URL.
E então .txt funciona muito como CSS faz quando você está apenas escrevendo CSS
em seus arquivos HTML por especificando uma classe.
Portanto, este operador específico será especificar uma tag span com a classe de txt.
E então se eu deixar um espaço, este, então, ir dentro dessa tag
e, em seguida, encontrar um uma tag dentro dessa.
>> Então, se eu apenas colocar isso para o terminal, que deveria
ser capaz de ver essencialmente tudo que está dentro deste intervalo de classe txt.
Então, vamos dar um que vá.
ruby craigslist-raspador.
E, de fato, que nos dá toda a estes etiquetas das várias listas que
Está na página Craigslist.
>> Então, se nós voltar, podemos transformar esta em algo um pouco mais útil.
Talvez nós queremos apenas as ligações.
Porque dentro dessa tag, eu também vou ter o hyperlink do caminho
que vai para esta página.
Então, se você olhar para este código aqui, o que vou fazer é em vez de CSS,
Eu posso ir at_css.
E isso só vai conseguir o primeiro elemento de todas essas coisas.
Então, se eu fosse fazer isso até no Eu só código anteriormente demonstrado,
em vez de devolver tudo deste, seria apenas
retornar o primeiro deles.
Então é assim que o operador at_css funciona.
>> Por isso, queremos armazenar o caminho de toda a primeira uma marcação.
E porque um vai dar-nos um-- então ainda estamos indo para usar CSS.
Mas porque é que isto vai dar- nos de volta uma matriz inteira de etiquetas,
nós estamos indo para o acesso o primeiro elemento.
Portanto, esta é uma outra maneira que você pode acessar qualquer elemento particular se
têm uma série de elementos que é devolvido,
porque você pode tratar qualquer coisa que retornos .css como uma matriz, essencialmente.
E então nós estamos indo para acessar o atributo de referência de hipertexto deste.
>> Então, se você der uma olhada, se você parecia muito perto daqui,
se você apenas essencialmente observe a barra de URL,
este é o caminho que você vai ser raspando.
Então, se nós apenas executar isso de novo, e certifique-se que você salvou-lo.
Você pode verificar em casa.
Isso realmente combina com esta ligação.
>> Então, por que pode queremos usar isso?
Se você quiser raspar a página e tem
uma página de links como Craigslist faz, você
pode querer ir em seguida, em cada um desses links
e, em seguida, a raspar conteúdo de que, a qual
é exatamente o que vamos fazer.
>> Portanto, uma vez que você tem como um caminho variável, eu já não realmente
se preocupam com imprimi-lo.
Eu só preciso armazená-lo como uma variável.
E então eu posso acessar outro A página da mesma forma que acessar
doc em primeiro lugar.
Exceto com o URL, vamos usar interpolação de string
como eu estava descrevendo em Rubi anteriormente para anexar
o caminho para a extremidade da raiz.
>> Então, o que isso vai fazer é isso vai colocar no caminho
que eu raspei anteriormente e depois transformar essa
em um novo item, o que você quiser chamar ele-- first_listing, por exemplo.
Mas eu vou deixar -lo no artigo, por agora,
porque é isso que eu estou usando aqui.
>> Então, digamos que eu queria ter a descrição da primeira postagem no Craigslist.
Assim, gostaria de ir para baixo aqui.
Gostaria clique em Inspect Element de novo, porque esta é a descrição.
Eu iria para baixo aqui e veja se eu posso encontrar como eu poderia
ser capaz de pesquisar para esta tag única.
E, neste caso, tem um ID, o que nos leva
para a nossa próxima forma de procurar Tag, que está com uma hashtag.
>> Assim, para as aulas, você pode usar o operador ponto.
Então .txt é especificar uma classe de txt, Considerando que o hash especifica um ID.
Portanto, neste caso, a etiqueta é seção, eo ID é postingbody.
>> Então, isso vai e encontra- o first-- porque somos
usando at_css-- este vai e considera que o primeiro elemento
surge com a tag de seção eo ID de postingbody.
E então você pode acessar o elemento de texto desse item voltou com .text.
E então podemos armazenar que na descrição.
>> Portanto, agora que temos um descrição da variável,
poderemos ser capazes de fazer, digamos, arquivo I / O. Então arquivo I / O em Ruby
é muito semelhante ao arquivo I / O em C, onde abrimos um arquivo.
Poderíamos escrever para ele.
E então nós vamos fechar esse arquivo.
>> Então, aqui, nós estamos apenas nomear o arquivo, alguma variável arbitrária.
Também poderíamos ter apenas colocar isso aqui.
Nós temos uma variável que nós estamos armazenando o arquivo aberto como com File.open.
E nós estamos escrevendo para este arquivo, por isso, abra-o com o operador w.
E então nós colocamos na cadeia arquivo com o operador .puts.
E então nós colocamos a variável que nós quer escrever para o arquivo dentro dessa.
E então nós apenas feche o arquivo.
>> Então, se nós ir em frente e executar esse, Isso deve produzir um documento
com description.txt que vai esta descrição tem dentro dele.
Então, se eu executar ele-- não.
É produzido um arquivo de texto com, esperançosamente, a mesma coisa.
Então pode ter havido uma nova postagem que veio enquanto eu estive conversando.
E, de fato, parece que houve.
Então, se vamos para este moto clássica, 1962-1966, que parece corresponder.
E lá vai você.
>> Então, isso é o mais básico funcionalidade de raspagem.
Nós poderíamos ter, em vez de apenas escrever para esse arquivo,
podemos adicionar coisas a uma matriz.
Então, se eu declarar três matrizes, título, preço e descrição.
E estamos operando no item doc agora.
Nós podemos passar e encontrar todas as span.txt.
E lembre-se, este retorna uma matriz de todos os itens que encontrar.
E então, em Ruby, você pode apenas usar .Cada para percorrer todos os itens
da matriz.
E, em seguida, para cada item, Eu só vou chamá-lo
um link, porque é isso essencialmente o que é.
>> Então, se eu colocar cada a.hdrlnk link.css ponto, este está realmente indo para o link
e encontrar dentro dessa ligação outro Elemento HTML e classe correspondente.
Portanto, se nos lembramos do que este foi, a span.txt,
você pode ver- deixe-me voltar quick-- real dentro span.txt
nós temos um monte de outras classes.
Então, dentro span.txt, nós estamos procurando para um um tag com um hdrlnk classe.
Então deixe-me achar que para vocês rapidinho.
>> Assim você pode ver aqui, esta é uma uma marca que está dentro do intervalo de classe txt
que tem a hdrlnk classe.
E isso é realmente o que nós estamos tentando conseguir.
>> Então, estamos agora a tentar armazenar todos desses links dentro do título.
E então nós estamos indo para imprimir a cada um desses links.
Não, desculpe.
Nós estamos indo para imprimir o preço de cada um deles.
Então, vamos executar este realmente rápida e ver o que ele faz.
>> Portanto, este foi basicamente apenas através de cada um dos links
por sua vez, acessado a marca em questão, e, em seguida, puxou o preço.
E ele fez isso porque depois você tem tudo no título,
nós apenas armazenado o título lá.
Temos apenas armazenado no link no interior da matriz do título.
E no presente para operação em malha, onde em vez de ir para a.hdrlnk,
nós estamos olhando para uma span.price.
Então, se eu só posso realmente encontrar rapidamente o preço, se você inspecionar o elemento,
você vai ver que é uma extensão com a classe de preço.
E isso é, essencialmente, como nós estamos começando o preço lá.
>> Então essa é a verdade caso base de raspagem.
É assim que você começa tudo os elementos de uma página
que, por exemplo, você já sabe o URL.
>> Portanto, se queremos obter um pouco mais em profundidade,
podemos raspar páginas dentro de páginas.
E para este exemplo, eu vou ser a saída para um arquivo CSV.
Então, eu estou exigindo csv-se aqui porque Ruby não faz, dentro de si,
tem a funcionalidade apenas para saída arquivos CSV.
Então, isso é super simples.
Deixe-me apenas ir para o próximo.
Cobrimos arquivo I / O. Então, é isso é semelhante à forma como ele é em C.
E antes de passarmos para Kimono, Eu só vou lhe mostrar como realmente rápido
para raspar sites de pontos turísticos.
>> Então, nós já aprendeu para declarar matrizes em Ruby.
Então, eu só estou declarando uma bando de matrizes arbitrárias
que estará armazenando dados dentro.
doc está a funcionar da mesma forma como fez no arquivo anterior.
Vamos entrar, encontrar cada um dos span.txt de.
Nós já sabemos que.
Isso é o recipiente dentro do qual cada link tem todos os dados que nós queremos.
>> Então, aqui o que estamos fazendo é para cada ligação de span class txt, nós estamos indo em
e nós estamos encontrando a um tag, encontrar o primeiro elemento de que.
Lembre-se, css retorna uma matriz, para que você não pode simplesmente acessá-lo como é.
Nós vamos encontrar o primeiro elemento.
Mesmo que seja uma matriz de um item, você tem que usar essa sintaxe,
e em seguida, puxe o atributo href.
>> Então nós fizemos isso antes.
Portanto, este deve parecer familiar.
E então agora temos uma matriz chamadas de caminhos de todas as nossas ligações
que vamos querer usar.
Então, se temos essa matriz de tudo dos caminhos que queremos usar,
Podemos, então, criar um item para cada dessas páginas quando abrimos essa página.
Assim como vimos também em a sintaxe antes, onde
fazendo interpolação de string com o caminho aqui, então a sintaxe é apenas para o caminho.
E eu poderia citar este variável qualquer nome arbitrário.
>> Esta é a mais importante.
Esta é a matriz que você vai ter acesso a cada elemento.
Mas quando você diz para o caminho em caminhos, isto significa que para cada elemento em caminhos,
chamá-lo de caminho, e usar isso.
Esta é, essencialmente, como quando você fazer um loop e você usar int i.
Assim, você pode considerar o caminho como a variável que está incrementando.
>> E, em seguida, para cada um destes, entrar em cada um desses links.
Porque nós estamos armazenando-o em página item, por isso estamos criando uma nova página a cada vez
nós acessá-lo.
E, em seguida, dentro dessa nova página, encontre span.postingtitletext, span.price,
e, em seguida, seção # postingbody.
Já cobertos seção # postingbody quando olhamos para a descrição.
>> Assim, podemos ir ver no post Craigslist, se você está apenas olhando para o título,
Você pode vê-lo aqui em cima, extensão postingtitletext.
E é por isso que ele está lá.
E, em seguida, para o preço, você pode acessá-lo com span class de preço.
>> Assim também nós, talvez, poderia deseja armazenar o URL.
Então vamos executar este novamente, armazená-lo em uma matriz,
porque se você está procurando no Craigslist, você é
provavelmente vai querer uma maneira de, se você vê algo que lhe interessa,
voltar a esse site.
Então você só quer armazenar o URL para referências causa.
>> Este é apenas essencialmente outra sintaxe para o loop.
Eu só poderia fazer em vez paths.each por caminho em caminhos com índice.
E essa sintaxe é o Ruby for-- caminho é o que fizemos até aqui,
declarar uma variável para cada item.
E índice se comporta como o i na C para loops.
Assim, você pode manter o controle do que o índice é.
>> Então aqui é apenas um pouca coisa conveniente
para quando você estiver executando o raspador.
Se você está raspando centenas de páginas, para se certificar de que não está pendurado,
Ela só vai saída, Eu estou acessando esta página,
e certificando-se de que ele ainda está continuando.
Mas para os nossos propósitos, porque há uma centena de itens,
Eu estou indo para acessar apenas três deles de modo que nós não ficar sem tempo aqui.
>> Mas antes de chegarmos a isso, eu sou apenas vai mostrar-lhe muito rápido,
I será emitir o título, preço, descrição e URL
de cada um dos links que eu raspados.
E então este é apenas o sintaxe para a biblioteca CSV.
Você abre um arquivo CSV.
Isto é o que eu vou chamá-lo.
Abra-o com gravação do.
E, em seguida, CSV será o arquivo que você está introduzindo tudo em.
Este é apenas um teste de sanidade para me saber que ele está sendo executado.
E este é o meu teste de sanidade para saber que ele está concluída.
Então, eu estou colocando título em uma linha em o CSV, preço, url, descrição,
tudo em linhas no CSV.
>> Então, se nós ir e correr este agora-- e eu apenas
ter certeza que eu tenho guardado ele-- vez de apenas mostrando o seu conteúdo para o terminal,
devemos ter um CSV arquivo que é produzido.
Então, aqui podemos ver o CSV arquivo que foi produzido.
Esta é a saída do scape que eu apenas corri.
Como você pode ver aqui, Acessando a página 0, 1, 2, 3.
Estes são os títulos, preços, descrições.
E se olharmos para este CSV arquivo que geramos,
você pode ver a sua transmitido aqui.
Este não é o Excel, por isso não é formatado em linhas e colunas.
Mas você pode imaginar como ele pode ser formatada.
>> CSV significa valores separados por vírgulas.
Então você pode imaginar isso pode ser uma linha.
E cada vírgula faria indicam uma coluna separada.
Apenas uma palavra de notas PRECAUÇÃO às vezes você está
raspando as coisas com um monte de vírgulas.
Então, se você estiver saída lo para um arquivo CSV,
Pode não saída do maneira que você poderia pensar.
>> Então, isso é essencialmente tudo o que há para raspagem HTML básico
páginas com Nokogiri.
>> Assim, o ser Internet inovador, pois chegou-se
com um mais automatizado e GUI versão, embora de forma menos robusta
versão de raspagem vários sites.
E para os nossos objectivos Eu vou estar demonstrando
uma extensão do Chrome chamado quimono.
E tudo que você tem a fazer é navegar para a página que você quer raspar.
Você clica em um campo de interesse.
Você calibrar os campos, porque ele será automaticamente
detectar o que pensa você quer ser raspagem,
e então você apenas criar uma API.
>> Então, se tivéssemos de demonstrá-lo em Craigslist, ele realmente não iria funcionar.
E é isso que eu ia voltar para dizendo sobre ele não ser tão robusto.
Ele tem problemas para criar a API.
Mas como uma demonstração do que ele faria,
se você instalar a extensão Chrome, tudo que você faz é você clicar nele.
Ele Kimonofies a página, e então você clique sobre a coisa que você quer script.
>> Então, se eu fosse para clicar em isso, gostaria de destacar
o que ele pensa que eu quero ser raspar essa página.
Então, talvez eu chamo esta listagem.
Esta é quantos itens eu selecionei.
E eu só posso confirmar ou negar alguns das outras listas sugeridas
para obtê-lo para adicionar à o que será raspada.
>> Então agora podemos ver que há uma centena de itens selecionados.
Se eu quero ter um outro campo que eu também raspar o que está relacionado com esta,
dizer que eu quero raspar o preço bem, então eu posso fazer o mesmo.
>> Então aqui está uma demonstração de como é muito menos robusta, porque agora é
pegar a cidade em vez de apenas o preço que eu quero.
E agora ele é pego 200 coisas.
Você pode voltar e apagar.
Você pode tentar novamente.
Mas não há garantias.
Esta é a forma como isso funciona, às vezes.
Como você pode ver aqui, agora ele diz que 96 aqui em cima.
É pegou a maioria dos links que pretende raspar, mas não
necessariamente todos eles.
>> Outra ferramenta útil de Kimono embora é que você pode ir para Recursos Avançados
aqui, vá para Avançado, e ele vai te mostrar
o colapso do único maneira de acessar o HTML
tags que você deseja. raspar
Assim, para anúncios, se você olhar para aqui, se você acessar div p abrangem uma extensão,
você pode realmente usar apenas esta em seu código Nokogiri,
onde antes tínhamos span.txt para acessar cada uma das listas.
Se eu quiser apenas o texto dentro das listas,
Eu podia entrada espaço div p espaço espaço espaço espaço espaço um,
e permitiria alcançar o mesmo efeito.
E para aqueles de vocês que estão interessados no uso de expressões regulares,
isso acontece para também dar-lhe o habitual expressão de classificação da seqüência de caracteres para entrada
para encontrar as coisas você está tentando encontrar.
>> Portanto, não há outro recurso legal de Kimono, onde pode paginar,
o que não só eu posso raspar Os resultados desta página,
Posso clicar neste pequeno botão aqui, Paginação,
especificar que o botão leve-me para a próxima página,
e, em seguida, ela só vai saber que ele pode fazer uma iteração para a próxima página,
e, em seguida, raspar todos as-- contanto como é o mesmo formato de course--
scape todos esses links também.
>> Então porque Kimono não quer trabalhar com Craigslist, o que temos feito
é que eu Kimonofied o Crimson de Harvard.
Eu puxado para fora algum do tipo de top artigos em destaque, confirme aqui.
Diga tudo isso.
Eu compilei esta API para você antes do tempo.
Mas caso contrário, o que você faria é você apenas clique em Concluído.
Introduza os seus dados API.
Configurá-lo para qualquer um rastreamento automático ou manual.
Assim, você poderá atualizar o seu dados a cada 15 minutos,
semanalmente, diariamente, o que quiser.
Nome do seu API.
Criar a API.
Para seu benefício, eu criei o Carmesim página API frente já.
>> Então você acabou de criar uma conta no quimono, e
vai armazenar todas as suas APIs para você.
Então, basicamente isso é tudo o arranhões diferentes separadas.
>> Portanto, se olharmos aqui, esta é a opiniões links que eu coletei.
Estes são os destacados links que eu coletei.
E estes são os mais lidos links que eu coletei
a partir deste mais recente escapo API.
>> Então, se você pode ver aqui, estes seriam o destaque,
estas seriam as opiniões, que neste exemplo,
Eu já combinado todos eles em uma coleção.
Mas se você simplesmente brincar com ele um pouco, você pode dividi-lo
e dividi-lo contudo você quer, contanto
como a formatação é ligeiramente diferente.
>> Só para brincar com isso, o crawl configurado, uma das desvantagens
é que você só pode rastejar 25 páginas de cada vez.
Esse é um dos fatores limitantes.
Mas aqui, se você defini-lo Para rastrear o manual, este
É assim que você pode dizer que para atualizar seus dados.
E aqui você pode ver o seu histórico de rastreamento de tudo o que você arrastou.
E vocês podem voltar, se inscrever, brincar com todas as maneiras diferentes
que você pode modificar e utilizar os seus dados.
>> Quimono pode ser configurado para raspar links dentro de links.
E você iria fazê-lo em primeiro lugar raspando uma lista de links,
e, em seguida, usar essa API como um saltar fora do ponto para outro API
que você criar o script.
Mas isso é mais complicado do que o que nós estamos indo para entrar em hoje.
>> Então, isso é Kimono.
Vamos falar sobre os prós e contras de Nokogiri e quimono.
>> Nokogiri, é muito rápido.
É fácil de testar.
Você pode apenas coloca qualquer coisa para console, fácil de configurar.
Você pode decidir exatamente o que você quer raspar e loja.
Não há limites de página.
I realmente é utilizado para raspar como 1800 sites escolares Sul Africano
para e-mails para um estágio que eu fiz.
>> Então, isso é possível, embora as melhores práticas seria a de dividir o script.
Porque se ele falhar, em seguida, você não ganha nada.
Mas se você fizer uma centena, talvez 200 páginas por vez,
então você tem alguma chance de, pelo menos, começá-lo aos poucos, especialmente
se você tem mau internet.
>> Infelizmente ele só pode raspar HTML.
Então se você tem pages-- carregado dinamicamente
e eu vou mostrar-lhe um exemplo como caiaque em um second--
Nokogiri infelizmente não pode raspar que.
>> Mas Kimono também é fácil de usar.
Como você viu, é, essencialmente, um ponto e clique.
Pode raspar Javascript.
Infelizmente, há uma máxima de quantas páginas você pode raspar.
Às vezes é um pouco difícil de configurar.
Ele fica confuso.
Mas é definitivamente algo a considerar
se você não está tentando ter um raspar sustentável super-robusto.
Se você só quer ficar tudo fora de uma página rapidamente,
então é realmente um Kimono boa ferramenta para usar.
E como eu mencionei antes, há o recurso avançado de Kimono
que lhe como mostra o único acesso HTML
elemento, que é super útil mesmo se você estiver trabalhando em Nokogiri.
>> Então, se nós ir para o site do Kayak, para exemplo, você pode ver que há é--
ou talvez você não pode ver.
Mas se eu lhe mostrar a URL para Kayak, este, na verdade, é apenas o URL de origem.
Este é o URL antes de ser modificada por qualquer scripts JavaScript
que eles tem em curso.
E isso está indo olhar diferente de inspecionar o elemento.
>> Então, se você passar e você igualar-se o elemento Inspecione
código para o código-fonte, é realmente vai ser diferente.
E este é, essencialmente, por que Nokogiri não pode raspar locais carregados dinamicamente.
Porque é Nokogiri raspando o URL de origem,
Considerando que é, na verdade Kimono raspando o que você é, essencialmente,
vendo em Selecionar elemento.
>> Então, se eu passar e eu tentar Kimonofy Kayak,
Eu posso realmente passar por e selecione o preço.
É um pouco mais difícil, e, neste caso, é
realmente vendo este preço como diferentes destes.
Assim, enquanto você pode ou configure-- Se assim não fosse carregado dinamicamente,
você poderia configurar Nokogiri para obter todos estes.
>> Porque a formatação é ligeiramente diferente para esta listagem
como ele é comparado com o resto um deles, e você pode ver aqui
ele é realmente ido e seleccionados todos os preços de voos.
Talvez eu queira seleccionar tempo de voo também.
E eu posso passar e tipo de configurar isso.
Eu não quero isso.
Eu só quero que o tempo do próximo voo.
E, depois de um par destes passando, fica a imagem.
Então Kimono muito inteligente.
É apenas não é tão robusto.
>> Existem alguns outros alternativas que você pode usar.
E eu vou mostrar-lhe-los aqui.
Se você está mais confortável em Python, em vez do Ruby talvez,
existe uma biblioteca chamada Beautiful Soup.
Você pode usar isso.
É muito semelhante ao Nokogiri.
Tem mais algumas funcionalidades.
Você pode encontrar uma tag HTML e em seguida, mover para cima ou mover lateralmente.
>> Há PyQt.
Este facto pode raspar dinâmica locais, porque é uma espécie de
é um WebKit que finge ser um navegador sem que realmente
ser um navegador.
Por isso, seria esperar por toda a JavaScript para carregar primeiro, e depois
entrar e tentar raspar o site.
>> Se você quiser ficar com Ruby, você pode ir um nível acima do Nokogiri.
Você pode usar com Capybara um invólucro de Poltergeist.
E isso pode realmente essencialmente fazer a mesma coisa
como PyQt, o que é que é um WebKit.
Ele aguarda o JavaScript para carregar em primeiro lugar.
Se você mexer com ela o suficiente, você pode até mesmo fazê-lo clicar sobre as coisas.
>> Portanto, se há um link que não é a href clássico onde
o caminho é de fácil acesso, e é alguma coisa JavaScript que detecta
um clique, você pode realmente fazer isso.
A biblioteca mais populares para simular um utilizador
está em JavaScript, que é PhantomJS.
Isto, obviamente, pode raspar dinâmica sites, porque este é essencialmente
fingindo ser Chrome sem a interface do usuário.
>> E então, é claro, o mais robusto, mas mais lento opção,
é um navegador de automação selênio.
E, infelizmente, você não está indo para ser
capaz de fazer isso dentro de seu IDE CS50.
Devido essencialmente o que faz é ele inicia seu Chrome,
Firefox, qualquer que seja navegador que você deseja usar,
e talvez ele controla o mouse movimento, o que quer que você digita,
e é apenas uma espécie de automatiza esse processo.
Por isso, foi desenvolvido como uma espécie de website ferramenta de teste de automação.
Mas um monte de pessoas usam Selenium para raspar sites
que de outra forma ter um muita dificuldade raspagem
com algumas destas outras ferramentas, mais rápidos.
>> Então, isso é tudo que eu tenho para web scraping.
Diverta-se.
>> AUDIÊNCIA: Pergunta.
>> ROBERT KRABEK: Sim.
>> AUDIÊNCIA: Existe um mecanismo de hash o site para que você poderia, basicamente,
passar por isso mais tarde.
ROBERT KRABEK: Yeah.
Então nós colocamos o, em nossa exemplo, para ambos,
nós colocamos todo o site em doc.
E assim você realmente pode apenas tomar o doc variável e escrevê-lo em um arquivo.
Então, se eu quisesse, eu poderia escrevê-lo como um arquivo HTML,
e, em seguida, em vez de utilizar OpenURI e um pedido cURL,
então eu poderia simplesmente abrir doc HTML e, em seguida, procurar isso.
>> AUDIÊNCIA: Mas você pode preservar o tipo de experiência on-line
enquanto você faz offline.
Por exemplo. quando você é voando por várias horas,
Eu quero basicamente arquivo todo o site. [INAUDÍVEL]
>> ROBERT KRABEK: Sim, isso é exactly-- assim literalmente o que isso está fazendo
é ele está tomando tudo que seria neste URL.
Então, se nós funcionamos cURL, é Levando tudo isso em HTML,
e ele está armazenando- dentro do doc variável.
Então você pode fazer o que você quer fazer com doc.
Você pode saída para um arquivo.
AUDIÊNCIA: Mas ele não está ligado.
Não é dinâmica.
Não é recursiva, certo?
Você vê o que eu quero dizer?
Eu estou tentando basicamente tipo de um hash todo o site no meu disco rígido
para que eu pudesse fazê-lo, basicamente, durante várias horas sem Internet.
>> ROBERT KRABEK: Certo.
Então, se eu had-- então onde está o meu arquivo I / O?
Portanto, este é o arquivo I / O. Então diga vez a isso, eu chamo isso de craigslist.html.
Eu abrir isso.
Eu tinha puts doc para ele.
Eu feche o arquivo.
E depois é só porque o CS50 IDE é sobre a nuvem, que é o que quer.
Eu posso ir aqui.
Eu posso baixar o arquivo.
E, em seguida, que seria no meu disco rígido.
Assim, você pode fazê-lo dessa maneira.
Ou se você está em casa, não usando o CS50 IDE, como Sublime ou algo assim,
isso é ainda mais fácil, porque isto é tudo disponível localmente,
não ligada à internet.
>> AUDIÊNCIA: Entendo.
Este é um problema particular para.
Você pode fazê-lo de forma recursiva para que você ir várias camadas de profundidade tipo de coisa?
>> ROBERT KRABEK: eu posso baixar pastas bem, se é isso que você está perguntando.
AUDIÊNCIA: É.
>> ROBERT KRABEK: Cool.