1 00:00:00,000 --> 00:00:03,234 >> [Música tocando] 2 00:00:03,234 --> 00:00:05,275 3 00:00:05,275 --> 00:00:06,400 ROBERT KRABEK: Olá, pessoal. 4 00:00:06,400 --> 00:00:09,980 Meu nome é Robert Krabek, e I estará ensinando-lhe caras 5 00:00:09,980 --> 00:00:15,470 como raspar a web com Nokogiri, que é uma biblioteca Ruby, 6 00:00:15,470 --> 00:00:17,566 e Kimono, que é uma extensão do Chrome. 7 00:00:17,566 --> 00:00:20,940 8 00:00:20,940 --> 00:00:25,010 >> Então, primeiro há uma Algumas coisas que você 9 00:00:25,010 --> 00:00:28,790 pode fazer se talvez você tenha sido fazendo todas as Série de Exercícios até agora 10 00:00:28,790 --> 00:00:31,170 e seu espaço de trabalho é ficando um pouco cheio. 11 00:00:31,170 --> 00:00:37,060 Na verdade, podemos apenas ir e criar um novo espaço de trabalho para você 12 00:00:37,060 --> 00:00:41,220 apenas para fazer um novo projeto no. 13 00:00:41,220 --> 00:00:46,160 Então, se você quiser continuar trabalhando na identificação do modelo CS50 14 00:00:46,160 --> 00:00:49,080 que você tem atualmente, sinta-se livre, e você pode apenas 15 00:00:49,080 --> 00:00:54,700 instalar Nokogiri com CFLAGS gem equals-- instalar nokogiri. 16 00:00:54,700 --> 00:00:56,930 Mas por outro lado eu vou lhe mostrar como definir um novo up. 17 00:00:56,930 --> 00:01:01,210 E então este é, essencialmente, caindo mais rodas de treinamento. 18 00:01:01,210 --> 00:01:07,120 E você está programando como se estivesse apenas a codificação em Sublime ou algo assim. 19 00:01:07,120 --> 00:01:12,365 Então, se nós transferi-lo de novo. 20 00:01:12,365 --> 00:01:14,930 21 00:01:14,930 --> 00:01:18,690 >> Então, dizer que este é o seu atual CS 50 ID. 22 00:01:18,690 --> 00:01:21,490 Você pode simplesmente ir para Cloud9 aqui. 23 00:01:21,490 --> 00:01:22,725 Você pode ir ao seu painel. 24 00:01:22,725 --> 00:01:26,720 25 00:01:26,720 --> 00:01:29,950 Ele deve trazer guia espaços de trabalho. 26 00:01:29,950 --> 00:01:32,980 E então você pode simplesmente clicar aqui, criar um novo espaço de trabalho. 27 00:01:32,980 --> 00:01:37,600 Nome do seu novo espaço de trabalho, talvez teste, ou raspagem. 28 00:01:37,600 --> 00:01:42,700 E, em seguida, clique neste separador personalizado aqui, em vez da guia modelos CS50. 29 00:01:42,700 --> 00:01:45,155 E então você pode simplesmente ir e criar um novo espaço de trabalho. 30 00:01:45,155 --> 00:01:48,280 >> Eu já criou um espaço de trabalho aqui. 31 00:01:48,280 --> 00:01:50,640 Então vamos trabalhar com isso. 32 00:01:50,640 --> 00:01:55,380 E se você criou um novo espaço de trabalho para com a guia Personalizar, 33 00:01:55,380 --> 00:02:04,560 você pode simplesmente digitar gem install nokogiri, o que não está acontecendo aqui. 34 00:02:04,560 --> 00:02:06,230 OK, é um pouco congelado. 35 00:02:06,230 --> 00:02:08,979 Mas você pode digitar gem install nokogiri. 36 00:02:08,979 --> 00:02:15,970 E isso deve ser tudo o que existe para a instalação. 37 00:02:15,970 --> 00:02:20,590 >> Como eu disse antes, se você ainda estiver trabalhando em seu CS50 modelo de ID, 38 00:02:20,590 --> 00:02:30,270 você só precisa digitar CFLAGS é igual a gem install nokogiri. 39 00:02:30,270 --> 00:02:33,130 E eu já instalado -lo aqui para que eu não vou fazer isso. 40 00:02:33,130 --> 00:02:38,500 Mas para aqueles que seguem junto, não hesite em fazê-lo. 41 00:02:38,500 --> 00:02:46,000 >> Portanto, uma vez que você tenha seu Nokogiri espaço de trabalho ou biblioteca instalado, 42 00:02:46,000 --> 00:02:49,500 Vou dar-lhe um pouco de um curso intensivo de sintaxe de Ruby 43 00:02:49,500 --> 00:02:53,380 Nokogiri porque é uma biblioteca Ruby. 44 00:02:53,380 --> 00:03:03,710 Então você precisa saber algumas informações básicas Sintaxe Ruby para trabalhar com Nokogiri. 45 00:03:03,710 --> 00:03:08,750 Por isso, algumas diferenças básicas a partir do que você está acostumado a 46 00:03:08,750 --> 00:03:13,370 talvez se você está trabalhando até agora em apenas C e PHP, 47 00:03:13,370 --> 00:03:16,010 você declarar variáveis ​​sem tipo. 48 00:03:16,010 --> 00:03:19,720 Você não usa ponto e vírgula, que é uma espécie de alívio. 49 00:03:19,720 --> 00:03:25,480 Não há agora cerca de parênteses for ou while loops, por exemplo. 50 00:03:25,480 --> 00:03:29,460 Você apenas tem um bloco de código, e então você colocar fim no final desse. 51 00:03:29,460 --> 00:03:32,380 Não há nenhuma plus plus ou menos de menos, então apenas 52 00:03:32,380 --> 00:03:36,180 sabemos que para quando você está fazendo para loops, 53 00:03:36,180 --> 00:03:38,620 apenas mais iguais e menos iguais. 54 00:03:38,620 --> 00:03:43,310 E, em vez de haxixe incluem, você vai usar e depois exigir 55 00:03:43,310 --> 00:03:47,755 o que quer tentar biblioteca para carregar em seu programa. 56 00:03:47,755 --> 00:03:51,610 57 00:03:51,610 --> 00:03:53,430 >> Ruby não é uma linguagem compilada. 58 00:03:53,430 --> 00:03:55,550 Então, isso é outra alívio. 59 00:03:55,550 --> 00:03:59,350 É mais semelhante ao PHP onde é uma linguagem interpretada. 60 00:03:59,350 --> 00:04:03,570 Você pode executar qualquer script Ruby que você escreve com Ruby seguido 61 00:04:03,570 --> 00:04:07,380 com o nome de seu script ou programa. 62 00:04:07,380 --> 00:04:13,000 Para significar que é um programa Ruby, você acabou de terminar com .rb em vez de .c. 63 00:04:13,000 --> 00:04:17,440 E há variável matrizes de tamanho em Ruby, 64 00:04:17,440 --> 00:04:23,200 que é super conveniente quando você estiver raspagem e talvez deseja anexar 65 00:04:23,200 --> 00:04:26,090 dados que você raspou em uma matriz. 66 00:04:26,090 --> 00:04:31,960 Você não tem que malloc uma nova matriz e copiar a matriz antiga para a nova matriz. 67 00:04:31,960 --> 00:04:36,150 Você pode apenas anexar com os dois sinais de seta. 68 00:04:36,150 --> 00:04:39,820 E não há caracteres, não apenas a sequências de letras individuais. 69 00:04:39,820 --> 00:04:44,760 De modo que deve ser um pouco mais fácil. 70 00:04:44,760 --> 00:04:50,130 >> Então vamos dar-lhe algum exemplos de alguns sintaxe básica Ruby. 71 00:04:50,130 --> 00:04:57,100 Então, aqui você pode ver que em vez de a barra barra, para comentar, em Ruby, 72 00:04:57,100 --> 00:04:58,740 você só usar o sinal de libra. 73 00:04:58,740 --> 00:05:04,990 E declaração de variável, você basta digitar as variáveis ​​iguais 74 00:05:04,990 --> 00:05:07,971 o que quiser a variável a ser. 75 00:05:07,971 --> 00:05:09,220 Eles podem ser strings. 76 00:05:09,220 --> 00:05:14,120 Você pode ter matriz, que você preencher com os valores. 77 00:05:14,120 --> 00:05:17,240 puts e estampas são semelhantes. 78 00:05:17,240 --> 00:05:20,110 Para nossos propósitos, o única diferença é realmente 79 00:05:20,110 --> 00:05:25,500 que coloca, que significa puts, apenas coloca uma nova linha 80 00:05:25,500 --> 00:05:27,440 caráter em tudo o que está imprimindo. 81 00:05:27,440 --> 00:05:30,980 >> Então, se nós damos uma pequena demonstração aqui, 82 00:05:30,980 --> 00:05:41,800 podemos executar este com-- abrir um novo terminal. 83 00:05:41,800 --> 00:05:46,020 Você pode ver todos estes arquivos que estão em meu terminal. 84 00:05:46,020 --> 00:05:50,960 E se eu simplesmente executar Ruby, intro.rb rubi, ele 85 00:05:50,960 --> 00:05:53,530 põe para fora cinco Olá Mather, Quincy, portador. 86 00:05:53,530 --> 00:05:54,410 Adams. 87 00:05:54,410 --> 00:05:59,295 Então, isso é tudo o que há para matrizes que declaram. 88 00:05:59,295 --> 00:06:01,670 AUDIÊNCIA: Robert, você pode fazer o tipo de letra um pouco maior? 89 00:06:01,670 --> 00:06:02,461 ROBERT KRABEK: Sim. 90 00:06:02,461 --> 00:06:05,370 91 00:06:05,370 --> 00:06:12,280 E eu posso aumentar o zoom, porque você não pode ampliar a fontes terminais aparentemente. 92 00:06:12,280 --> 00:06:18,790 93 00:06:18,790 --> 00:06:24,630 >> Então é assim que você imprime variáveis ​​para o seu terminal. 94 00:06:24,630 --> 00:06:28,820 Você também pode usar variáveis ​​dentro de uma seqüência de caracteres. 95 00:06:28,820 --> 00:06:33,720 Então, recentemente em PHP, você poderia ter aprendido 96 00:06:33,720 --> 00:06:37,340 que há interpolação de string. 97 00:06:37,340 --> 00:06:43,830 Então, se você der uma olhada aqui, se eu declarar três variáveis, nome, biblioteca, 98 00:06:43,830 --> 00:06:49,700 e língua, e eu puts, eu escrever uma corda, Olá meu nome é. 99 00:06:49,700 --> 00:06:54,190 E, em seguida, em vez de o PHP versão de interpolação de string 100 00:06:54,190 --> 00:06:58,960 que parece um pouco mais goste disto, você tem um sinal de libra, e, em seguida, 101 00:06:58,960 --> 00:07:01,220 uma chaveta, e, em seguida, o nome da variável. 102 00:07:01,220 --> 00:07:07,350 E é assim que você imprimir, digamos, qualquer que seja o nome da variável é. 103 00:07:07,350 --> 00:07:10,140 >> E então você também pode concatenar strings. 104 00:07:10,140 --> 00:07:12,890 Rubi torna super fácil com o sinal de mais. 105 00:07:12,890 --> 00:07:16,110 Você só tem uma corda no lado esquerdo, mais uma variável 106 00:07:16,110 --> 00:07:18,860 ou outra seqüência mais uma cadeia. 107 00:07:18,860 --> 00:07:23,500 Então, se eu imprimir esta fora, que deveria apenas dizer Olá, meu nome é Robert. 108 00:07:23,500 --> 00:07:27,340 I estará ensinando-lhe Nokogiri em Ruby. 109 00:07:27,340 --> 00:07:35,370 >> E vamos apenas confirmar que que é de fato o ruby ​​introdução case--. 110 00:07:35,370 --> 00:07:36,480 Olá, meu nome é Robert. 111 00:07:36,480 --> 00:07:40,160 I estará ensinando-lhe Nokogiri em Ruby. 112 00:07:40,160 --> 00:07:45,600 >> Seguindo em frente, se else, é um pouco diferente 113 00:07:45,600 --> 00:07:49,800 a partir do que você pode ser usado para se você está trabalhando em C. 114 00:07:49,800 --> 00:07:53,200 Você não precisa dos parênteses. 115 00:07:53,200 --> 00:07:55,220 Você não precisa as chaves. 116 00:07:55,220 --> 00:08:00,170 E em vez de outra pessoa se, é um elsif concatenada. 117 00:08:00,170 --> 00:08:07,260 Então, aqui, se eu tiver declarado x up aqui, como podemos ver, ainda x 5 é. 118 00:08:07,260 --> 00:08:11,100 Então, se x é inferior a 3, ele vai colocar pequena. 119 00:08:11,100 --> 00:08:14,030 Se for inferior a 7, médio, outra grande. 120 00:08:14,030 --> 00:08:17,340 Assim, 5 é um número médio. 121 00:08:17,340 --> 00:08:22,270 E eu acabar este bloco de código com end. 122 00:08:22,270 --> 00:08:24,920 >> Aqui está o meu loop for. 123 00:08:24,920 --> 00:08:28,240 E essa sintaxe é também ligeiramente diferente. 124 00:08:28,240 --> 00:08:33,500 O 0 a cinco apenas essencialmente é declarar um matrizes de 0-5. 125 00:08:33,500 --> 00:08:36,120 Portanto, há cinco slots na matriz. 126 00:08:36,120 --> 00:08:40,500 E, em seguida, para cada intervalo de tempo em que array, eu vou estar incrementando i. 127 00:08:40,500 --> 00:08:46,080 Portanto, este deve imprimir 0-5, ou 0-4. 128 00:08:46,080 --> 00:08:49,630 E isso deve imprimir médio. 129 00:08:49,630 --> 00:08:51,370 >> E eu vou brilhar através. 130 00:08:51,370 --> 00:08:54,466 Vocês terão acesso a este código mais tarde. 131 00:08:54,466 --> 00:08:55,965 Então vocês podem executar este vós. 132 00:08:55,965 --> 00:09:02,090 133 00:09:02,090 --> 00:09:06,620 >> Portanto, este é o seu ciclo básico enquanto. 134 00:09:06,620 --> 00:09:12,230 Esta será apenas imprimir j, incrementando por 1 até chegarmos 5. 135 00:09:12,230 --> 00:09:18,320 >> Super rápido curso intensivo de Ruby sobre como escrever uma função. 136 00:09:18,320 --> 00:09:24,460 Em vez de, digamos, int fatorial número, só temos def. 137 00:09:24,460 --> 00:09:28,450 E, essencialmente, você está definindo uma função aqui. 138 00:09:28,450 --> 00:09:30,600 Este vai ser o nome da função, 139 00:09:30,600 --> 00:09:34,280 e isto é todas as variáveis ​​que você quer passar para a função. 140 00:09:34,280 --> 00:09:36,760 Você pode ter se declarações dentro. 141 00:09:36,760 --> 00:09:38,030 Você pode retornar. 142 00:09:38,030 --> 00:09:42,620 Neste caso, estamos definição de uma forma recursiva 143 00:09:42,620 --> 00:09:45,000 função fatorial implementado. 144 00:09:45,000 --> 00:09:48,660 Então, nós apenas chamar funções em Ruby como este. 145 00:09:48,660 --> 00:09:54,700 >> Então, se eu defini isso, eu pode chamar fatorial, passar em 3, 146 00:09:54,700 --> 00:09:59,700 e, em seguida, 3 será a variável número que eu posso usar dentro da função. 147 00:09:59,700 --> 00:10:08,010 E este é apenas to_s transformando o valor dos fatorial voltar em uma string. 148 00:10:08,010 --> 00:10:10,760 Caso contrário, este vai jogar um erro dizendo oh, I 149 00:10:10,760 --> 00:10:13,230 Não é possível imprimir um string-- porque como você se lembra, 150 00:10:13,230 --> 00:10:18,230 coloca é colocado string-- porque este fatorial retornou um número. 151 00:10:18,230 --> 00:10:21,850 Assim, podemos converter esse para uma string como tal. 152 00:10:21,850 --> 00:10:27,856 E, inversamente, você também pode converter uma string para um inteiro com to_i. 153 00:10:27,856 --> 00:10:32,650 >> Assim, fazer tudo o super simples, se eu comentar isto, salvar 154 00:10:32,650 --> 00:10:36,250 e executar a função fatorial. 155 00:10:36,250 --> 00:10:39,850 Devemos ser capazes de ver que fatorial de 3 a 6. 156 00:10:39,850 --> 00:10:42,790 E isso é verdade. 157 00:10:42,790 --> 00:10:46,160 >> Então, esse é o seu curso intensivo em Ruby. 158 00:10:46,160 --> 00:10:53,550 E agora que você sabe Ruby, podemos continuar ao Nokogiri básica raspagem configurar. 159 00:10:53,550 --> 00:10:58,190 Essencialmente tudo o que você tem a fazer é, em Ruby, exigir que as bibliotecas. 160 00:10:58,190 --> 00:11:04,390 E para os nossos propósitos vamos estar usando o OpenURI biblioteca bem como Nokogiri. 161 00:11:04,390 --> 00:11:07,870 E então o que você fazer-- e ele vai dar-lhe a sintaxe para isto-- 162 00:11:07,870 --> 00:11:16,010 é de abrir o URL tanto quanto você faria em um pedido cURL, que significa C URL. 163 00:11:16,010 --> 00:11:20,330 >> Então você pega a URL o site em questão. 164 00:11:20,330 --> 00:11:22,030 Armazená-lo em uma variável. 165 00:11:22,030 --> 00:11:27,400 E então você pode procurar por essa variável para tags HTML originais usando 166 00:11:27,400 --> 00:11:30,590 o comando CSS. 167 00:11:30,590 --> 00:11:34,360 E então você pode produzir o conteúdo para onde quiser. 168 00:11:34,360 --> 00:11:35,720 Você pode começar em um banco de dados. 169 00:11:35,720 --> 00:11:42,040 Você pode dar saída em um arquivo, ou mesmo apenas imprimi-lo para a tela. 170 00:11:42,040 --> 00:11:47,290 >> Então, vamos mostrar-lhe um raspador de base. 171 00:11:47,290 --> 00:11:52,570 Então, aqui você pode ver, temos exigindo nokogiri, exigem open-uri. 172 00:11:52,570 --> 00:11:57,150 Sua configuração básica, vamos chamá-lo de documento ou doc, 173 00:11:57,150 --> 00:12:07,780 é igual a Nokogiri :: HTML aberto, que é o comando que nos é fornecida pela OpenURI 174 00:12:07,780 --> 00:12:08,920 biblioteca. 175 00:12:08,920 --> 00:12:14,000 E nós vamos estar à procura, para aqueles de você que poderia estar vivendo no quad, 176 00:12:14,000 --> 00:12:21,270 para motos que estão em Boston listada na seção de bicicleta Boston Craigslist 177 00:12:21,270 --> 00:12:22,020 local. 178 00:12:22,020 --> 00:12:26,460 >> Portanto, se você não estiver familiarizado Com Onda, vou apenas 179 00:12:26,460 --> 00:12:28,930 mostrar bem rápido o que vai fazer cURL. 180 00:12:28,930 --> 00:12:38,350 Se eu quisesse obter toda a URL de site Craigslist, se eu digitar onda, 181 00:12:38,350 --> 00:12:44,950 ele simplesmente despeja toda a URL a partir do site da bicicleta do Craigslist 182 00:12:44,950 --> 00:12:46,720 para o meu terminal. 183 00:12:46,720 --> 00:12:49,130 Isso não é particularmente útil, porque eu não fazer 184 00:12:49,130 --> 00:12:53,330 quer ir manualmente através de e encontrar a coisa que eu estou procurando. 185 00:12:53,330 --> 00:13:01,590 Mas só assim você pode ver que eu sou realmente 186 00:13:01,590 --> 00:13:13,966 usando o código correto, se você olhar na URL para Craigslist em bikes-- 187 00:13:13,966 --> 00:13:17,460 por algum motivo não for encontrado. 188 00:13:17,460 --> 00:13:20,340 Se você olhar para esta página e você olhar para a URL, 189 00:13:20,340 --> 00:13:23,970 esta deve ser idêntico ao pedido cURL que eu acabei de enviar. 190 00:13:23,970 --> 00:13:27,700 E, de fato, é isso que está sendo armazenado na variável doc. 191 00:13:27,700 --> 00:13:36,540 >> Então, quando você voltar ao nosso código, nós pode então operar nesta variável doc 192 00:13:36,540 --> 00:13:40,660 usando css. 193 00:13:40,660 --> 00:13:49,240 Então, digamos que eu queria ter todos as marcas que são span.txt, 194 00:13:49,240 --> 00:13:51,740 e todas as marcas de dentro dessa tag. 195 00:13:51,740 --> 00:13:56,150 E por que pode queremos fazer isso, eu ouço você chorar? 196 00:13:56,150 --> 00:14:02,920 >> Se Inspect Element, dá-lhe um análise de como a URL é estruturada. 197 00:14:02,920 --> 00:14:06,200 Se eu rolar para baixo através aqui, você pode ver 198 00:14:06,200 --> 00:14:08,770 o que cada um deles diferente elementos representa. 199 00:14:08,770 --> 00:14:13,410 Então, talvez eu quiser acessar este elemento particular. 200 00:14:13,410 --> 00:14:16,820 Então, eu estou usando desenvolvedor Chrome ferramentas para Inspect Element. 201 00:14:16,820 --> 00:14:22,970 Eu posso ver aqui embaixo que este é uma uma marcação dentro de um intervalo 202 00:14:22,970 --> 00:14:26,230 tag com uma classe de txt. 203 00:14:26,230 --> 00:14:29,610 >> Então isso fica para a nossa primeira operação que 204 00:14:29,610 --> 00:14:37,330 é doc.css extensão, que é a marca que Eu estou olhando para dentro de todo esse URL. 205 00:14:37,330 --> 00:14:43,650 E então .txt funciona muito como CSS faz quando você está apenas escrevendo CSS 206 00:14:43,650 --> 00:14:49,630 em seus arquivos HTML por especificando uma classe. 207 00:14:49,630 --> 00:14:57,980 Portanto, este operador específico será especificar uma tag span com a classe de txt. 208 00:14:57,980 --> 00:15:02,800 E então se eu deixar um espaço, este, então, ir dentro dessa tag 209 00:15:02,800 --> 00:15:05,170 e, em seguida, encontrar um uma tag dentro dessa. 210 00:15:05,170 --> 00:15:10,750 >> Então, se eu apenas colocar isso para o terminal, que deveria 211 00:15:10,750 --> 00:15:21,630 ser capaz de ver essencialmente tudo que está dentro deste intervalo de classe txt. 212 00:15:21,630 --> 00:15:22,890 Então, vamos dar um que vá. 213 00:15:22,890 --> 00:15:25,870 214 00:15:25,870 --> 00:15:27,756 ruby craigslist-raspador. 215 00:15:27,756 --> 00:15:31,850 216 00:15:31,850 --> 00:15:37,250 E, de fato, que nos dá toda a estes etiquetas das várias listas que 217 00:15:37,250 --> 00:15:40,400 Está na página Craigslist. 218 00:15:40,400 --> 00:15:45,670 >> Então, se nós voltar, podemos transformar esta em algo um pouco mais útil. 219 00:15:45,670 --> 00:15:51,050 Talvez nós queremos apenas as ligações. 220 00:15:51,050 --> 00:15:58,790 Porque dentro dessa tag, eu também vou ter o hyperlink do caminho 221 00:15:58,790 --> 00:16:00,590 que vai para esta página. 222 00:16:00,590 --> 00:16:09,100 Então, se você olhar para este código aqui, o que vou fazer é em vez de CSS, 223 00:16:09,100 --> 00:16:12,380 Eu posso ir at_css. 224 00:16:12,380 --> 00:16:16,820 E isso só vai conseguir o primeiro elemento de todas essas coisas. 225 00:16:16,820 --> 00:16:20,890 Então, se eu fosse fazer isso até no Eu só código anteriormente demonstrado, 226 00:16:20,890 --> 00:16:23,800 em vez de devolver tudo deste, seria apenas 227 00:16:23,800 --> 00:16:26,850 retornar o primeiro deles. 228 00:16:26,850 --> 00:16:31,310 Então é assim que o operador at_css funciona. 229 00:16:31,310 --> 00:16:39,460 >> Por isso, queremos armazenar o caminho de toda a primeira uma marcação. 230 00:16:39,460 --> 00:16:47,430 E porque um vai dar-nos um-- então ainda estamos indo para usar CSS. 231 00:16:47,430 --> 00:16:53,830 Mas porque é que isto vai dar- nos de volta uma matriz inteira de etiquetas, 232 00:16:53,830 --> 00:16:55,710 nós estamos indo para o acesso o primeiro elemento. 233 00:16:55,710 --> 00:17:01,700 Portanto, esta é uma outra maneira que você pode acessar qualquer elemento particular se 234 00:17:01,700 --> 00:17:04,810 têm uma série de elementos que é devolvido, 235 00:17:04,810 --> 00:17:11,930 porque você pode tratar qualquer coisa que retornos .css como uma matriz, essencialmente. 236 00:17:11,930 --> 00:17:16,880 E então nós estamos indo para acessar o atributo de referência de hipertexto deste. 237 00:17:16,880 --> 00:17:24,810 >> Então, se você der uma olhada, se você parecia muito perto daqui, 238 00:17:24,810 --> 00:17:28,270 se você apenas essencialmente observe a barra de URL, 239 00:17:28,270 --> 00:17:33,880 este é o caminho que você vai ser raspando. 240 00:17:33,880 --> 00:17:41,565 Então, se nós apenas executar isso de novo, e certifique-se que você salvou-lo. 241 00:17:41,565 --> 00:17:47,040 242 00:17:47,040 --> 00:17:48,300 Você pode verificar em casa. 243 00:17:48,300 --> 00:17:51,430 Isso realmente combina com esta ligação. 244 00:17:51,430 --> 00:17:55,950 >> Então, por que pode queremos usar isso? 245 00:17:55,950 --> 00:17:57,870 Se você quiser raspar a página e tem 246 00:17:57,870 --> 00:18:00,270 uma página de links como Craigslist faz, você 247 00:18:00,270 --> 00:18:03,210 pode querer ir em seguida, em cada um desses links 248 00:18:03,210 --> 00:18:05,120 e, em seguida, a raspar conteúdo de que, a qual 249 00:18:05,120 --> 00:18:08,520 é exatamente o que vamos fazer. 250 00:18:08,520 --> 00:18:11,660 >> Portanto, uma vez que você tem como um caminho variável, eu já não realmente 251 00:18:11,660 --> 00:18:13,200 se preocupam com imprimi-lo. 252 00:18:13,200 --> 00:18:15,420 Eu só preciso armazená-lo como uma variável. 253 00:18:15,420 --> 00:18:20,980 E então eu posso acessar outro A página da mesma forma que acessar 254 00:18:20,980 --> 00:18:22,260 doc em primeiro lugar. 255 00:18:22,260 --> 00:18:25,920 Exceto com o URL, vamos usar interpolação de string 256 00:18:25,920 --> 00:18:29,180 como eu estava descrevendo em Rubi anteriormente para anexar 257 00:18:29,180 --> 00:18:32,010 o caminho para a extremidade da raiz. 258 00:18:32,010 --> 00:18:38,970 >> Então, o que isso vai fazer é isso vai colocar no caminho 259 00:18:38,970 --> 00:18:42,360 que eu raspei anteriormente e depois transformar essa 260 00:18:42,360 --> 00:18:49,580 em um novo item, o que você quiser chamar ele-- first_listing, por exemplo. 261 00:18:49,580 --> 00:18:52,900 Mas eu vou deixar -lo no artigo, por agora, 262 00:18:52,900 --> 00:18:55,420 porque é isso que eu estou usando aqui. 263 00:18:55,420 --> 00:19:02,900 >> Então, digamos que eu queria ter a descrição da primeira postagem no Craigslist. 264 00:19:02,900 --> 00:19:04,740 Assim, gostaria de ir para baixo aqui. 265 00:19:04,740 --> 00:19:10,660 Gostaria clique em Inspect Element de novo, porque esta é a descrição. 266 00:19:10,660 --> 00:19:14,350 Eu iria para baixo aqui e veja se eu posso encontrar como eu poderia 267 00:19:14,350 --> 00:19:16,530 ser capaz de pesquisar para esta tag única. 268 00:19:16,530 --> 00:19:19,530 E, neste caso, tem um ID, o que nos leva 269 00:19:19,530 --> 00:19:26,810 para a nossa próxima forma de procurar Tag, que está com uma hashtag. 270 00:19:26,810 --> 00:19:30,670 >> Assim, para as aulas, você pode usar o operador ponto. 271 00:19:30,670 --> 00:19:38,610 Então .txt é especificar uma classe de txt, Considerando que o hash especifica um ID. 272 00:19:38,610 --> 00:19:43,720 Portanto, neste caso, a etiqueta é seção, eo ID é postingbody. 273 00:19:43,720 --> 00:19:47,780 >> Então, isso vai e encontra- o first-- porque somos 274 00:19:47,780 --> 00:19:51,200 usando at_css-- este vai e considera que o primeiro elemento 275 00:19:51,200 --> 00:19:57,180 surge com a tag de seção eo ID de postingbody. 276 00:19:57,180 --> 00:20:02,636 E então você pode acessar o elemento de texto desse item voltou com .text. 277 00:20:02,636 --> 00:20:06,230 E então podemos armazenar que na descrição. 278 00:20:06,230 --> 00:20:09,370 >> Portanto, agora que temos um descrição da variável, 279 00:20:09,370 --> 00:20:14,850 poderemos ser capazes de fazer, digamos, arquivo I / O. Então arquivo I / O em Ruby 280 00:20:14,850 --> 00:20:21,310 é muito semelhante ao arquivo I / O em C, onde abrimos um arquivo. 281 00:20:21,310 --> 00:20:23,260 Poderíamos escrever para ele. 282 00:20:23,260 --> 00:20:25,060 E então nós vamos fechar esse arquivo. 283 00:20:25,060 --> 00:20:29,660 >> Então, aqui, nós estamos apenas nomear o arquivo, alguma variável arbitrária. 284 00:20:29,660 --> 00:20:33,120 Também poderíamos ter apenas colocar isso aqui. 285 00:20:33,120 --> 00:20:39,630 Nós temos uma variável que nós estamos armazenando o arquivo aberto como com File.open. 286 00:20:39,630 --> 00:20:46,370 E nós estamos escrevendo para este arquivo, por isso, abra-o com o operador w. 287 00:20:46,370 --> 00:20:54,280 E então nós colocamos na cadeia arquivo com o operador .puts. 288 00:20:54,280 --> 00:20:58,310 E então nós colocamos a variável que nós quer escrever para o arquivo dentro dessa. 289 00:20:58,310 --> 00:21:00,200 E então nós apenas feche o arquivo. 290 00:21:00,200 --> 00:21:04,000 >> Então, se nós ir em frente e executar esse, Isso deve produzir um documento 291 00:21:04,000 --> 00:21:10,840 com description.txt que vai esta descrição tem dentro dele. 292 00:21:10,840 --> 00:21:14,015 Então, se eu executar ele-- não. 293 00:21:14,015 --> 00:21:17,520 294 00:21:17,520 --> 00:21:23,330 É produzido um arquivo de texto com, esperançosamente, a mesma coisa. 295 00:21:23,330 --> 00:21:25,850 296 00:21:25,850 --> 00:21:33,290 Então pode ter havido uma nova postagem que veio enquanto eu estive conversando. 297 00:21:33,290 --> 00:21:36,580 E, de fato, parece que houve. 298 00:21:36,580 --> 00:21:43,380 Então, se vamos para este moto clássica, 1962-1966, que parece corresponder. 299 00:21:43,380 --> 00:21:45,620 E lá vai você. 300 00:21:45,620 --> 00:21:51,250 >> Então, isso é o mais básico funcionalidade de raspagem. 301 00:21:51,250 --> 00:21:57,510 Nós poderíamos ter, em vez de apenas escrever para esse arquivo, 302 00:21:57,510 --> 00:21:59,930 podemos adicionar coisas a uma matriz. 303 00:21:59,930 --> 00:22:03,770 Então, se eu declarar três matrizes, título, preço e descrição. 304 00:22:03,770 --> 00:22:06,310 305 00:22:06,310 --> 00:22:13,790 E estamos operando no item doc agora. 306 00:22:13,790 --> 00:22:16,940 Nós podemos passar e encontrar todas as span.txt. 307 00:22:16,940 --> 00:22:21,710 E lembre-se, este retorna uma matriz de todos os itens que encontrar. 308 00:22:21,710 --> 00:22:27,300 E então, em Ruby, você pode apenas usar .Cada para percorrer todos os itens 309 00:22:27,300 --> 00:22:28,410 da matriz. 310 00:22:28,410 --> 00:22:31,330 E, em seguida, para cada item, Eu só vou chamá-lo 311 00:22:31,330 --> 00:22:34,620 um link, porque é isso essencialmente o que é. 312 00:22:34,620 --> 00:22:46,830 >> Então, se eu colocar cada a.hdrlnk link.css ponto, este está realmente indo para o link 313 00:22:46,830 --> 00:22:58,280 e encontrar dentro dessa ligação outro Elemento HTML e classe correspondente. 314 00:22:58,280 --> 00:23:04,990 Portanto, se nos lembramos do que este foi, a span.txt, 315 00:23:04,990 --> 00:23:13,160 você pode ver- deixe-me voltar quick-- real dentro span.txt 316 00:23:13,160 --> 00:23:17,490 nós temos um monte de outras classes. 317 00:23:17,490 --> 00:23:27,180 Então, dentro span.txt, nós estamos procurando para um um tag com um hdrlnk classe. 318 00:23:27,180 --> 00:23:29,890 Então deixe-me achar que para vocês rapidinho. 319 00:23:29,890 --> 00:23:37,390 320 00:23:37,390 --> 00:23:42,850 >> Assim você pode ver aqui, esta é uma uma marca que está dentro do intervalo de classe txt 321 00:23:42,850 --> 00:23:44,920 que tem a hdrlnk classe. 322 00:23:44,920 --> 00:23:47,610 E isso é realmente o que nós estamos tentando conseguir. 323 00:23:47,610 --> 00:23:54,680 >> Então, estamos agora a tentar armazenar todos desses links dentro do título. 324 00:23:54,680 --> 00:23:59,545 E então nós estamos indo para imprimir a cada um desses links. 325 00:23:59,545 --> 00:24:00,360 Não, desculpe. 326 00:24:00,360 --> 00:24:04,530 Nós estamos indo para imprimir o preço de cada um deles. 327 00:24:04,530 --> 00:24:09,350 Então, vamos executar este realmente rápida e ver o que ele faz. 328 00:24:09,350 --> 00:24:14,680 329 00:24:14,680 --> 00:24:17,720 >> Portanto, este foi basicamente apenas através de cada um dos links 330 00:24:17,720 --> 00:24:27,310 por sua vez, acessado a marca em questão, e, em seguida, puxou o preço. 331 00:24:27,310 --> 00:24:33,910 E ele fez isso porque depois você tem tudo no título, 332 00:24:33,910 --> 00:24:37,260 nós apenas armazenado o título lá. 333 00:24:37,260 --> 00:24:40,180 Temos apenas armazenado no link no interior da matriz do título. 334 00:24:40,180 --> 00:24:47,720 E no presente para operação em malha, onde em vez de ir para a.hdrlnk, 335 00:24:47,720 --> 00:24:50,490 nós estamos olhando para uma span.price. 336 00:24:50,490 --> 00:24:56,500 Então, se eu só posso realmente encontrar rapidamente o preço, se você inspecionar o elemento, 337 00:24:56,500 --> 00:25:00,610 você vai ver que é uma extensão com a classe de preço. 338 00:25:00,610 --> 00:25:04,670 E isso é, essencialmente, como nós estamos começando o preço lá. 339 00:25:04,670 --> 00:25:10,040 >> Então essa é a verdade caso base de raspagem. 340 00:25:10,040 --> 00:25:13,550 É assim que você começa tudo os elementos de uma página 341 00:25:13,550 --> 00:25:16,510 que, por exemplo, você já sabe o URL. 342 00:25:16,510 --> 00:25:21,050 >> Portanto, se queremos obter um pouco mais em profundidade, 343 00:25:21,050 --> 00:25:23,950 podemos raspar páginas dentro de páginas. 344 00:25:23,950 --> 00:25:28,480 E para este exemplo, eu vou ser a saída para um arquivo CSV. 345 00:25:28,480 --> 00:25:39,510 Então, eu estou exigindo csv-se aqui porque Ruby não faz, dentro de si, 346 00:25:39,510 --> 00:25:42,350 tem a funcionalidade apenas para saída arquivos CSV. 347 00:25:42,350 --> 00:25:45,030 Então, isso é super simples. 348 00:25:45,030 --> 00:25:48,710 Deixe-me apenas ir para o próximo. 349 00:25:48,710 --> 00:25:51,640 350 00:25:51,640 --> 00:25:57,170 Cobrimos arquivo I / O. Então, é isso é semelhante à forma como ele é em C. 351 00:25:57,170 --> 00:26:00,870 E antes de passarmos para Kimono, Eu só vou lhe mostrar como realmente rápido 352 00:26:00,870 --> 00:26:02,790 para raspar sites de pontos turísticos. 353 00:26:02,790 --> 00:26:10,040 >> Então, nós já aprendeu para declarar matrizes em Ruby. 354 00:26:10,040 --> 00:26:13,280 Então, eu só estou declarando uma bando de matrizes arbitrárias 355 00:26:13,280 --> 00:26:16,310 que estará armazenando dados dentro. 356 00:26:16,310 --> 00:26:20,680 doc está a funcionar da mesma forma como fez no arquivo anterior. 357 00:26:20,680 --> 00:26:23,580 Vamos entrar, encontrar cada um dos span.txt de. 358 00:26:23,580 --> 00:26:25,040 Nós já sabemos que. 359 00:26:25,040 --> 00:26:32,130 Isso é o recipiente dentro do qual cada link tem todos os dados que nós queremos. 360 00:26:32,130 --> 00:26:40,800 >> Então, aqui o que estamos fazendo é para cada ligação de span class txt, nós estamos indo em 361 00:26:40,800 --> 00:26:45,720 e nós estamos encontrando a um tag, encontrar o primeiro elemento de que. 362 00:26:45,720 --> 00:26:49,937 Lembre-se, css retorna uma matriz, para que você não pode simplesmente acessá-lo como é. 363 00:26:49,937 --> 00:26:51,520 Nós vamos encontrar o primeiro elemento. 364 00:26:51,520 --> 00:26:56,430 Mesmo que seja uma matriz de um item, você tem que usar essa sintaxe, 365 00:26:56,430 --> 00:26:58,800 e em seguida, puxe o atributo href. 366 00:26:58,800 --> 00:27:01,800 >> Então nós fizemos isso antes. 367 00:27:01,800 --> 00:27:04,440 Portanto, este deve parecer familiar. 368 00:27:04,440 --> 00:27:14,330 E então agora temos uma matriz chamadas de caminhos de todas as nossas ligações 369 00:27:14,330 --> 00:27:16,590 que vamos querer usar. 370 00:27:16,590 --> 00:27:21,350 Então, se temos essa matriz de tudo dos caminhos que queremos usar, 371 00:27:21,350 --> 00:27:26,840 Podemos, então, criar um item para cada dessas páginas quando abrimos essa página. 372 00:27:26,840 --> 00:27:31,150 Assim como vimos também em a sintaxe antes, onde 373 00:27:31,150 --> 00:27:37,450 fazendo interpolação de string com o caminho aqui, então a sintaxe é apenas para o caminho. 374 00:27:37,450 --> 00:27:41,450 E eu poderia citar este variável qualquer nome arbitrário. 375 00:27:41,450 --> 00:27:43,070 >> Esta é a mais importante. 376 00:27:43,070 --> 00:27:46,650 Esta é a matriz que você vai ter acesso a cada elemento. 377 00:27:46,650 --> 00:27:52,400 Mas quando você diz para o caminho em caminhos, isto significa que para cada elemento em caminhos, 378 00:27:52,400 --> 00:27:55,150 chamá-lo de caminho, e usar isso. 379 00:27:55,150 --> 00:27:59,266 Esta é, essencialmente, como quando você fazer um loop e você usar int i. 380 00:27:59,266 --> 00:28:04,000 Assim, você pode considerar o caminho como a variável que está incrementando. 381 00:28:04,000 --> 00:28:07,820 >> E, em seguida, para cada um destes, entrar em cada um desses links. 382 00:28:07,820 --> 00:28:11,710 Porque nós estamos armazenando-o em página item, por isso estamos criando uma nova página a cada vez 383 00:28:11,710 --> 00:28:13,330 nós acessá-lo. 384 00:28:13,330 --> 00:28:20,560 E, em seguida, dentro dessa nova página, encontre span.postingtitletext, span.price, 385 00:28:20,560 --> 00:28:22,240 e, em seguida, seção # postingbody. 386 00:28:22,240 --> 00:28:28,430 Já cobertos seção # postingbody quando olhamos para a descrição. 387 00:28:28,430 --> 00:28:34,890 >> Assim, podemos ir ver no post Craigslist, se você está apenas olhando para o título, 388 00:28:34,890 --> 00:28:38,810 Você pode vê-lo aqui em cima, extensão postingtitletext. 389 00:28:38,810 --> 00:28:41,390 E é por isso que ele está lá. 390 00:28:41,390 --> 00:28:49,120 E, em seguida, para o preço, você pode acessá-lo com span class de preço. 391 00:28:49,120 --> 00:28:54,480 >> Assim também nós, talvez, poderia deseja armazenar o URL. 392 00:28:54,480 --> 00:28:58,580 Então vamos executar este novamente, armazená-lo em uma matriz, 393 00:28:58,580 --> 00:29:01,150 porque se você está procurando no Craigslist, você é 394 00:29:01,150 --> 00:29:05,290 provavelmente vai querer uma maneira de, se você vê algo que lhe interessa, 395 00:29:05,290 --> 00:29:06,620 voltar a esse site. 396 00:29:06,620 --> 00:29:10,480 Então você só quer armazenar o URL para referências causa. 397 00:29:10,480 --> 00:29:13,840 398 00:29:13,840 --> 00:29:19,630 >> Este é apenas essencialmente outra sintaxe para o loop. 399 00:29:19,630 --> 00:29:26,360 Eu só poderia fazer em vez paths.each por caminho em caminhos com índice. 400 00:29:26,360 --> 00:29:31,280 E essa sintaxe é o Ruby for-- caminho é o que fizemos até aqui, 401 00:29:31,280 --> 00:29:33,920 declarar uma variável para cada item. 402 00:29:33,920 --> 00:29:38,540 E índice se comporta como o i na C para loops. 403 00:29:38,540 --> 00:29:41,280 Assim, você pode manter o controle do que o índice é. 404 00:29:41,280 --> 00:29:45,200 >> Então aqui é apenas um pouca coisa conveniente 405 00:29:45,200 --> 00:29:46,950 para quando você estiver executando o raspador. 406 00:29:46,950 --> 00:29:50,580 Se você está raspando centenas de páginas, para se certificar de que não está pendurado, 407 00:29:50,580 --> 00:29:53,320 Ela só vai saída, Eu estou acessando esta página, 408 00:29:53,320 --> 00:29:55,960 e certificando-se de que ele ainda está continuando. 409 00:29:55,960 --> 00:29:59,250 Mas para os nossos propósitos, porque há uma centena de itens, 410 00:29:59,250 --> 00:30:08,000 Eu estou indo para acessar apenas três deles de modo que nós não ficar sem tempo aqui. 411 00:30:08,000 --> 00:30:13,040 >> Mas antes de chegarmos a isso, eu sou apenas vai mostrar-lhe muito rápido, 412 00:30:13,040 --> 00:30:16,940 I será emitir o título, preço, descrição e URL 413 00:30:16,940 --> 00:30:19,600 de cada um dos links que eu raspados. 414 00:30:19,600 --> 00:30:23,720 E então este é apenas o sintaxe para a biblioteca CSV. 415 00:30:23,720 --> 00:30:25,240 Você abre um arquivo CSV. 416 00:30:25,240 --> 00:30:27,070 Isto é o que eu vou chamá-lo. 417 00:30:27,070 --> 00:30:29,430 Abra-o com gravação do. 418 00:30:29,430 --> 00:30:33,830 E, em seguida, CSV será o arquivo que você está introduzindo tudo em. 419 00:30:33,830 --> 00:30:37,800 Este é apenas um teste de sanidade para me saber que ele está sendo executado. 420 00:30:37,800 --> 00:30:41,240 E este é o meu teste de sanidade para saber que ele está concluída. 421 00:30:41,240 --> 00:30:46,670 Então, eu estou colocando título em uma linha em o CSV, preço, url, descrição, 422 00:30:46,670 --> 00:30:49,420 tudo em linhas no CSV. 423 00:30:49,420 --> 00:30:53,410 >> Então, se nós ir e correr este agora-- e eu apenas 424 00:30:53,410 --> 00:31:04,710 ter certeza que eu tenho guardado ele-- vez de apenas mostrando o seu conteúdo para o terminal, 425 00:31:04,710 --> 00:31:09,750 devemos ter um CSV arquivo que é produzido. 426 00:31:09,750 --> 00:31:13,500 Então, aqui podemos ver o CSV arquivo que foi produzido. 427 00:31:13,500 --> 00:31:19,330 Esta é a saída do scape que eu apenas corri. 428 00:31:19,330 --> 00:31:23,030 Como você pode ver aqui, Acessando a página 0, 1, 2, 3. 429 00:31:23,030 --> 00:31:27,400 Estes são os títulos, preços, descrições. 430 00:31:27,400 --> 00:31:31,710 E se olharmos para este CSV arquivo que geramos, 431 00:31:31,710 --> 00:31:35,700 você pode ver a sua transmitido aqui. 432 00:31:35,700 --> 00:31:40,350 Este não é o Excel, por isso não é formatado em linhas e colunas. 433 00:31:40,350 --> 00:31:45,140 Mas você pode imaginar como ele pode ser formatada. 434 00:31:45,140 --> 00:31:47,740 >> CSV significa valores separados por vírgulas. 435 00:31:47,740 --> 00:31:50,090 Então você pode imaginar isso pode ser uma linha. 436 00:31:50,090 --> 00:31:54,700 E cada vírgula faria indicam uma coluna separada. 437 00:31:54,700 --> 00:32:00,010 Apenas uma palavra de notas PRECAUÇÃO às vezes você está 438 00:32:00,010 --> 00:32:02,260 raspando as coisas com um monte de vírgulas. 439 00:32:02,260 --> 00:32:05,100 Então, se você estiver saída lo para um arquivo CSV, 440 00:32:05,100 --> 00:32:10,340 Pode não saída do maneira que você poderia pensar. 441 00:32:10,340 --> 00:32:16,770 >> Então, isso é essencialmente tudo o que há para raspagem HTML básico 442 00:32:16,770 --> 00:32:20,110 páginas com Nokogiri. 443 00:32:20,110 --> 00:32:26,000 >> Assim, o ser Internet inovador, pois chegou-se 444 00:32:26,000 --> 00:32:33,220 com um mais automatizado e GUI versão, embora de forma menos robusta 445 00:32:33,220 --> 00:32:35,540 versão de raspagem vários sites. 446 00:32:35,540 --> 00:32:39,060 E para os nossos objectivos Eu vou estar demonstrando 447 00:32:39,060 --> 00:32:42,920 uma extensão do Chrome chamado quimono. 448 00:32:42,920 --> 00:32:46,690 E tudo que você tem a fazer é navegar para a página que você quer raspar. 449 00:32:46,690 --> 00:32:48,590 Você clica em um campo de interesse. 450 00:32:48,590 --> 00:32:51,510 Você calibrar os campos, porque ele será automaticamente 451 00:32:51,510 --> 00:32:54,360 detectar o que pensa você quer ser raspagem, 452 00:32:54,360 --> 00:32:56,280 e então você apenas criar uma API. 453 00:32:56,280 --> 00:33:03,700 >> Então, se tivéssemos de demonstrá-lo em Craigslist, ele realmente não iria funcionar. 454 00:33:03,700 --> 00:33:08,290 E é isso que eu ia voltar para dizendo sobre ele não ser tão robusto. 455 00:33:08,290 --> 00:33:10,320 Ele tem problemas para criar a API. 456 00:33:10,320 --> 00:33:13,400 Mas como uma demonstração do que ele faria, 457 00:33:13,400 --> 00:33:17,460 se você instalar a extensão Chrome, tudo que você faz é você clicar nele. 458 00:33:17,460 --> 00:33:21,750 Ele Kimonofies a página, e então você clique sobre a coisa que você quer script. 459 00:33:21,750 --> 00:33:24,480 >> Então, se eu fosse para clicar em isso, gostaria de destacar 460 00:33:24,480 --> 00:33:28,130 o que ele pensa que eu quero ser raspar essa página. 461 00:33:28,130 --> 00:33:33,660 Então, talvez eu chamo esta listagem. 462 00:33:33,660 --> 00:33:36,430 Esta é quantos itens eu selecionei. 463 00:33:36,430 --> 00:33:43,810 E eu só posso confirmar ou negar alguns das outras listas sugeridas 464 00:33:43,810 --> 00:33:49,600 para obtê-lo para adicionar à o que será raspada. 465 00:33:49,600 --> 00:33:52,330 >> Então agora podemos ver que há uma centena de itens selecionados. 466 00:33:52,330 --> 00:33:58,060 Se eu quero ter um outro campo que eu também raspar o que está relacionado com esta, 467 00:33:58,060 --> 00:34:02,540 dizer que eu quero raspar o preço bem, então eu posso fazer o mesmo. 468 00:34:02,540 --> 00:34:06,190 469 00:34:06,190 --> 00:34:11,550 >> Então aqui está uma demonstração de como é muito menos robusta, porque agora é 470 00:34:11,550 --> 00:34:15,050 pegar a cidade em vez de apenas o preço que eu quero. 471 00:34:15,050 --> 00:34:16,989 E agora ele é pego 200 coisas. 472 00:34:16,989 --> 00:34:19,880 Você pode voltar e apagar. 473 00:34:19,880 --> 00:34:21,449 Você pode tentar novamente. 474 00:34:21,449 --> 00:34:24,250 Mas não há garantias. 475 00:34:24,250 --> 00:34:29,909 Esta é a forma como isso funciona, às vezes. 476 00:34:29,909 --> 00:34:32,969 Como você pode ver aqui, agora ele diz que 96 aqui em cima. 477 00:34:32,969 --> 00:34:37,000 É pegou a maioria dos links que pretende raspar, mas não 478 00:34:37,000 --> 00:34:39,280 necessariamente todos eles. 479 00:34:39,280 --> 00:34:43,909 >> Outra ferramenta útil de Kimono embora é que você pode ir para Recursos Avançados 480 00:34:43,909 --> 00:34:47,980 aqui, vá para Avançado, e ele vai te mostrar 481 00:34:47,980 --> 00:34:53,139 o colapso do único maneira de acessar o HTML 482 00:34:53,139 --> 00:34:54,909 tags que você deseja. raspar 483 00:34:54,909 --> 00:35:01,450 Assim, para anúncios, se você olhar para aqui, se você acessar div p abrangem uma extensão, 484 00:35:01,450 --> 00:35:06,030 você pode realmente usar apenas esta em seu código Nokogiri, 485 00:35:06,030 --> 00:35:10,780 onde antes tínhamos span.txt para acessar cada uma das listas. 486 00:35:10,780 --> 00:35:13,270 Se eu quiser apenas o texto dentro das listas, 487 00:35:13,270 --> 00:35:18,950 Eu podia entrada espaço div p espaço espaço espaço espaço espaço um, 488 00:35:18,950 --> 00:35:21,570 e permitiria alcançar o mesmo efeito. 489 00:35:21,570 --> 00:35:26,320 E para aqueles de vocês que estão interessados no uso de expressões regulares, 490 00:35:26,320 --> 00:35:31,670 isso acontece para também dar-lhe o habitual expressão de classificação da seqüência de caracteres para entrada 491 00:35:31,670 --> 00:35:34,900 para encontrar as coisas você está tentando encontrar. 492 00:35:34,900 --> 00:35:44,130 >> Portanto, não há outro recurso legal de Kimono, onde pode paginar, 493 00:35:44,130 --> 00:35:47,780 o que não só eu posso raspar Os resultados desta página, 494 00:35:47,780 --> 00:35:50,890 Posso clicar neste pequeno botão aqui, Paginação, 495 00:35:50,890 --> 00:35:55,580 especificar que o botão leve-me para a próxima página, 496 00:35:55,580 --> 00:35:59,500 e, em seguida, ela só vai saber que ele pode fazer uma iteração para a próxima página, 497 00:35:59,500 --> 00:36:04,120 e, em seguida, raspar todos as-- contanto como é o mesmo formato de course-- 498 00:36:04,120 --> 00:36:06,110 scape todos esses links também. 499 00:36:06,110 --> 00:36:15,230 >> Então porque Kimono não quer trabalhar com Craigslist, o que temos feito 500 00:36:15,230 --> 00:36:19,790 é que eu Kimonofied o Crimson de Harvard. 501 00:36:19,790 --> 00:36:29,380 Eu puxado para fora algum do tipo de top artigos em destaque, confirme aqui. 502 00:36:29,380 --> 00:36:33,090 Diga tudo isso. 503 00:36:33,090 --> 00:36:35,830 Eu compilei esta API para você antes do tempo. 504 00:36:35,830 --> 00:36:38,990 Mas caso contrário, o que você faria é você apenas clique em Concluído. 505 00:36:38,990 --> 00:36:40,940 Introduza os seus dados API. 506 00:36:40,940 --> 00:36:45,260 Configurá-lo para qualquer um rastreamento automático ou manual. 507 00:36:45,260 --> 00:36:48,460 Assim, você poderá atualizar o seu dados a cada 15 minutos, 508 00:36:48,460 --> 00:36:50,330 semanalmente, diariamente, o que quiser. 509 00:36:50,330 --> 00:36:51,160 Nome do seu API. 510 00:36:51,160 --> 00:36:52,790 Criar a API. 511 00:36:52,790 --> 00:36:58,460 Para seu benefício, eu criei o Carmesim página API frente já. 512 00:36:58,460 --> 00:37:02,480 >> Então você acabou de criar uma conta no quimono, e 513 00:37:02,480 --> 00:37:06,240 vai armazenar todas as suas APIs para você. 514 00:37:06,240 --> 00:37:10,330 Então, basicamente isso é tudo o arranhões diferentes separadas. 515 00:37:10,330 --> 00:37:18,250 >> Portanto, se olharmos aqui, esta é a opiniões links que eu coletei. 516 00:37:18,250 --> 00:37:21,290 Estes são os destacados links que eu coletei. 517 00:37:21,290 --> 00:37:24,090 E estes são os mais lidos links que eu coletei 518 00:37:24,090 --> 00:37:27,120 a partir deste mais recente escapo API. 519 00:37:27,120 --> 00:37:30,790 >> Então, se você pode ver aqui, estes seriam o destaque, 520 00:37:30,790 --> 00:37:34,130 estas seriam as opiniões, que neste exemplo, 521 00:37:34,130 --> 00:37:38,150 Eu já combinado todos eles em uma coleção. 522 00:37:38,150 --> 00:37:42,780 Mas se você simplesmente brincar com ele um pouco, você pode dividi-lo 523 00:37:42,780 --> 00:37:45,090 e dividi-lo contudo você quer, contanto 524 00:37:45,090 --> 00:37:47,520 como a formatação é ligeiramente diferente. 525 00:37:47,520 --> 00:37:51,320 >> Só para brincar com isso, o crawl configurado, uma das desvantagens 526 00:37:51,320 --> 00:37:58,120 é que você só pode rastejar 25 páginas de cada vez. 527 00:37:58,120 --> 00:38:00,430 Esse é um dos fatores limitantes. 528 00:38:00,430 --> 00:38:03,060 Mas aqui, se você defini-lo Para rastrear o manual, este 529 00:38:03,060 --> 00:38:06,100 É assim que você pode dizer que para atualizar seus dados. 530 00:38:06,100 --> 00:38:11,010 E aqui você pode ver o seu histórico de rastreamento de tudo o que você arrastou. 531 00:38:11,010 --> 00:38:16,000 E vocês podem voltar, se inscrever, brincar com todas as maneiras diferentes 532 00:38:16,000 --> 00:38:20,340 que você pode modificar e utilizar os seus dados. 533 00:38:20,340 --> 00:38:24,580 >> Quimono pode ser configurado para raspar links dentro de links. 534 00:38:24,580 --> 00:38:29,700 E você iria fazê-lo em primeiro lugar raspando uma lista de links, 535 00:38:29,700 --> 00:38:35,390 e, em seguida, usar essa API como um saltar fora do ponto para outro API 536 00:38:35,390 --> 00:38:36,710 que você criar o script. 537 00:38:36,710 --> 00:38:42,040 Mas isso é mais complicado do que o que nós estamos indo para entrar em hoje. 538 00:38:42,040 --> 00:38:44,270 >> Então, isso é Kimono. 539 00:38:44,270 --> 00:38:46,980 Vamos falar sobre os prós e contras de Nokogiri e quimono. 540 00:38:46,980 --> 00:38:50,380 >> Nokogiri, é muito rápido. 541 00:38:50,380 --> 00:38:51,640 É fácil de testar. 542 00:38:51,640 --> 00:38:55,910 Você pode apenas coloca qualquer coisa para console, fácil de configurar. 543 00:38:55,910 --> 00:39:00,400 Você pode decidir exatamente o que você quer raspar e loja. 544 00:39:00,400 --> 00:39:02,060 Não há limites de página. 545 00:39:02,060 --> 00:39:08,010 I realmente é utilizado para raspar como 1800 sites escolares Sul Africano 546 00:39:08,010 --> 00:39:10,870 para e-mails para um estágio que eu fiz. 547 00:39:10,870 --> 00:39:16,060 >> Então, isso é possível, embora as melhores práticas seria a de dividir o script. 548 00:39:16,060 --> 00:39:19,310 Porque se ele falhar, em seguida, você não ganha nada. 549 00:39:19,310 --> 00:39:22,790 Mas se você fizer uma centena, talvez 200 páginas por vez, 550 00:39:22,790 --> 00:39:27,840 então você tem alguma chance de, pelo menos, começá-lo aos poucos, especialmente 551 00:39:27,840 --> 00:39:30,280 se você tem mau internet. 552 00:39:30,280 --> 00:39:32,720 >> Infelizmente ele só pode raspar HTML. 553 00:39:32,720 --> 00:39:35,190 Então se você tem pages-- carregado dinamicamente 554 00:39:35,190 --> 00:39:39,480 e eu vou mostrar-lhe um exemplo como caiaque em um second-- 555 00:39:39,480 --> 00:39:42,270 Nokogiri infelizmente não pode raspar que. 556 00:39:42,270 --> 00:39:45,700 >> Mas Kimono também é fácil de usar. 557 00:39:45,700 --> 00:39:48,330 Como você viu, é, essencialmente, um ponto e clique. 558 00:39:48,330 --> 00:39:50,260 Pode raspar Javascript. 559 00:39:50,260 --> 00:39:53,790 Infelizmente, há uma máxima de quantas páginas você pode raspar. 560 00:39:53,790 --> 00:39:55,710 Às vezes é um pouco difícil de configurar. 561 00:39:55,710 --> 00:39:57,240 Ele fica confuso. 562 00:39:57,240 --> 00:40:00,920 Mas é definitivamente algo a considerar 563 00:40:00,920 --> 00:40:05,930 se você não está tentando ter um raspar sustentável super-robusto. 564 00:40:05,930 --> 00:40:09,010 Se você só quer ficar tudo fora de uma página rapidamente, 565 00:40:09,010 --> 00:40:10,970 então é realmente um Kimono boa ferramenta para usar. 566 00:40:10,970 --> 00:40:16,490 E como eu mencionei antes, há o recurso avançado de Kimono 567 00:40:16,490 --> 00:40:19,260 que lhe como mostra o único acesso HTML 568 00:40:19,260 --> 00:40:24,210 elemento, que é super útil mesmo se você estiver trabalhando em Nokogiri. 569 00:40:24,210 --> 00:40:30,370 >> Então, se nós ir para o site do Kayak, para exemplo, você pode ver que há é-- 570 00:40:30,370 --> 00:40:31,750 ou talvez você não pode ver. 571 00:40:31,750 --> 00:40:38,910 Mas se eu lhe mostrar a URL para Kayak, este, na verdade, é apenas o URL de origem. 572 00:40:38,910 --> 00:40:43,800 Este é o URL antes de ser modificada por qualquer scripts JavaScript 573 00:40:43,800 --> 00:40:45,350 que eles tem em curso. 574 00:40:45,350 --> 00:40:52,420 E isso está indo olhar diferente de inspecionar o elemento. 575 00:40:52,420 --> 00:40:55,940 >> Então, se você passar e você igualar-se o elemento Inspecione 576 00:40:55,940 --> 00:41:00,340 código para o código-fonte, é realmente vai ser diferente. 577 00:41:00,340 --> 00:41:05,640 E este é, essencialmente, por que Nokogiri não pode raspar locais carregados dinamicamente. 578 00:41:05,640 --> 00:41:08,810 Porque é Nokogiri raspando o URL de origem, 579 00:41:08,810 --> 00:41:16,310 Considerando que é, na verdade Kimono raspando o que você é, essencialmente, 580 00:41:16,310 --> 00:41:18,260 vendo em Selecionar elemento. 581 00:41:18,260 --> 00:41:23,880 >> Então, se eu passar e eu tentar Kimonofy Kayak, 582 00:41:23,880 --> 00:41:26,600 Eu posso realmente passar por e selecione o preço. 583 00:41:26,600 --> 00:41:32,360 É um pouco mais difícil, e, neste caso, é 584 00:41:32,360 --> 00:41:36,600 realmente vendo este preço como diferentes destes. 585 00:41:36,600 --> 00:41:41,110 Assim, enquanto você pode ou configure-- Se assim não fosse carregado dinamicamente, 586 00:41:41,110 --> 00:41:43,620 você poderia configurar Nokogiri para obter todos estes. 587 00:41:43,620 --> 00:41:48,230 >> Porque a formatação é ligeiramente diferente para esta listagem 588 00:41:48,230 --> 00:41:51,280 como ele é comparado com o resto um deles, e você pode ver aqui 589 00:41:51,280 --> 00:41:54,830 ele é realmente ido e seleccionados todos os preços de voos. 590 00:41:54,830 --> 00:42:01,200 Talvez eu queira seleccionar tempo de voo também. 591 00:42:01,200 --> 00:42:04,700 E eu posso passar e tipo de configurar isso. 592 00:42:04,700 --> 00:42:06,950 Eu não quero isso. 593 00:42:06,950 --> 00:42:10,200 Eu só quero que o tempo do próximo voo. 594 00:42:10,200 --> 00:42:17,030 E, depois de um par destes passando, fica a imagem. 595 00:42:17,030 --> 00:42:19,080 Então Kimono muito inteligente. 596 00:42:19,080 --> 00:42:21,900 É apenas não é tão robusto. 597 00:42:21,900 --> 00:42:26,710 >> Existem alguns outros alternativas que você pode usar. 598 00:42:26,710 --> 00:42:31,600 E eu vou mostrar-lhe-los aqui. 599 00:42:31,600 --> 00:42:35,790 Se você está mais confortável em Python, em vez do Ruby talvez, 600 00:42:35,790 --> 00:42:39,290 existe uma biblioteca chamada Beautiful Soup. 601 00:42:39,290 --> 00:42:40,430 Você pode usar isso. 602 00:42:40,430 --> 00:42:42,270 É muito semelhante ao Nokogiri. 603 00:42:42,270 --> 00:42:44,620 Tem mais algumas funcionalidades. 604 00:42:44,620 --> 00:42:52,160 Você pode encontrar uma tag HTML e em seguida, mover para cima ou mover lateralmente. 605 00:42:52,160 --> 00:42:54,690 >> Há PyQt. 606 00:42:54,690 --> 00:42:57,820 Este facto pode raspar dinâmica locais, porque é uma espécie de 607 00:42:57,820 --> 00:43:02,540 é um WebKit que finge ser um navegador sem que realmente 608 00:43:02,540 --> 00:43:03,670 ser um navegador. 609 00:43:03,670 --> 00:43:07,490 Por isso, seria esperar por toda a JavaScript para carregar primeiro, e depois 610 00:43:07,490 --> 00:43:09,560 entrar e tentar raspar o site. 611 00:43:09,560 --> 00:43:13,560 >> Se você quiser ficar com Ruby, você pode ir um nível acima do Nokogiri. 612 00:43:13,560 --> 00:43:17,650 Você pode usar com Capybara um invólucro de Poltergeist. 613 00:43:17,650 --> 00:43:22,910 E isso pode realmente essencialmente fazer a mesma coisa 614 00:43:22,910 --> 00:43:26,610 como PyQt, o que é que é um WebKit. 615 00:43:26,610 --> 00:43:29,610 Ele aguarda o JavaScript para carregar em primeiro lugar. 616 00:43:29,610 --> 00:43:33,340 Se você mexer com ela o suficiente, você pode até mesmo fazê-lo clicar sobre as coisas. 617 00:43:33,340 --> 00:43:42,780 >> Portanto, se há um link que não é a href clássico onde 618 00:43:42,780 --> 00:43:46,350 o caminho é de fácil acesso, e é alguma coisa JavaScript que detecta 619 00:43:46,350 --> 00:43:49,490 um clique, você pode realmente fazer isso. 620 00:43:49,490 --> 00:43:53,430 A biblioteca mais populares para simular um utilizador 621 00:43:53,430 --> 00:43:56,390 está em JavaScript, que é PhantomJS. 622 00:43:56,390 --> 00:44:01,010 Isto, obviamente, pode raspar dinâmica sites, porque este é essencialmente 623 00:44:01,010 --> 00:44:04,270 fingindo ser Chrome sem a interface do usuário. 624 00:44:04,270 --> 00:44:09,970 >> E então, é claro, o mais robusto, mas mais lento opção, 625 00:44:09,970 --> 00:44:13,260 é um navegador de automação selênio. 626 00:44:13,260 --> 00:44:15,550 E, infelizmente, você não está indo para ser 627 00:44:15,550 --> 00:44:19,770 capaz de fazer isso dentro de seu IDE CS50. 628 00:44:19,770 --> 00:44:24,140 Devido essencialmente o que faz é ele inicia seu Chrome, 629 00:44:24,140 --> 00:44:27,090 Firefox, qualquer que seja navegador que você deseja usar, 630 00:44:27,090 --> 00:44:32,570 e talvez ele controla o mouse movimento, o que quer que você digita, 631 00:44:32,570 --> 00:44:35,170 e é apenas uma espécie de automatiza esse processo. 632 00:44:35,170 --> 00:44:42,070 Por isso, foi desenvolvido como uma espécie de website ferramenta de teste de automação. 633 00:44:42,070 --> 00:44:45,910 Mas um monte de pessoas usam Selenium para raspar sites 634 00:44:45,910 --> 00:44:49,990 que de outra forma ter um muita dificuldade raspagem 635 00:44:49,990 --> 00:44:53,700 com algumas destas outras ferramentas, mais rápidos. 636 00:44:53,700 --> 00:44:57,530 >> Então, isso é tudo que eu tenho para web scraping. 637 00:44:57,530 --> 00:44:58,090 Diverta-se. 638 00:44:58,090 --> 00:45:01,762 639 00:45:01,762 --> 00:45:02,680 >> AUDIÊNCIA: Pergunta. 640 00:45:02,680 --> 00:45:04,016 >> ROBERT KRABEK: Sim. 641 00:45:04,016 --> 00:45:12,840 >> AUDIÊNCIA: Existe um mecanismo de hash o site para que você poderia, basicamente, 642 00:45:12,840 --> 00:45:14,207 passar por isso mais tarde. 643 00:45:14,207 --> 00:45:15,040 ROBERT KRABEK: Yeah. 644 00:45:15,040 --> 00:45:21,530 Então nós colocamos o, em nossa exemplo, para ambos, 645 00:45:21,530 --> 00:45:24,980 nós colocamos todo o site em doc. 646 00:45:24,980 --> 00:45:31,260 E assim você realmente pode apenas tomar o doc variável e escrevê-lo em um arquivo. 647 00:45:31,260 --> 00:45:35,490 Então, se eu quisesse, eu poderia escrevê-lo como um arquivo HTML, 648 00:45:35,490 --> 00:45:39,280 e, em seguida, em vez de utilizar OpenURI e um pedido cURL, 649 00:45:39,280 --> 00:45:43,520 então eu poderia simplesmente abrir doc HTML e, em seguida, procurar isso. 650 00:45:43,520 --> 00:45:47,960 >> AUDIÊNCIA: Mas você pode preservar o tipo de experiência on-line 651 00:45:47,960 --> 00:45:48,930 enquanto você faz offline. 652 00:45:48,930 --> 00:45:51,013 Por exemplo. quando você é voando por várias horas, 653 00:45:51,013 --> 00:45:54,070 Eu quero basicamente arquivo todo o site. [INAUDÍVEL] 654 00:45:54,070 --> 00:45:58,780 >> ROBERT KRABEK: Sim, isso é exactly-- assim literalmente o que isso está fazendo 655 00:45:58,780 --> 00:46:03,010 é ele está tomando tudo que seria neste URL. 656 00:46:03,010 --> 00:46:11,280 Então, se nós funcionamos cURL, é Levando tudo isso em HTML, 657 00:46:11,280 --> 00:46:14,590 e ele está armazenando- dentro do doc variável. 658 00:46:14,590 --> 00:46:17,290 Então você pode fazer o que você quer fazer com doc. 659 00:46:17,290 --> 00:46:18,575 Você pode saída para um arquivo. 660 00:46:18,575 --> 00:46:19,950 AUDIÊNCIA: Mas ele não está ligado. 661 00:46:19,950 --> 00:46:20,780 Não é dinâmica. 662 00:46:20,780 --> 00:46:22,770 Não é recursiva, certo? 663 00:46:22,770 --> 00:46:24,016 Você vê o que eu quero dizer? 664 00:46:24,016 --> 00:46:28,359 Eu estou tentando basicamente tipo de um hash todo o site no meu disco rígido 665 00:46:28,359 --> 00:46:31,150 para que eu pudesse fazê-lo, basicamente, durante várias horas sem Internet. 666 00:46:31,150 --> 00:46:32,025 >> ROBERT KRABEK: Certo. 667 00:46:32,025 --> 00:46:37,140 Então, se eu had-- então onde está o meu arquivo I / O? 668 00:46:37,140 --> 00:46:47,766 Portanto, este é o arquivo I / O. Então diga vez a isso, eu chamo isso de craigslist.html. 669 00:46:47,766 --> 00:46:52,620 670 00:46:52,620 --> 00:46:53,940 Eu abrir isso. 671 00:46:53,940 --> 00:46:59,020 Eu tinha puts doc para ele. 672 00:46:59,020 --> 00:47:00,470 Eu feche o arquivo. 673 00:47:00,470 --> 00:47:05,410 E depois é só porque o CS50 IDE é sobre a nuvem, que é o que quer. 674 00:47:05,410 --> 00:47:07,710 Eu posso ir aqui. 675 00:47:07,710 --> 00:47:09,320 Eu posso baixar o arquivo. 676 00:47:09,320 --> 00:47:11,830 E, em seguida, que seria no meu disco rígido. 677 00:47:11,830 --> 00:47:13,930 Assim, você pode fazê-lo dessa maneira. 678 00:47:13,930 --> 00:47:18,830 Ou se você está em casa, não usando o CS50 IDE, como Sublime ou algo assim, 679 00:47:18,830 --> 00:47:21,900 isso é ainda mais fácil, porque isto é tudo disponível localmente, 680 00:47:21,900 --> 00:47:23,020 não ligada à internet. 681 00:47:23,020 --> 00:47:24,720 >> AUDIÊNCIA: Entendo. 682 00:47:24,720 --> 00:47:26,580 Este é um problema particular para. 683 00:47:26,580 --> 00:47:30,410 Você pode fazê-lo de forma recursiva para que você ir várias camadas de profundidade tipo de coisa? 684 00:47:30,410 --> 00:47:33,801 >> ROBERT KRABEK: eu posso baixar pastas bem, se é isso que você está perguntando. 685 00:47:33,801 --> 00:47:34,426 AUDIÊNCIA: É. 686 00:47:34,426 --> 00:47:39,890 687 00:47:39,890 --> 00:47:41,440 >> ROBERT KRABEK: Cool. 688 00:47:41,440 --> 00:47:43,182