Skip to content

Instantly share code, notes, and snippets.

@reichaves
Last active April 13, 2018 10:04
Show Gist options
  • Save reichaves/d0b3aee99d0310f73045b20150639985 to your computer and use it in GitHub Desktop.
Save reichaves/d0b3aee99d0310f73045b20150639985 to your computer and use it in GitHub Desktop.
Esboço de raspagem de site com várias tabelas usando threads - (http://www.cnj.jus.br/bnmp/#/pesquisar)
# Agradeço ao amigo Miguel https://github.com/Miguel-Frazao
import requests
import pandas as pd
import threading, queue, json
def p_manager(p_q): # funcao responsavel pelos prints aqui vai atuar o nosso p_q definido em baixo
while True:
msg = p_q.get()
print(msg)
p_q.task_done()
def handle_reqs(work):
total_w = len(work)
while work:
i = work.pop(0) # fazendo assim vamos aliviando a memoria
link = "http://www.cnj.jus.br/bnmp/rest/pesquisar"
payload = {
"criterio":{
"orgaoJulgador":{
"uf":"RJ",
"municipio":"",
"descricao":""
},
"orgaoJTR":{},
"parte":{
"documentos":[
{"identificacao":""}
]
}
},
"paginador":{"paginaAtual":i},
"fonetica":"true",
"ordenacao":{"porNome":False,"porData":False}
}
r = requests.post(link, json=payload)
mandados.append(r.json()['mandados'])
if(threading.active_count() <= 3): # se só houverem 3 threads (esta, a main, e a daemon), acabamos o scrapping
data_q.put(True) # acabou e enviamos o sinal para desbloquear e escrever no ficheiro
p_q = queue.Queue() # responsavel pelos prints, nao queremos sobrecarregar as outras threads com os prints (chamadas de sistema)
t = threading.Thread(target=p_manager, args=(p_q,))
t.daemon = True # daemon, significa que o programa acaba independentemente se esta tem trabalho pendente ou nao
t.start() # inicia-la
data_q = queue.Queue() # responsavel pelo rastreio do do final scrapping
mandados = []
num_threads = 100 # vamos usar 100 threads
works = [list(range(1, 5299))[i::num_threads] for i in range(num_threads)] # preparar o trabalho para cada thread
for w in works: # dividir o trabalho pelas threads
threading.Thread(target=handle_reqs, args=(w,)).start() # iniciar cada uma
data_q.get() # bloquear até receber o sinal e continuar o prog
df = pd.DataFrame(mandados)
df.info()
df.to_csv('mandados_12_abr_2018_RJ.csv', index=False)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment