pip install openpyxl
Run to view results
import funcoes
import csv
import datetime
import requests
from bs4 import BeautifulSoup
import json
import pandas as pd
import sqlite3
Run to view results
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36"}
Run to view results
Todas as funções estão em funcoes.py - Chamei as funções aqui no notebook - também criei um arquivo separado para cada questão e seu respectivo código
Questão 1:
def registrar_erro(erro, url = None, nome_da_funcao = None):
# Obter o horário atual
data = datetime.datetime.now().isoformat()
# Extrair informações do erro
tipo_de_erro = type(erro).__name__
descricao_do_erro = str(erro)
# Criar dados para a linha do CSV
dados = [data, tipo_de_erro, descricao_do_erro]
# Adicionar URL e nome da função se fornecidos
if url:
dados.append(url)
if nome_da_funcao:
dados.append(nome_da_funcao)
# Adicionar dados ao arquivo de log
with open('log_de_erros.csv', 'a', newline='') as arquivo_csv:
escritor = csv.writer(arquivo_csv)
# Escrever a linha de cabeçalho se o arquivo estiver vazio
if arquivo_csv.tell() == 0:
escritor.writerow(['Data', 'Tipo de Erro', 'Descrição do Erro', 'URL', 'Nome da Função'])
escritor.writerow(dados)
# Criar o arquivo CSV se ele não existir
try:
with open('log_de_erros.csv', 'x', newline='') as arquivo_csv:
escritor = csv.writer(arquivo_csv)
escritor.writerow(['Data', 'Tipo de Erro', 'Descrição do Erro', 'URL', 'Nome da Função'])
except FileExistsError:
pass # O arquivo já existe, então não precisa criar
# Retornar o conteúdo do arquivo CSV
with open('log_de_erros.csv', 'r') as arquivo_csv:
conteudo = arquivo_csv.read()
print(conteudo)
Run to view results
EXEMPLO:
# Teste com um erro de divisão por zero
try:
resultado = 10 / 0 # Isso da um ZeroDivisionError
except Exception as e:
registrar_erro(e, nome_da_funcao='teste_divisao_por_zero')
Run to view results
Questão 2:
levantamento_metadados_crawler = {
"sites": [
{
"site_name": "BBC",
"url": "https://www.bbc.com/portuguese",
"link_selector": "div.promo-text > h3 > a",
"link_attribute": "href",
"link_text": False
},
{
"site_name": "UOL",
"url": "https://noticias.uol.com.br/",
"link_selector": "div > a",
"link_attribute": "href",
"link_text": False
},
{
"site_name": "Terra",
"url": "https://www.terra.com.br/noticias/",
"link_selector": "div.card-news__text > a",
"link_attribute": "href",
"link_text": False
}
]
}
Run to view results
levantamento_metadados_scraper = {
"sites_scraper": [
{
"site_name": "BBC",
"datetime_selector": "ul > li.bbc-v8pmqw > div > time",
"datetime_attribute": "datetime",
"datetime_text": True,
"title_selector": "h1",
"title_attribute": None,
"title_text": True,
"text_selector": "p",
"text_attribute": None,
"text_text": True,
"author_selector": "span.bbc-1ypcc2",
"author_attribute": None,
"author_text": True
},
{
"site_name": "UOL",
"datetime_selector": "div.solar-author-date > div > time",
"datetime_attribute": "datetime",
"datetime_text": True,
"title_selector": "div.content > div > h1",
"title_attribute": None,
"title_text": True,
"text_selector": "p",
"text_attribute": None,
"text_text": True,
"author_selector": "div.solar-author-names.regular-subtext > span > a",
"author_attribute": None,
"author_text": True
},
{
"site_name": "Terra",
"datetime_selector": "div.article__header__info__datetime > div.date",
"datetime_attribute": None,
"datetime_text": True,
"title_selector": "h1",
"title_attribute": None,
"title_text": True,
"text_selector": "p",
"text_attribute": None,
"text_text": True,
"author_selector": "div.article__header__author-wrapper > ul > li > span",
"author_attribute": None,
"author_text": True
}
]
}
Run to view results
Questão 3:
sites_crawler = [
{
"site_name": "BBC",
"url": "https://www.bbc.com/portuguese",
"link_selector": "div.promo-text > h3 > a",
"link_attribute": "href",
"link_text": False
},
{
"site_name": "UOL",
"url": "https://noticias.uol.com.br/",
"link_selector": "div > a",
"link_attribute": "href",
"link_text": False
},
{
"site_name": "Terra",
"url": "https://www.terra.com.br/noticias/",
"link_selector": "div.card-news__text > a",
"link_attribute": "href",
"link_text": False
}
]
cralwerjson = {"sites_crawler": sites_crawler}
with open("metadados_crawler.json", "w", encoding="utf-8") as f:
json.dump(cralwerjson, f, indent=4)
print("JSON criado com sucesso!")
Run to view results
Questão 4:
sites_scraper = [
{
"site_name": "BBC",
"datetime_selector": "ul > li.bbc-v8pmqw > div > time",
"datetime_attribute": "datetime",
"datetime_text": True,
"title_selector": "h1",
"title_attribute": None,
"title_text": True,
"text_selector": "p",
"text_attribute": None,
"text_text": True,
"author_selector": "span.bbc-1ypcc2",
"author_attribute": None,
"author_text": True
},
{
"site_name": "UOL",
"datetime_selector": "div.solar-author-date > div > time",
"datetime_attribute": "datetime",
"datetime_text": True,
"title_selector": "div.content > div > h1",
"title_attribute": None,
"title_text": True,
"text_selector": "p",
"text_attribute": None,
"text_text": True,
"author_selector": "div.solar-author-names.regular-subtext > span > a",
"author_attribute": None,
"author_text": True
},
{
"site_name": "Terra",
"datetime_selector": "div.article__header__info__datetime > div.date",
"datetime_attribute": None,
"datetime_text": True,
"title_selector": "h1",
"title_attribute": None,
"title_text": True,
"text_selector": "p",
"text_attribute": None,
"text_text": True,
"author_selector": "div.article__header__author-wrapper > ul > li > span",
"author_attribute": None,
"author_text": True
}
]
scraperjson = {"sites_scraper": sites_scraper}
with open("metadados_scraper.json", "w", encoding="utf-8") as f:
json.dump(scraperjson, f, indent=4)
print("JSON criado com sucesso!")
Run to view results
Questão 5:
def downlouder(url, headers):
try:
req = requests.get(url, headers=headers)
print(f"Request status code: {req.status_code}")
if req.status_code >= 400:
print(f"Error, status code: {req.status_code}")
return None
return req.text
except Exception as e:
registrar_erro(e, nome_da_funcao='downlouder')
return None
Run to view results
Questão 6:
bbc_urls = funcoes.crawler("BBC") # Chama a função 'crawler' para o site "BBC"
print(bbc_urls) # Imprime a lista de URL
Run to view results
uol_urls = funcoes.crawler("UOL")
print(uol_urls)
Run to view results
terra_urls = funcoes.crawler("Terra")
print(terra_urls)
Run to view results
Questão 7:
bbc_urls = funcoes.crawler("BBC")
bbc_data = funcoes.scraper("BBC", bbc_urls)
noticias = funcoes.print_news(bbc_data, "BBC")
noticias
Run to view results
Questão 8:
db_file = "news_database.db"
funcoes.create_table(db_file)
funcoes.insert_data(db_file, bbc_data)
df = pd.read_sql_query("SELECT * FROM news", sqlite3.connect(db_file))
df
Run to view results
Questão 9:
# função contar_ocorrencias (Questão 9) - O na função está no arquivo 'funcoes.py'
Run to view results
Questão 10:
lista_palavras = input("Digite as palavras-chave separadas por espaços: ").split()
Run to view results
# Chama a função para contar as ocorrências
df2 = funcoes.contar_ocorrencias(db_file, lista_palavras)
# Imprime o DataFrame
df2
Run to view results
df2.to_excel('relatorio.xlsx', index=False)
print('Relatório salvo como relatorio.xlsx')
Run to view results