Python Brasil
前往频道在 Telegram
Canal para compartilhamento de links, cursos vagas e eventos sobre Python. @laenderoliveira
显示更多📈 Telegram 频道 Python Brasil 的分析概览
频道 Python Brasil (@pythonbrasil) 葡萄牙语 语言赛道中的 是活跃参与者。目前社区聚集了 25 009 名订阅者,在 技术与应用 类别中位列第 5 451,并在 巴西 地区排名第 1 957 位。
📊 受众指标与增长动态
自 невідомо 创建以来,项目保持高速增长,吸引了 25 009 名订阅者。
根据 19 六月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 -169,过去 24 小时变化为 -6,整体触达仍然可观。
- 认证状态: 未认证
- 互动率 (ER): 平均受众互动率为 7.61%。内容发布后 24 小时内通常能获得 N/A% 的反应,占订阅者总量。
- 帖子覆盖: 每篇帖子平均可获得 1 904 次浏览,首日通常累积 0 次浏览。
- 互动与反馈: 受众积极参与,单帖平均反应数为 8。
- 主题关注点: 内容集中在 palestra, 22h, atividade, dado, programação 等核心主题上。
📝 描述与内容策略
作者将该频道定位为表达主观观点的平台:
“Canal para compartilhamento de links, cursos vagas e eventos sobre Python.
@laenderoliveira”
凭借高频更新(最新数据采集于 20 六月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。
25 009
订阅者
-624 小时
-297 天
-16930 天
帖子存档
25 009
RT @PythonJamaica: 🐍🇯🇲 #pyconjamaica2017 🐍🇯🇲
🐍🇯🇲 🐍November 16-18🐍🇯🇲 🐍
🐍🇯🇲 🐍🐍save the date🐍🐍🇯🇲 🐍
25 009
E como os itens são salvos no Firebase?
Resposta: Recentemente o Firebase lançou uma API para acessar a SDK usando Python, então eu escrevi um item pipeline chamado scrapy-firebase (https://github.com/skhaz/scrapy-firebase) que usa essa API para escrever no banco de dados do Firebase, a cada item coletado do Scrapy, o método process_item (https://github.com/skhaz/scrapy-firebase/blob/master/scrapy_firebase.py#L35) do pipeline é incado, nesse método eu salvo no Firebase.
class FirebasePipeline(BaseItemExporter):
def load_spider(self, spider):
self.crawler = spider.crawler
self.settings = spider.settings
def open_spider(self, spider):
self.load_spider(spider)
configuration = {
'credential': credentials.Certificate(filename),
'options': {'databaseURL': self.settings['FIREBASE_DATABASE']}
}
firebase_admin.initialize_app(**configuration)
self.ref = db.reference(self.settings['FIREBASE_REF'])
def process_item(self, item, spider):
item = dict(self._get_serialized_fields(item))
child = self.ref.child('/'.join([item[key] for key in self.keys]))
child.set(item)
return item
Próximos passos
Ao mesmo tempo em que eu notifico o canal (https://t.me/RegisBittencourt) do Telegram, estou usando o Cloud Natural Language API (https://cloud.google.com/natural-language/) para classificar a notícia, e, em seguida, salvo no BigQuery (https://bigquery.cloud.google.com/). Após algum tempo, acredito que será possível usar o BigQuery para determinar quais trechos, quando e o quê costuma dar mais problemas à rodovia, através de data mining!
25 009
const buildUrl = require('build-url');
admin.initializeApp(functions.config().firebase);
exports.notifyChannel = functions.database.ref('/news/{what}/{uid}')
.onCreate(event => {
const config = functions.config().telegram;
const url = buildUrl('https://api.telegram.org', {
path: `bot${config.bot.token}/sendMessage`,
queryParams: {
chat_id: config.channel.chat_id,
}
});
return request({
method: 'POST',
uri: url,
resolveWithFullResponse: true,
body: {
text: event.data.val().content
},
json: true
}).then(response => {
if (response.statusCode === 200) {
return response.body.id;
}
throw response.body;
}
);
});
Essa função é bem simples; basicamente, em qualquer evento de onCreate ela é chamada, eu faço uma chamada POST na API do Telegram com o nome do canal, token do bot e conteúdo, que no caso é o texto da notícia.
25 009
O primeiro passo é extrair as informações do site. Eu optei por utilizar o framework Scrapy (https://scrapy.org/), por alguns motivos que ficarão bem claros abaixo e por ter bastante experiência escrevendo web crawlers com o Scrapy, eu não pretendo escrever um tutorial a respeito neste artigo, isso ficará para uma próxima oportunidade.
Antes de tudo eu preciso definir o que eu quero extrair; isso é feito definindo uma class com N campos (https://doc.scrapy.org/en/latest/topics/items.html#scrapy.item.Field) herdando de scrapy.Item (https://doc.scrapy.org/en/latest/topics/items.html)
class Entry(Item):
uid = Field()
spider = Field()
timestamp = Field()
content = Field()
Como é possível notar a aranha, ou crawler ficou bem simples, mas como pode ser visto abaixo, vou explicar cada parte a seguir.
class RegisSpider(CrawlSpider):
name = 'regis'
allowed_domains = ['autopistaregis.com.br']
start_urls = ['http://www.autopistaregis.com.br/?link=noticias.todas']
rules = (
Rule(LinkExtractor(allow=r'\?link=noticias.?ver*'), callback='parse_news'),
)
def parse_news(self, response):
loader = EntryLoader(item=Entry(), response=response)
loader.add_xpath('content', '//*[@id="noticia"]/p[not(position() > last() -3)]//text()')
return loader.load_item()
A propriedade start_urls indica onde a aranha vai iniciar a varredura de páginas
Após isso, definimos algumas regras. Vou usar um LinkExtractor (https://doc.scrapy.org/en/latest/topics/link-extractors.html), que, como o próprio nome diz é um componente para extrair links seguindo uma regra das páginas encontradas. Nesse caso eu usei uma expressão regular que bate com todas as URLS de notícias do site, e defino um callback que será chamado para cada página chamado parse_news
LinkExtractor(allow=r'\?link=noticias.?ver*'), callback='parse_news')
Então é aqui que a mágica toda acontece: passei algum tempo analisando o código fonte da página e usando o inspetor web para poder gerar um xpath que bata com notícia, excluindo as informações extras na página.
XPath
O XPath (https://www.w3schools.com/xml/xml_xpath.asp) é uma forma de atravessar o html e extrair alguma informação específica. É uma linguagem bem poderosa, neste caso eu usei a expressão [not(position() > last() -3)] para excluir os últimos 3 parágrafos marcados pela tag , que o site sempre coloca como uma forma de rodapé. Infelizmente, nem sempre os sites seguem boas práticas, o que me facilitaria e muito a extração dos dados!
loader.add_xpath('content', '//*[@id="noticia"]/p[not(position() > last() -3)]//text()')
Os outros campos, como ID da noticía e timestamp são “extraídos” usando um middleware chamado scrapy-magicfields (https://github.com/scrapy-plugins/scrapy-magicfields), desta maneira:
MAGIC_FIELDS = {
'uid': "$response:url,r'id=(\d+)'",
'spider': '$spider:name',
'timestamp': "$time",
}
O próximo passo é rodar o web crawler periodicamente. Eu usei o sistema de cloud do scrapinghub, que é a empresa que desenvolve o Scrapy e outras ferramentas de scraping, nele eu posso configurar para rodar de tempos em tempos o crawler. No meu caso eu configurei para rodar a cada 30 minutos,
Mesmo que possível, eu não posso publicar diretamente, apenas as novas notícias, caso contrário toda vez que o crawler rodar eu estaria poluindo o canal com as notícias repetidas. Então eu decidi salvar num banco de dados intermediário para conseguir distinguir o que é novo do que já foi indexado.
Persistência
Eis que entra o Firebase (https://firebase.google.com/), e sua nova funcionalidade chamada de functions (https://firebase.google.com/docs/functions), com o qual, eu posso escrever uma função que reage a determinados eventos no banco de dados, como por exemplo, quando um novo dado é inserido.
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const request = require('request-promise');
25 009
Criando um bot de notícias para o Telegram usando Scrapy e Firebase
http://feedproxy.google.com/~r/NullOnError/~3/tphk9yKZ8bE/
Problema
Eu costumo pegar com frequência a rodovia Régis Bittencourt (http://www.autopistaregis.com.br/) e o que acontece com frequência é o trânsito parar completamente no meio do nada e sem acesso à internet, então eu fico sem a mínima noção do que está acontecendo e em quanto tempo conseguirei chegar ao meu destino.
Pensando nisso, decidi escrever um pequeno bot para o Telegram que publica num canal as notícias da estrada! Como de costume no NULL on error, vou explicar como fiz.
Web scraping
25 009
Olá, pessoal!
A Myreks está aberta para quem quiser conhecer e fazer parte do time.
Estamos com a posição para Operations Engineer aberta, para ajudar a construir nossa cultura devops, colaboração entre as pessoas e evolução contínua do produto.
A descrição da vaga está aqui:
https://www.myreks.com/v3/vagas....
Quem quiser conversar, pode me procurar direto, andre@myreks.com, skype:andre.pastore, telegram:apast, twitter:apast, ou pode escrever nos canais do site.
25 009
RT @FilipeCifali: 8 dias galera!! Garanta já seu ingresso para a #PythonSul 2017 @catarse https://t.co/ltfAoj68F4 via @catarse
25 009
Primeiro lote acabando em 3...2...1. Corre que ainda dá tempo de aproveitar o primeiro lote! #uaipython #pybr13… https://t.co/NKs87fJMe3
25 009
RT @pythonbrasil: Não podia faltar ela...nossa querida pylady Paola Katherine( @pk_pacheco) também será keynote na #pybr13... https://t.co/…
25 009
Não podia faltar ela...nossa querida pylady Paola Katherine( @pk_pacheco) também será keynote na #pybr13... https://t.co/zmoHOzrahH
25 009
Quem ainda não comprou passagem para a #pybr13, neste fim de semana Latam esta com promoção, Ida e volta saindo… https://t.co/wAbwNVoyw7
25 009
RT @taniaandrea_com: In memoriam @jeanferri. Thank you my friend... https://t.co/3m59akpOgB #muitoobrigada #amigos #python #pythonbrasil…
25 009
Ô sô, ainda não se inscreveu neste trem? Tem só mais um tiquim de dias o lote 1. #uaipython #pybr13… https://t.co/7G87npc8Og
25 009
Ô sô, ainda não se inscreveu neste trem? Tem só mais um tiquim de dias para adquirir o lote 1. Se inscreve uai!!!... https://t.co/79OSaqSRbO
25 009
RT @turicas: Fotos do #Caipyra: https://t.co/93CHTFiSRG e https://t.co/7UCKLnWnRq #Python @pythonbrasil
25 009
Django project optimization guide (part 1)
http://dizballanze.com/django-project-optimization-part-1/
25 009
50° Encontro do Grupo de Usuários Python de Pernambuco!!!!! 👏👏👏 #pugpe #python https://t.co/jHSUatr0qr
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
