Olá! Na segunda parte, daremos continuidade à implementação do nosso spider, vamos executá-lo e extrair todas as informações que a gente precisa. Apenas recapitulando, na parte nós criamos spider com o nome virada cultural, definimos essa overhead de início, que é a página inicial da virada cultural aprendemos como manipular no scrapy shells XPath e agora vamos então implementar o nosso método parse. O nosso método parse vai começar instanciando seletor para a gente poder aplicar XPath naquela resposta da página inicial e a gente vai fazer aqui a mesma chamada que a gente fez no scrapy shell. Essa chamada via XPath vai nos dar todas as URLs da cidade. Isso seria equivalente a, estando na página inicial da página da virada cultural, eu pegar cada dos links das cidades, que eu tenho todas aqui embaixo como vocês podem observar. O nosso spider agora tem que clicar cada uma dessas cidades e pegar as informações das atrações artísticas. No scrapy é muito simples fazer isso. Nós temos todas as URLs. Nós vamos iterar sobre essas URLs, esse código só faz isso, e fazer uma requisição acessando cada uma dessas URLs. Ao acessar a gente vai ter uma resposta e essa resposta vai ser passada automaticamente para esse novo método chamado parse_atracao, que vai extrair as informações das atrações artísticas. Esse método parse_atracao é muito parecido com o método parse anterior. Ele vai ter seletor que representa a HTML da resposta obtida e vai pegar as informações das atrações artísticas. Quais informações a gente vai ter que pegar? Se a gente olhar aqui o código, a gente precisa pegar a primeira informação, o nome da cidade. Se a gente inspecionar o HTML, a gente consegue observar aqui que o nome da cidade está na tag h1 com essa classe title. Usando XPath a gente consegue facilmente fazer isso através dessa chamada: body_sel_xpath h1 pegando o texto daquele h1, aquele elemento h1. Repare aqui que o XPath está sendo chamado dentro de uma outra função to_str, que significa to string, que é uma função auxiliar que eu mesmo criei. Essa função auxiliar nada mais faz do que simplificar a manipulação do selector. Aqui vocês observar que eu dei extract, vai pegar o conteúdo HTML. Selector, essa chamada extract sempre vai retornar uma lista. No caso eu só quero o primeiro elemento simples dessa lista. Eu pego o primeiro elemento e a gente dá encode uft-8, que seria uma forma de você estruturar melhor esse formato string para depois armazená-lo num banco de dados. A seguir a gente têm que pegar outras informações artísticas. Se a gente olhar aqui na página, a próxima informação a ser pegada seriam os locais e as atrações de cada dia da virada. Aqui para simplificar eu vou pegar apenas o primeiro lugar de cada uma das cidades. Então, por exemplo, eu vou pegar só esse palco externo Araraquara, fica como lição para vocês pegarem todos os lugares depois. Se eu quiser pegar o endereço dessa primeira atração, eu inspeciono o HTML e eu consigo ver que ele é bem simples: é elemento span que tem uma classe address e aqui está o conteúdo address. Facilmente eu usei XPath. Da mesma forma anterior, eu vou e eu uso o span. Qual span? Aquele span cuja classe é address e pego o texto e também trato melhor esse string usando a minha função auxiliar. A seguir a gente vai pegar as atrações propriamente ditas nesse dia. Se a gente observar aqui, as atrações estão bem estruturadas na página. A gente tem uma lista onde cada uma das atrações é item dessa lista e dentro desse item a gente tem as outras informações que a gente precisa, como o horário, a data e o artista daquela atração. Bom, nesse caso eu vou configurar o spider para pegar todos esses elementos aqui e diferentemente dos exemplos anteriores eu vou querer pegar seletores. Eu vou pegar os seletores, porque eu vou precisar pegar o conteúdo depois de cada desses itens. como a data, o horário, a tração propriamente dita, o artista. Então, aqui cada desses seletores eu vou aproveitar para instanciar o nosso modelo ou atração, que seria aquele modelo que a gente definiu na página anterior. Uma atração é uma classe e eu passo para ela então já a cidade e o endereço que eu acabei de extrair e vou popular o resto das informações. A próxima informação que eu vou armazenar seria o dia dessa atração. Se a gente olhar o dia, é facilmente obtido, ele é dentro do elemento li, a gente tem link, timer e span cuja classe é date e a gente tem aqui uma string que representa o dia: 14/5 que seria dia 14 do mês cinco. Bom, com base nisso a gente configura então o scrapy, usando XPath também, span cuja classe é date e eu pego o conteúdo texto desse span. Repare aqui que no começo da XPath eu estou usando ponto barra barra. Esse ponto barra barra significa que eu estou apenas olhando para o escopo daquele meu seletor. Eu não estou olhando para todo o HTML da página, mas sim aquele trechinho que o meu seletor está representando, que seriam as listas das atrações artísticas. E aqui eu estou usando outra função auxiliar to_date. Eu poderia guardar o conteúdo extraído diretamente num banco de dados. Mas, isso não é muito aconselhável, porque esse objeto, esse conteúdo é uma data. O ideal é você guardar no banco de dados esse tipo de informação no formato de data mesmo, objeto data. E para fazer isso então eu criei essa função auxiliar que começa pegando então, recebendo seletor. Ao receber esse seletor eu uso a minha função auxiliar anterior to_string para pegar a string 14/5. Seguida eu uso esse método split. Esse método split divide a string usando esse elemento que eu defino como divisor. Então, no caso eu estou dividindo a string pela barra. Como retorno eu tenho uma lista com duas strings: 14 e cinco. Seguida eu pego o ano corrente, que é fácil usando essa, eu obtive usando essa função default do Python, padrão do Python, que é date.today.year, seguida eu construo o objeto date. Usando date time, que também é uma função do Python, eu passo o ano, o mês, só que repare que eu faço cast, como a gente chama programação, porque eu preciso passar inteiro, inteiro não, uma string. E a mesma coisa para o dia. A seguir eu uso essa função strf time que formata a data para o padrão brasileiro: dia, mês e ano. Com isso eu tenho o meu dia calculado. Seguida eu pego a hora. A hora é muito similar: eu tenho span cuja classe é hour e eu pego o texto dessas informações. Aqui eu vou armazenar via texto mesmo no banco de dados. Seguida eu pego o artista, que também é muito fácil de pegar usando o span cuja class é artist e pego o texto desse elemento HTML. Seguida eu chamo essa função print_item que nada mais vai fazer do que imprimir o conteúdo extraído na tela. Vamos então executar o nosso spider. Apenas para dar ideia do todo, todos esses pedaços viraram esse código, que é o virada cultura spider que chama o método parse e o método atração. Uma vez que a gente cria o nosso spider no scrapy, a gente executa de maneira muito simples: a gente entra na URL do projeto. Eu estou aqui no meu projeto. Eu uso o comando scrapy crawl virada_cultural, que é o nome que a gente definiu no nosso código. Ao fazer isso, o scrapy vai executar o spider e pegar todas as informações de cidade. Repare aqui que aqui eu tenho todas as informações da cidade. Repare, por exemplo, aqui a hora dessa informação, o endereço, a data formatada, o nome da cidade, aqui cima eu tenho outras informações de outras cidades, registro. Então, assim a gente finaliza essa segunda parte, todo o código desenvolvido está disponível nesse repositório e o quê que falta para a gente fazer crawler real, digamos assim? Repare aqui que eu estou apenas imprimindo uma informação extraída na tela, eu não guardei lugar nenhum. Então, o primeiro passo é armazenar essas informações num banco de dados, por exemplo. Isso é muito fácil de fazer usando o Scrapy Item Pipelines, que com isso você consegue definir classes que armazenariam automaticamente o conteúdo extraído num banco de dados. E também, se você estiver fazendo crawler de algo que muda periodicamente, uma opção é você usar o Scrapy Cloud para fazer a implantação dos seus spiders na nuvem e executá-los periodicamente. É isso. Eu espero que vocês tenham gostado. [MÚSICA] [MÚSICA] [MÚSICA]