Парсинг бразильского новостного сайта
Table Of Content
Это мой первый пост на этом сайте, поэтому я решил сделать его простым. Я быстро объясню код, который я использовал для парсинга известного сайта в Бразилии. Речь идет о 'estadão.com.br'.
Моя цель при парсинге этого сайта была получить данные для обучения модели Bert. Для этого мне понадобились заголовки новостей и день их публикации, а также тема и имя автора.
Я покажу код по частям, потому что так проще объяснить.
from bs4 import BeautifulSoup
import requests
import pandas as pd
Как вы можете видеть, я импортировал ничего особенного. Я использовал хороший и старый "BeautifulSoup" и "requests". Это два пакета, которые мне понадобились для парсинга сайта. Я также импортировал pandas для создания и сохранения созданного в процессе парсинга набора данных.
objetivo = 7910
NOTICIAS = []
pagina = 1
Да, мои переменные на португальском.
Итак, перейдем к вашему, вероятно, первому уроку португальского языка. "objetivo" означает "цель". Эта переменная определяет количество страниц, которые мы хотим спарсить. В данном случае мне нужно спарсить 7910 страниц, чтобы получить все заголовки о финансах в журнале.
"NOTICIAS" означает "новости". Это список, который будет содержать всю информацию о новостях. И "pagina" означает "страница". Эта переменная указывает на страницу, которую парсит код.
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
'origin' : '[https://www.estadao.com.br'](https://www.estadao.com.br'),
'referer' : '[https://api.estadao.com.br/login'](https://api.estadao.com.br/login')}
s = requests.session()
payload = {
'set_cookies' : '1',
'email' : '[y](mailto:paulosknupp@yahoo.com)ourmail',
'password': 'yourpassword'
}
response = s.post("[https://www.estadao.com.br](https://www.estadao.com.br)", headers=headers, data = payload)
cookies = response.cookies
Вышеуказанный код позволяет вам войти на сайт. Я получил его из следующего видео:
Теперь мы можем начать парсить страницы, содержащие заголовки.
while pagina < objetivo:
url = '[https://economia.estadao.com.br/ultimas,'](https://economia.estadao.com.br/ultimas,') + str(pagina)
fonte = requests.get(url, headers = headers)
soup = BeautifulSoup((fonte).text, 'lxml')
caixas_noticias = soup.find_all("section", {"class": "col-md-12 col-sm-12 col-xs-12 init item-lista"})
for caixa in caixas_noticias: NOTICIA ={} try:
titulo = caixa.find("h3", {"class": "third"}).getText()
except:
titulo = "NA"
NOTICIA["TITULO"] = titulo try:
data = caixa.find("span", {"data-posts"}).getText().split("|")
dia = data[0]
hora = data[1]
except:
data = "NA"
dia = "NA"
hora = "NA"
NOTICIA["DIA"] = dia
NOTICIA["hora"] = hora NOTICIAS.append(NOTICIA) pagina = pagina + 1
В этой части кода я хочу продолжать парсить, пока номер страницы меньше моей цели. Таким образом, в данном случае цикл будет продолжаться, пока страница не станет равной 7909. Номер страницы обновляется в конце каждой итерации цикла.
Важно отметить, что страница, которую нужно спарсить, зависит от обновлений страниц. Если не указано, цикл будет продолжать парсить одну и ту же страницу.
Для каждой итерации мы определяем URL в соответствии с номером страницы и переопределяем словарь "noticia", который будет содержать информацию о каждом заголовке. В конце итерации информация из этого словаря отправляется в список "NOTICIAS".
dataset = pd.DataFrame(NOTICIAS)
dataset.to_csv("VALOR_ECONOMICO_HEADLINES.csv", sep=";", index= False, encoding = 'utf-8-sig')
В конце все, что мне нужно сделать, это преобразовать список "NOTICIAS" в таблицу данных и сохранить ее. В данном случае я сохранил ее в формате CSV, но вы можете выбрать любой другой формат. Надеюсь, это вам поможет!