100 mil ONGS na Amazônia

Ontem vi algo bizarro, estava assistindo o Poucas com a Luisa Mell e resolvi ligar o chat para ver os comentários que rolaram durante a live. Tinha um perfil que ficava ativamente mandando “100 mil ongs na Amazônia”, depois de um tempo começou a ficar irritante ver a repetição (block e report) mas fiquei intrigado com aquilo. Era a primeira vez que via um bolsominion ou bot sendo tão ativo em tão pouco tempo. E a missão dele funcionava, uma galera já começava a trocar farpas falando que quem acreditava naquilo tinha falta de inteligência.

É, realmente é falta de inteligência. Ano passado me pediram uma lista de contatos do máximo de ONGs possíveis do Brasil. O desafio foi aceito e corri para fazer o crawler dos contatos encontrados no site http://ongsbrasil.com.br. O resultado foi ~23 mil ONGs. A não ser que o Temer tenha feito o maior incentivo da história das ONGs é impossível existir 100 mil delas só na Amazônia.

Mas o que me assusta é um FDP ficar passando fake news tentando FODER o trabalho de alguém que não pensa só nele mesmo. Existir um bot/bolsominion fazendo isso é totalmente falta de caráter. Você ser do contra beleza, mas atrapalhar com mentira é muito medíocre.

Sua mãe te ensinou a não acreditar em tudo que dizem na internet. Se ela ficou senil e compartilha fake news, converse.

package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
	"strconv"
	"strings"

	"github.com/gocarina/gocsv"

	"github.com/andrewstuart/goq"
	"golang.org/x/net/html/charset"
)

const base = "http://ongsbrasil.com.br"
const first = "http://ongsbrasil.com.br/default.asp?Pag=37&ONG=&Estado=&Cidade=&Tipo=&Atividade=&PageNo=1"
const changing = "default.asp?Pag=37&ONG=&Estado=&Cidade=&Tipo=&Atividade=&PageNo="

type ongList struct {
	LastPage string `goquery:".pagination > li:last-child > a,[href]"`
	lastPage int
	Each     []string `goquery:"td > .text-capitalize p:nth-last-child(2) > a,[href]"`
}

type ongContact struct {
	Nome         string `csv:"Nome" goquery:".text-capitalize"`
	Endereço     string `csv:"Endereço" goquery:".table > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2) > span:nth-child(1)"`
	Bairro       string `csv:"Bairro" goquery:".table > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2) > span:nth-child(1)"`
	CEP          string `csv:"CEP" goquery:".table > tbody:nth-child(1) > tr:nth-child(3) > td:nth-child(2) > span:nth-child(1)"`
	Cidade       string `csv:"Cidade" goquery:".table > tbody:nth-child(1) > tr:nth-child(4) > td:nth-child(2) > span:nth-child(1)"`
	Estado       string `csv:"Estado" goquery:".table > tbody:nth-child(1) > tr:nth-child(5) > td:nth-child(2) > span:nth-child(1)"`
	País         string `csv:"País" goquery:".table > tbody:nth-child(1) > tr:nth-child(6) > td:nth-child(2) > span:nth-child(1)"`
	Telefone     string `csv:"Telefone" goquery:".table > tbody:nth-child(1) > tr:nth-child(7) > td:nth-child(2) > span:nth-child(1)"`
	NomeFantasia string `csv:"Nome Fantasia" goquery:".table > tbody:nth-child(1) > tr:nth-child(8) > td:nth-child(2) > span:nth-child(1)"`
	Email        string `csv:"E-mail" goquery:".table > tbody:nth-child(1) > tr:nth-child(9) > td:nth-child(2) > span:nth-child(1)"`
	Site         string `csv:"Site" goquery:".table > tbody:nth-child(1) > tr:nth-child(10) > td:nth-child(2) > span:nth-child(1)"`
	CNPJ         string `csv:"CNPJ" goquery:".table > tbody:nth-child(1) > tr:nth-child(11) > td:nth-child(2) > span:nth-child(1)"`
}

func craw(url string, v interface{}) error {
	res, err := http.Get(url)
	if err != nil {
		return err
	}
	defer res.Body.Close()
	charsetReader, err := charset.NewReader(res.Body, "text/html")
	if err != nil {
		return err
	}

	err = goq.NewDecoder(charsetReader).Decode(v)
	if err != nil {
		return err
	}
	return nil
}

func crawList(url string) (ongList, error) {
	var list ongList

	err := craw(url, &list)
	if err != nil {
		return list, err
	}

	pageSplit := strings.Split(list.LastPage, "=")
	list.lastPage, err = strconv.Atoi(pageSplit[len(pageSplit)-1])
	if err != nil {
		return list, err
	}

	return list, nil
}

func main() {

	workURL := first

	list, err := crawList(workURL)
	if err != nil {
		log.Fatal(err)
	}
	ultima := list.lastPage

	contacts := []*ongContact{}

	for page := 1; page <= ultima; page++ {

		workURL = fmt.Sprintf("%s/%s%d", base, changing, page)

		list, err := crawList(workURL)
		if err != nil {
			log.Fatal(err)
		}

		for _, v := range list.Each {
			ongURL := fmt.Sprintf("%s/%s", base, strings.Replace(v, " ", "+", -1))
			var contact ongContact
			if err := craw(ongURL, &contact); err != nil {
				log.Fatal(err)
			}
			// fmt.Println(ongURL, contact)
			contacts = append(contacts, &contact)
		}

	}

	csv, err := os.Create("ongs.csv")
	if err != nil {
		log.Fatal(err)
	}
	defer csv.Close()

	if err := gocsv.MarshalFile(&contacts, csv); err != nil {
		log.Fatal(err)
	}

	// var c ongContact

	// err := craw("http://ongsbrasil.com.br/default.asp?Pag=2&Destino=InstituicoesTemplate&CodigoInstituicao=7559&Instituicao=%20ASSOCIACAO%20DE%20PAIS%20E%20AMIGOSDOS%20EXCEPCIONAIS%20DE%20MOGI%20DAS%20CRUZES", &c)
	// if err != nil {
	// 	log.Fatal(err)
	// }
	// fmt.Println(c)
}

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s