Faz um tempo que não posto nada não é verdade?
Bom, agora estou de "férias"(sem trampo rsrsrs) e vou tentar me dedicar mais ao blog, pra falar a verdade, tenho 2 artigos para finalizar, a preguiça e o Elder Scrolls não estão deixando kkkk
Um deles eu quero passar o básico para se examinar um aplicativo mobile, desde o tráfego de dados até o source code, com foco em apk(Android), algo bem howto mesmo, eu penei um pouco pra achar bons tutos que explicam desde o decompilar até o recompilar com assinatura e tal, enfim.
Outro que quero mostrar é algo que estou criando com o scrapy, mesmo framework que vou demonstrar nesse artigo, enfim, vamos ao que interessa certo?
Agora na madruga eu estava fazendo um pentest e precisava de nomes de usuários para fazer uma wordlist para enumerar um ssh, porém, queria nomes de pessoas do BR, a solução que achei foi procurar no google por nomes de pessoas brasileiras, então eu achei esse site: http://www.dicionariodenomesproprios.com.br/
Certo, nele existe uma lista com nomes masculinos e nomes femininos, o que vou mostrar é como automatizar isso para que se pegue todos os nomes do site de forma rápida e fácil.
Primeiro, caso não tenha instalado o python e/ou scrapy, leia sobre aqui.
Caso já tenha instalado, prosseguiremos. (Obs: não pretendo explicar o que cada comando faz nesse tutorial, estou preparando outro para isso, no final do artigo vou colocar uns posts que me ajudaram a aprender sobre o scrapy caso alguém queira)
Em seu terminal, digite:
~$ scrapy startproject nomes_galera
Será criada uma pasta com o nome de "nomes_galera", agora digite a sequencia de comandos abaixo:
~$ cd nomes_galera
~$ scrapy genspider masc_nome dicionariodenomesproprios.com.br
Vejamos, você criou o projeto dando um start nele e atribuindo o nome "nomes_galera", em seguida você entrou na pasta e criou um robo(spider) que vai coletar os dados a partir do domínio dicionariodenomesproprios.com.br com o nome do robo(spider) de masc_nome.
Certo, espero que até aqui você tenha entendido, caso não, ligue 190 e peça ajuda aos universitários rsrsrs briks, qualquer coisa deixa nos comentários que eu ajudo galera.
Vamos entrar na pasta onde se encontra o spider, antes de entrar, segue a árvore do diretório só para terem uma noção.
#:> tree
.
├── nome_galera
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── items.py
│ ├── pipelines.py
│ ├── settings.py
│ ├── settings.pyc
│ └── spiders
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── masc_nome.py
│ └── masc_nome.pyc
└── scrapy.cfg
Entre na pasta spiders com o comando abaixo:
~$ cd nome_galera/spiders/
Vamos editar o arquivo que acabamos de criar, no caso, o robo com o nome de masc_nome.py
A princípio o arquivo é criado com um layout padrão, dessa maneira:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
import scrapy | |
class MascNomeSpider(scrapy.Spider): | |
name = "masc_nome" | |
allowed_domains = ["dicionariodenomesproprios.com.br"] | |
start_urls = ( | |
'http://www.dicionariodenomesproprios.com.br/', | |
) | |
def parse(self, response): | |
pass |
Note que na linha 9 ele mostra apenas o site certo? Não é isso que queremos, vamos analisar o site e ver onde estão os nomes masculinos.
Se você entrar nesse link: http://www.dicionariodenomesproprios.com.br/nomes-masculinos/
Vai ver que tem apenas nomes masculinos certo? Nosso desafio é pegar todos esses nomes e de todas as paginas. (Desculpem se não estiver sendo bem claro, estou com um pouco de sono)
Pra fazer isso, vamos olhar o código fonte da pagina.
Abaixo do Top10 de nomes, veja que começa a lista de nomes do site, em desordem alfabética(acho que inventei esse termo agora) o primeiro nome que aparece é o Davi, usando o chrome, abra a ferramenta de desenvolvedor e inspecione o objeto com o nome do Davi assim como na imagem abaixo:
Vejam a tag e o atributo do HTML onde tem o nome do davi, viu?
Ok, vou colocar aqui.
Repare, temos a tag "a" com o atributo 'class="lista-nome"', se você der um procurar na pagina, você vai ver que todos os nomes listados tem a tag e o atributo em comum, se pensarmos de maneira lógica, temos uma lista de nomes(Dãhr, o próprio nome da class já diz animal). Piadinhas a parte, muitas vezes, por mais obvia que é a questão, deixamos passar na hora de desenvolver, pensamos de forma automática e não reparamos em coisas obvias que nos ajudam a montar mentalmente o código.
Ok, let's go.
Vamos ao código agora.
Leia o código, não continue a ler esse texto, vamos fazer um teste de observação.
Diga mentalmente qual é a URL que o robô vai dar o start na busca.
.
.
.
.
.
.
.
.
Achou?
Certo, muito bom garoto(a), linha 8 do código ali de cima, certo? Que por sua vez, é o código base do robo, agora vamos mudar isso, afinal, começamos a procurar do link que passei sobre nomes masculinos não é mesmo? Ainda lembra dele? Pega ele ali em cima vai, não vou escrever de novo.
Altere a linha 9 com o link da pagina onde contem os nomes masculinos.
ficando dessa maneira:
Agora vamos a parte que interessa, vamos ao parser do "bagulho", vamos coletar os nomes.
Primeiro, vamos entender um pouco o que vamos fazer, lembra-se da tag onde contem o nome do Davi? Vamos fazer ela de base para pegar todos os nomes, vamos usar xpath para gerar uma query generica.
Vou postar o código aqui já pronto e vou explicar as linhas alteradas no próprio source "serto" galera?
[ATUALIZACAO] Galera, recebi uma dica do Lynneker Sales Santos sobre o fechamento do arquivo, eu estava abrindo e fechando no for, eu troquei isso. Vlw mano
Se você entrar nesse link: http://www.dicionariodenomesproprios.com.br/nomes-masculinos/
Vai ver que tem apenas nomes masculinos certo? Nosso desafio é pegar todos esses nomes e de todas as paginas. (Desculpem se não estiver sendo bem claro, estou com um pouco de sono)
Pra fazer isso, vamos olhar o código fonte da pagina.
Abaixo do Top10 de nomes, veja que começa a lista de nomes do site, em desordem alfabética(acho que inventei esse termo agora) o primeiro nome que aparece é o Davi, usando o chrome, abra a ferramenta de desenvolvedor e inspecione o objeto com o nome do Davi assim como na imagem abaixo:
Vejam a tag e o atributo do HTML onde tem o nome do davi, viu?
Ok, vou colocar aqui.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<a class="lista-nome" href="https://www.blogger.com/davi/">Davi</a><br /> |
Ok, let's go.
Vamos ao código agora.
Leia o código, não continue a ler esse texto, vamos fazer um teste de observação.
Diga mentalmente qual é a URL que o robô vai dar o start na busca.
.
.
.
.
.
.
.
.
Achou?
Certo, muito bom garoto(a), linha 8 do código ali de cima, certo? Que por sua vez, é o código base do robo, agora vamos mudar isso, afinal, começamos a procurar do link que passei sobre nomes masculinos não é mesmo? Ainda lembra dele? Pega ele ali em cima vai, não vou escrever de novo.
Altere a linha 9 com o link da pagina onde contem os nomes masculinos.
ficando dessa maneira:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
import scrapy | |
class MascNomeSpider(scrapy.Spider): | |
name = "masc_nome" | |
allowed_domains = ["dicionariodenomesproprios.com.br"] | |
start_urls = ( | |
'http://www.dicionariodenomesproprios.com.br/nomes-masculinos/', | |
) | |
def parse(self, response): | |
pass |
Agora vamos a parte que interessa, vamos ao parser do "bagulho", vamos coletar os nomes.
Primeiro, vamos entender um pouco o que vamos fazer, lembra-se da tag onde contem o nome do Davi? Vamos fazer ela de base para pegar todos os nomes, vamos usar xpath para gerar uma query generica.
Vou postar o código aqui já pronto e vou explicar as linhas alteradas no próprio source "serto" galera?
[ATUALIZACAO] Galera, recebi uma dica do Lynneker Sales Santos sobre o fechamento do arquivo, eu estava abrindo e fechando no for, eu troquei isso. Vlw mano
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
import scrapy | |
class MascNomeSpider(scrapy.Spider): | |
name = "masc_nome" | |
allowed_domains = ["dicionariodenomesproprios.com.br"] | |
start_urls = ( | |
'http://www.dicionariodenomesproprios.com.br/nomes-masculinos/1/', | |
) | |
def parse(self, response): | |
# Usando o xpath, selecionamos a tag "a" | |
# com o atributo class "lista-nome" e pegamos apenas o texto | |
# você pode ver isso abaixo | |
nomes = response.xpath('//a[@class="lista-nome"]/text()').extract() | |
# Outra coisa, assim como o nome sugestivo, a resposta vem do response. | |
# Ou seja, é como se o html viesse do response e dele fazemos a query | |
# em xpath | |
# Aqui fazemos um simples for pegando o nome da lista que é | |
# criada e salvamos o nome em um arquivo. | |
for nome in nomes: | |
print nome.encode("utf-8") | |
arq = open("nomes_masculinos.txt", 'a') | |
arq.write("%s\n" % nome.encode("utf-8")) | |
arq.close() | |
# Novamente, pegamos a resposta e verificamos com xpath se existe | |
# uma próxima pagina, verifique a tag e o atributo da setinha | |
# de proxima pagina no final da pagina do site. | |
prox_pagina = response.xpath('//a[@class="step-pag"]/@href').extract() | |
URL_proxpag = "http://www.dicionariodenomesproprios.com.br%s" % prox_pagina[len(prox_pagina)-1] | |
print "PAGINA >>>> %s" % URL_proxpag | |
# Aqui falamos, se existir uma proxima pagina, mande para fazer um novo | |
# request nessa proxima pagina, passando a URL e o Callback para o parser | |
if prox_pagina: | |
yield scrapy.Request(url=URL_proxpag, callback=self.parse) |
Agora é só fazer isso para a pagina de nomes de mulheres e pronto, faça isso você mesmo para ver se entendeu, qualquer dúvida, postem aqui nos comentários que ajudo.
Aqui vai uns posts que me ajudaram com scrapy e que me tiram dúvidas até hoje.
http://www.gilenofilho.com.br/usando-o-scrapy-e-o-rethinkdb-para-capturar-e-armazenar-dados-imobiliarios-parte-i/
http://www.gilenofilho.com.br/usando-o-scrapy-e-o-rethinkdb-para-capturar-e-armazenar-dados-imobiliarios-parte-ii/
Post a base de CBJR