-
-
Save biamuniz/e12c81af26dec7b509de8a4063a98f88 to your computer and use it in GitHub Desktop.
Raspagem da página de busca da Folha de S. Paulo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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