PYTHON - Buscando informação numa página web, coletando dado específico e salvando em planilha Excel python

76 views
Skip to first unread message

Diego Dias

unread,
Jun 5, 2023, 8:16:50 AM6/5/23
to Python Brasil
Prezados, boa tarde 

Estou montando um robô que tem a seguinte finalidade: 

A partir de uma relação de CNPJ presente numa planilha Excel, o robô pegará CNPJ por CNPJ, fará o input do dado num campo de um formulário web, clicará no botão pesquisar e quando o site redirecionar para a página de pesquisa, ele irá copiar um dado específico  presente na página, e irá colar esse mesmo dado numa planilha Excel. 
Fará esse loop para cada linha presente na planilha. 

Meio que aos trancos e barrancos consegui montar uma boa estrutura:

from playwright.sync_api import sync_playwright
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By

import requests
import pandas as pd
import time
import openpyxl

nome_do_arquivo = 'Construtora.xlsx'
url_do_forms = "https://cnpj.biz"
df = pd.read_excel(nome_do_arquivo)
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}

for index, row in df.iterrows():
print("Index: " + str(index) + str(row["Nome"]))
chrome = webdriver.Chrome(executable_path='chromedriver.exe')
chrome.get(url_do_forms)

elemento_texto_nome = chrome.find_element(By.XPATH,'/html/body/div/main/div/div[1]/div/form/div[1]/div/input')
elemento_texto_nome.send_keys(str(row["Nome"]))

elemento_texto_nome = chrome.find_element(By.XPATH, '/html/body/div/main/div/div[1]/div/form/div[2]/div/button').click()
elemento_texto_nome = chrome.find_element(By.XPATH, '/html/body/div/main/div[3]/ul/li/a/div/div[1]/p').click()


requisicao = requests.get(url_do_forms, headers=headers)
print(requisicao)

site = BeautifulSoup(requisicao.text, "html.parser")

titulo = site.find("title")
print(titulo)

pesquisa = site.find_all("b", class_="copy")
print(pesquisa)

pesquisa2 = site.find_all("p")
print(pesquisa2)

chrome.quit


Basicamente minha proposta inicial eu consegui atender, fiquei muito feliz por isso, principalmente por não ser um perito no assunto.
Meu código está realizado exatamente minha proposta, porém, com um único problema:
Problema: Pelo fato de a URL receber toda vez um número de CNPJ diferente faz com que meu código fique sempre engessado na URL:  url_do_forms = "https://cnpj.biz"

Considerando esse mesmo problema, toda vez que faço a raspagem dos dados, e pelo fato da URL ser sempre a mesma, toda vez os dados coletados são exatamente os mesmos, o que não faz sentido algum, uma vez que cada CNPJ possui informações distintas. 

Como eu já consegui fazer: 1 - com que meu robô leia os dados da planilha por meio do for, 2 - passe estes mesmos dados por meio do formulário web, 3 - ele esta fazendo a raspagem de acordo com a regra que eu criei (ainda que de forma errada)  a única ponta que falta eu fechar é a questão da URL, pois preciso que ele entenda que a URL muda  toda vez que um novo CNPJ é lido, aí vou conseguir fazer com que a raspagem seja feita de forma correta.

Observação: Eu cheguei a utilizar esse código inicialmente, onde utilizava a biblioteca playwright, porém estava caindo no problema de conseguir passar um parâmetro de CNPJ para consulta, nao estava conseguindo fazer o link das consultas dos dados presentes na planilha. 
 
from playwright.sync_api import sync_playwright
import time

with sync_playwright() as p:
navegador = p.chromium.launch(headless=False)
pagina = navegador.new_page()
pagina.goto("https://cnpj.biz/")
pagina.fill('xpath=/html/body/div/main/div/div[1]/div/form/div[1]/div/input',"82244971000141")
pagina.locator('xpath=/html/body/div/main/div/div[1]/div/form/div[2]/div/button').click()
pagina.locator('xpath=/html/body/div/main/div[3]/ul/li/a/div/div[1]/p').click()

time.sleep(5)

Agradeço imensamente se alguem puder me ajudar, nao sei se estou complicando muito, é que parece ser algo tão fácil, e mesmo assim estou indo pelo caminho mais dificil. Obrigado a todos !!!!

Marcelo Valle

unread,
Jun 5, 2023, 8:35:53 AM6/5/23
to python...@googlegroups.com
Pra procurar ` 12.345.678/0001-00 `, por exemplo, use a URL `https://cnpj.biz/procura/12.345.678%2F0001-00`
Voce precisa fazer url escape do cnpj para adicionar na URL

--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/113d79b3-d680-45e5-9a34-c35c28712a59n%40googlegroups.com.

Robson Antonio Lima de Mendonça

unread,
Jun 5, 2023, 9:01:58 AM6/5/23
to python...@googlegroups.com
Parabéns, muito bom!

Como você esta passando o CNPJ??? este fixo ??

Ele deveria ser variável (lista) algo assim e ter um loop para ficar trocando os CNPJ para consulta um por vez!


Atenciosamente,
Robson Mendonça 
Analista Programador Web 
Celular: +55 11 9.7392-9903 
rob...@gmail.com 
about.me/robsonamendonca


--

Diego Dias

unread,
Jun 5, 2023, 11:15:38 AM6/5/23
to python...@googlegroups.com
Boa-tarde Robson tudo bem ?
Obrigado !!! 

O CNPJ passo de forma automática conforme a leitura que o robô faz na planilha , ele corre lina a linha e aloca o valor na variável Nome

elemento_texto_nome = chrome.find_element(By.XPATH,'/html/body/div/main/div/div[1]/div/form/div[1]/div/input')
elemento_texto_nome.send_keys(str(row["Nome"]))

Até aí eu consigo evoluir,  o meu problema tá no scraping, pois não sei como vincular na URL os valores que o robô percorre 
Consequentemente os dados que ele coleta são sempre os mesmos , independente do CNPJ



Robson Antonio Lima de Mendonça

unread,
Jun 6, 2023, 10:39:17 PM6/6/23
to python...@googlegroups.com
Percebeu que as busca e do tipo GET com Querry String?!

Busca de empresas com o termo 82244971000141 (cnpj.biz)

cnpj.biz/procura/82244971000141

na "url_do_forms "você pode concatenar direto na url_do_forms sem precisar simular o clique

Atenciosamente,
Robson Mendonça 
Analista Programador Web 
Celular: +55 11 9.7392-9903 
rob...@gmail.com 
about.me/robsonamendonca

Robson Antonio Lima de Mendonça

unread,
Jun 8, 2023, 10:59:14 PM6/8/23
to python...@googlegroups.com
SEGUE SUGESTAO :

## """Get cnpj information via scraping from the cnpj.info website."""
## response = get('https://www.receitaws.com.br/v1/cnpj/' + cnpj)
    
from cnpjinfo import cnpjinfo
from openpyxl import load_workbook

def buscaCNPJ(nroCNPJ):
    info = cnpjinfo(nroCNPJ)
    try:
        nome = info.get('nome')
        tel = info.get('telefone')
        print (f'Nome: {nome}, Tel: {tel}')
    except :
        print('Aconteceu um erro')



def iterating_column(path, sheet_name, col):
    workbook = load_workbook(filename=path)
    if sheet_name not in workbook.sheetnames:
        print(f"'{sheet_name}' not found. Quitting.")
        return
    sheet = workbook[sheet_name]
    for cell in sheet[col]:
        buscaCNPJ(str(cell.value))
        print(f"{cell.column_letter}{cell.row} = {cell.value}")
        
        
if __name__ == "__main__":
    nome_do_arquivo = 'Construtora.xlsx'
    iterating_column(nome_do_arquivo, sheet_name="Plan1",
                    col="A")



Atenciosamente,
Robson Mendonça 
Analista Programador Web 
Celular: +55 11 9.7392-9903 
rob...@gmail.com 
about.me/robsonamendonca

Em seg., 5 de jun. de 2023 às 09:16, Diego Dias <diego.senecas...@gmail.com> escreveu:
--
Reply all
Reply to author
Forward
0 new messages