Skip to content

Instantly share code, notes, and snippets.

@biamuniz
Created June 10, 2023 16:05
Show Gist options
  • Save biamuniz/e12c81af26dec7b509de8a4063a98f88 to your computer and use it in GitHub Desktop.
Save biamuniz/e12c81af26dec7b509de8a4063a98f88 to your computer and use it in GitHub Desktop.
Raspagem da página de busca da Folha de S. Paulo
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from datetime import datetime
import pandas as pd
#Define as condições do Selenium
chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--headless')
driver = webdriver.Chrome( options=chrome_options)
#Recebe variáveis que serão usadas ao final, para salvar o resultado da raspagem
url_busca="https://search.folha.uol.com.br/search?q=negro&periodo=personalizado&sd=01%2F01%2F2013&ed=31%2F01%2F2013&site=todos"
#Começa o acesso à página da Folha e rola até o final
driver.get(str(url_busca))
time.sleep(3)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
#Cria as listas com os dados que precisamos. Essas listas depois serão usadas para preencher um DF
editorias = []
titulos = []
previa_text = []
data = []
links_materias = []
#Loop para a navegação
page_count = 1
while True:
# Em cada iteração, aumenta o contador da página em 1
page_count += 1
#Código da raspagem em si
try:
source = driver.page_source
page = BeautifulSoup(source, 'html.parser')
result_pesq = page.find('div', class_='col col--md-10-15 col--lg-12-18')
#Raspa o conteúdo bruto
editorias_raw = result_pesq.find_all('h3', class_=['c-headline__kicker c-kicker','c-headline__kicker c-kicker c-search__result_h3'])
titulo_raw = result_pesq.find_all('h2', class_='c-headline__title')
previa_text_raw = result_pesq.find_all('p', class_='c-headline__standfirst')
data_raw = result_pesq.find_all('time', class_='c-headline__dateline')
conteudos = result_pesq.find_all('div', class_='c-headline__content')
#Dá uma tratada inicial ao conteúdo
for i in range(len(previa_text_raw)):
previa_text.append(previa_text_raw[i].text.strip())
for i in range(len(editorias_raw)):
editorias.append(editorias_raw[i].text)
for i in range(len(titulo_raw)):
titulos.append(titulo_raw[i].text.strip())
for i in range(len(data_raw)):
data.append(data_raw[i]['datetime'])
for i in conteudos:
url = i.find('a', href=True)
links_materias.append(url['href'])
# Clica em '2' lá nas páginas, depois em '3', e assim suscessivamente
driver.find_element(By.LINK_TEXT, str(page_count)).click()
#Há alguns segundos entre cada execução, para que a página carregue corretamente
time.sleep(3)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
except Exception as e:
# Para o loop quando não há mais páginas para iterar
break
print(e)
#Cria um dicionário com as listas
dados_agregados = {'Datas':data, 'Editoria': editorias, 'Títulos': titulos , 'Texto': previa_text, 'URL': links_materias}
#Preenche o dataframe com os dados do dicionário
dataframe = pd.DataFrame(dados_agregados)
#Para tratar as datas, primeiro separamos as Datas do horário de publicação
dataframe[['Datas', 'Horário']] = dataframe['Datas'].str.split('às | à ', 1, expand=True)
#Reorganiza as colunas do dataframe
dataframe = dataframe[['Datas', 'Horário', 'Editoria', 'Títulos', 'Texto', 'URL']]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment