Skip to content

Instantly share code, notes, and snippets.

@deividsoncs
Last active January 21, 2023 12:37
Show Gist options
  • Save deividsoncs/b35cb2a35f186c2c36ecfac376c4b0e5 to your computer and use it in GitHub Desktop.
Save deividsoncs/b35cb2a35f186c2c36ecfac376c4b0e5 to your computer and use it in GitHub Desktop.
web scrap desenvolvido em python utilizando o beautiful soup
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Feb 24 16:52:20 2018
Realiza a captura das notícias do site do G1/ES e insere no banco de dados
MySQL
https://dcalixtoblog.wordpress.com
@author: calixto
"""
#importações
from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq
import MySQLdb as mySQL
from datetime import datetime
#url alvo inicial
my_url = 'http://g1.globo.com/espirito-santo/'
#classe noticia onde irei guardar temporariamente as notícias
class Noticia:
def __init__(self):
self.title = ''
self.abstract = ''
self.content = ''
self.link = ''
self.tags = ''
self.data = datetime.now()
#abrindo conexão, e capturando a página
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
# fazendo parsing da info capturada para HTML
page_soup = soup(page_html, "html.parser")
#capturando a div com todas notícia
containers = page_soup.findAll("div", {"class":"bastian-feed-item"})
#lista de notícias já tratadas
clean_notices = list()
#itero todos containers que adquiri no meu request a página do G1-ES
for container in containers:
#pego título da notícia
title_container = container.findAll("p", {"class":"feed-post-body-title"})
title_notice=''
for tit in title_container:
title_notice = tit.text
title_notice = title_notice.replace("'", "\\'")
#pego o resumo
abstract_container = []
abstract_container = container.findAll("p", {"class":"feed-post-body-resumo"})
abstract_notice = ""
for abstract in abstract_container:
abstract_notice = abstract.text
abstract_notice = abstract_notice.replace("'", "\\'")
print(abstract_notice)
#capturo o link da notícia
link_container = container.findAll("a", {"class":"feed-post-link"})
#retiro o conteúdo de href, sempre tenho somente um link nessa classe <img draggable="false" role="img" class="emoji" alt="😛" src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/svg/1f61b.svg">
link_notice = link_container[0].get('href')
#pego a url da notícia e leio sua página
my_url=link_notice
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
#fazendo o parse agora da página do conteúdo
page_soup = soup(page_html, "html.parser")
#pego o conteúdo da notícia da página recente que acabamos de visitar
contents_containers = page_soup.findAll("p", {"class":"content-text__container"})
#pego a data da notícia que não tinha na primeira página
data_containers = page_soup.find_all("div", {"class":"content-publication-data"})
try:
for data_container in data_containers:
#print(data_container.prettify())
#print(data_container.time.get('datetime'))
#converto a string da data para datetime depois uso o strftime pra torna o datetime em uma string do formato do datetime do meu banco
data_notice = datetime.strptime(data_container.time.get('datetime'), '%Y-%m-%dT%H:%M:%S.%fZ').strftime('\'%Y/%m/%d %I:%M:%S\'')
except (RuntimeError, TypeError):
#qualque 'zica' tomo a data como a atual
data_notice = datetime.now().strftime('\'%Y/%m/%d %I:%M:%S\'')
#se a minha string está vazia
if not data_notice:
data_notice.now().strftime('\'%Y/%m/%d %I:%M:%S\'')
#vou iterar todos contents, (são vários por o G1 Divide a informação em vários
#o editor deles deve trabalhar dividindo partes do conteúdo em classes CSS)
content_notice = ""
for content_container in contents_containers:
#content_notice.join(content_container.text)
content_notice = content_notice + content_container.text
content_notice = content_notice.replace("'", "\\'")
#tag é a classificação da notícia segundo site do G1 (Chapéu o.O :P)
tags_container = container.findAll("span", {"class":"feed-post-header-chapeu"})
tags_notice = ""
for tag in tags_container:
tags_notice = tag.text
tags_notice = tags_notice.replace("'","\\'")
print(title_notice)#,'\n', abstract_notice, '\n', link_notice, '\n ', tags_notice, '\n', content_notice)
#preencho meu objeto notícia
n = Noticia()
n.title = title_notice
n.abstract = abstract_notice
n.content = content_notice
n.link = link_notice
n.tags = tags_notice
#adiciono a lista das noticia tratadas
clean_notices.append(n)
if (True):
con = mySQL.connect(host ='127.0.0.1', user='root', passwd="root1234", db='bd_noticia')
try:
con.select_db("bd_noticia")
#instancia o cursor para execulçao de cmd's
cursor = con.cursor()
#força a conexão encodar utf8, por default o connector ira força para latin-1 (8859-1) (instalação)
#meu banco esta em UTF-8 e a página em latin-1
con.set_character_set('utf8')
cursor.execute('SET NAMES utf8;')
cursor.execute('SET CHARACTER SET utf8;')
cursor.execute('SET character_set_connection=utf8;')
############################################
#testar a conexao com o banco
#ver = cursor.execute("SELECT VERSION()")
#ver = cursor.fetchone()
#print("Versão do MySQL: %s" % ver)
############################################
#itero o clean_notices
for i in range(len(clean_notices)):
#verifico se a notícia foi inserida no banco, o link como PK
sql = (
"SELECT 1 FROM noticia WHERE titulo LIKE \'" + clean_notices[i].title
+"\' AND link LIKE \'" + clean_notices[i].link +"\'"
)
cursor.execute(sql)
num_rows = int(cursor.rowcount)
#print("ROWS: %d" % num_rows)
#se noticia não existe na base insere.
if (num_rows == 0):
sql = (
"INSERT INTO noticia(titulo, conteudo, link, tags, resumo, data) "
"VALUES (%s, %s, %s, %s, %s, %s)"
)
data = (clean_notices[i].title, clean_notices[i].content, clean_notices[i].link, clean_notices[i].tags, clean_notices[i].abstract, clean_notices[i].data)
cursor.execute(sql, data)
#cursor.execute(sql, ("teste", "teste", "teste", "teste", "teste"))
#commita a transação de inserção
con.commit()
except mySQL.Error:
print("Erro ao interagir com banco. Erro")
raise
finally:
if con:
con.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment