利用python3自动在36kr里查找自己感兴趣的内容

2023-11-17

最近常常在36kr网站的快讯及资讯/最新里查看自己感兴趣内容的及时信息,由于快讯及资讯/最新里信息更新得比较及时快速,自己也很难一直盯着看,故想着要是写个脚本让其自动在后天挂着每隔5分钟查询一次,有的话就写入txt档中并在控制台打印出来,这样自己有空时就看一眼,感觉就会要方便一下,就是玩玩. 脚本如下,供参考:

 

#!/user/bin/env python3
#-*- coding:utf-8 -*-

import requests
from lxml import etree
from time import sleep
import time
import os
from retrying import retry
   
'''
python           3.6.5
lxml             4.3.3
requests         2.21.0
windows10
'''

class Check36kr:
    def __init__(self):
        # 存储快讯相关的info
        self.shortnews_hrefList       = list()
        self.shortnews_titleList      = list()
        self.shortnews_focusInfoDict  = dict()
        # 存储资讯/最新相关的info
        self.info_hrefList            = list()
        self.info_titleList           = list()
        self.info_focusInfoDict       = dict()
        # 保存自脚本启动后的获取的信息
        self.oldinfoList              = list()
        # 自己感兴趣内容的关键字, 可自定义
        self.keywords       = ('微信', '微博', 'QQ', '腾讯', '阿里', '百度', '多闪', '视频', '优酷', '爱奇艺', 'AI', '识别')
        
        # 上网相关的info
        self.shortnews_url = 'https://36kr.com/newsflashes' # 快讯
        self.info_url = 'https://36kr.com/information/web_news'    # 资讯/最新
        self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3833.0 Safari/537.36'}
        
        # 新建新资讯收集txt
        if os.path.exists("C:\\Users\\" + os.getlogin() + "\\Desktop\\新资讯收集.txt") == False:
            with open("C:\\Users\\" + os.getlogin() + "\\Desktop\\新资讯收集.txt", 'a') as f:
                f.write('Title' + ' '*65 + 'Link' + ' '*36 + 'Time\n')
    
    # 获取快讯的信息, 以字典的形式返回{title, href}
    def getShortNewsPageContent(self):
        self.shortnews_hrefList.clear() 
        self.shortnews_titleList.clear()
        self.shortnews_focusInfoDict.clear()

        r    = requests.get(self.shortnews_url, headers = self.headers)
        html = etree.HTML(r.text)
        self.shortnews_titleList   = html.xpath('//div[1]/div[2]/div/div[1]/div/div[2]/div/a/text()')
        self.shortnews_hrefList    = html.xpath('//div[1]/div[2]/div/div[1]/div/div[2]/div/a/@href')
        return dict(map(lambda x,y:[x,y], self.shortnews_titleList,self.shortnews_hrefList))
      
    # 获取资讯/最新的信息, 以字典的形式返回{title, href}
    def getInfoPageContent(self):
        self.info_hrefList.clear()
        self.info_titleList.clear()
        self.info_focusInfoDict.clear()
        
        r    = requests.get(self.info_url, headers = self.headers)
        html = etree.HTML(r.text)          
        self.info_titleList = html.xpath('//div/div[1]/div/div[2]/div/div[2]/div[2]/p/a/text()')
        self.info_hrefList  = html.xpath('//div/div[1]/div/div[2]/div/div[2]/div[2]/p/a/@href')
        # 对标题处理一下
        for i in range(len(self.info_titleList)):
            if self.info_titleList[i].find('|') != -1:
                self.info_titleList[i] = self.info_titleList[i].split('|')[1].strip()
        return dict(map(lambda x,y:[x,y], self.info_titleList,self.info_hrefList))
    
    def isExistsOfKeyword(self, keywords):
        # 1. 针对快讯的处理
        for title, href in self.getInfoPageContent().items():
            for keyword in keywords:
                if keyword in title:
                    if title not in self.oldinfoList:
                        self.oldinfoList.append(title)
                        self.info_focusInfoDict.update({title: 'https://36kr.com' + href})
                        
        # 1. 针对资讯/最新的处理
        for title, href in self.getShortNewsPageContent().items():
            for keyword in keywords:
                if keyword in title:
                    if title not in self.oldinfoList:
                        self.oldinfoList.append(title)
                        self.shortnews_focusInfoDict.update({title: 'https://36kr.com' + href})
        if len(self.shortnews_focusInfoDict) == 0 and len(self.info_focusInfoDict) == 0:
            return False
        else:
            return True
            
    @retry
    def printInfo(self, isFirst = False): 
        # 读取资讯txt中已保存的title, 主要为了保存当重新run脚本时,如获取的信息在txt已存在,则不再保存
        fileList = list()
        if isFirst:
            path = "C:\\Users\\" + os.getlogin() + "\\Desktop\\新资讯收集.txt"
            with open(path, 'r') as f:
                fileList = f.readlines()
            fileList = fileList[1:]
            for i in range(len(fileList)):
                fileList[i] = fileList[i].split('http')[0].strip() 
            
        if self.isExistsOfKeyword(self.keywords):
            if len(self.shortnews_focusInfoDict) > 0:
                for title, href in self.shortnews_focusInfoDict.items():
                    if isFirst:
                        if title not in fileList:
                            self.savedata(title, href)
                            print(title, time.strftime('  %Y-%m-%d %H:%M:%S', time.localtime(time.time())))
                        else:
                            print('已存在', title)
                    else:
                        self.savedata(title, href)
                        print(title, time.strftime('  %Y-%m-%d %H:%M:%S', time.localtime(time.time())))
            if len(self.info_focusInfoDict) > 0:
                for title, href in self.info_focusInfoDict.items():
                    if isFirst:
                        if title not in fileList:
                            self.savedata(title, href)
                            print(title, time.strftime('  %Y-%m-%d %H:%M:%S', time.localtime(time.time())))
                        else:
                            print('已存在', title)
                    else:
                        self.savedata(title, href)
                        print(title, time.strftime('  %Y-%m-%d %H:%M:%S', time.localtime(time.time())))
                    
    def savedata(self, title, href):
        # title/href都变成长度为60个字符宽度,不足以*填充
        # 目的是在txt中对齐,方便查看(打开txt记得用notepad打开)
        def is_Chinese(word):
            chinese_count = 0
            length = len(word)
            for ch in word:
                if '\u4e00' <= ch <= '\u9fff':
                    chinese_count += 1
            if chinese_count == len(word):
                return True
            else:
                return False
            
        title_e_length = 0
        href_e_length  = 0
        title_length   = 0
        href_length    = 0
        
        specific_char = ('(', ')', '、', ':', ',', '!', '《', '》', '?')
        for single in title:
            if is_Chinese(single) == False and single not in specific_char:
                title_e_length += 1
        for single in href:
            if is_Chinese(single) == False and single not in specific_char:
                href_e_length += 1
        title_length = title_e_length*1 + (len(title) - title_e_length)*2
        href_length  = href_e_length*1 + (len(href) - href_e_length)*2
        
        if title_length < 70:
            title = title + ' '*(70-title_length)
            
        if href_length < 40:
            href = href + ' '*(40-href_length)
        
        # 保存info
        with open("C:\\Users\\" + os.getlogin() + "\\Desktop\\新资讯收集.txt", 'a') as f:
            release_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
            f.write(title)
            f.write(href)
            f.write(release_time + '\n')
            
    def run(self):
        sum = 0
        while True:
            if sum == 0:
                self.printInfo(True)
            else:
                self.printInfo(False)
            sum += 1
            sleep(300)
                
if __name__ == '__main__':
    check36kr = Check36kr()
    check36kr.run()  

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用python3自动在36kr里查找自己感兴趣的内容 的相关文章

随机推荐

  • Spring的工作原理(二)IOC-DI

    目录 Spring的工作原理 二 IOC DI 一 什么是IOC 什么是DI 1 1 IOC Inversion of Control 控制反转 1 2 DI Dependency Injection 依赖注入 二 IOC控制反转基础知识
  • 【Python】ChineseCalendar包简介

    ChineseCalendar 是一个 Python 包 用于获取中国传统日历信息 这个包提供了中国农历 二十四节气 传统节日 黄历等信息 你可以使用以下命令来安装这个包 pip install ChineseCalendar 安装完成后
  • iOS开发 将html加载到页面上

    记得要引入头文件 import WebKit WebKit h weakself myWebView WKWebView alloc initWithFrame CGRectMake 0 206 weakself view com widt
  • stm32入门自学笔记

    一 二极管 二极管是一种由半导体材料制成的一种具有单向导电性能的电子元器件 二极管就是由一个由 P 型半导体和 N 型半导体形成的 PN 结加上相应的电极引线及管壳封装而成的 NPN和PNP型三极管的作用 1 NPN三极管 基极加高电压 集
  • PRBS笔记

    1 概述 PRBS 伪随机二进制序列 也称为伪随机码 通常被用来测试高速信号的信号质量 伪随机 也说明了该码流并不是真正的随机 而是具有特性属性 码流由 多项式 决定 具有重复周期 PRBS具有多种阶数 如PRBS7 PRBS15 PRBS
  • reify:rxjs: timing reifyNode:node_modules/@vue/cli/node_modules——————npm run dev报错-npm初始化错误

    金钱不够 全靠技术 创建vue3的问题总结 reify rxjs timing reifyNode node modules vue cli node modules卡死不动 npm run dev报错 全局安装webpack 总结 rei
  • ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your

    以下是解决问题的过程 没整理 root localhost flush privileges bash flush 未找到命令 root localhost mysql uroot p Enter password Welcome to t
  • Java 获取季度开始时间结束时间,获取日期所在月份,获取所在季度

    根据季度数获取季度的开始时间结束时间 public static Map
  • STM32【复习串口】

    串口复习加深理解笔记 杂谈 USART FLAG TXE发送缓冲区空标志 说明可以往数据寄存器写入数据了 但并不代码数据发送完成了 USART FLAG TC发送完成标志 这个才是代表USART在缓冲区的数据发送完成了 即从机接收到了数据
  • 目标检测 获得的boundingbox 绘制并且保存

    可能我是读了一个假的研究生 这么简单的弄了3个小时 本来打算用现成的 可是一直保存不了 后面没办法自己写了一个 其中 VOC BBOX LABEL NAMES是list数组 保存对应的标签名 如果类别多的话可以用循环来写 我写在第二个代码上
  • SQL数据库创建失败,提示无法创建列出的某些文件名

    在学习SQL的时候出现了很多低级错误 如下 use master CREATE DATABASE SQL2012Db ON PRIMARY NAME Sql2012Data FILENAME E Program Files Microsof
  • Android总结之链式调用(方法链)

    前言 最近在学习总结Android属性动画的时候 发现Android的属性动画设计采用了链式调用的方式 然后又回顾了一下了以前接触的开源框架Glide也是采用链式调用的方式 还有最近火的一塌糊涂的RxJava也是采用链式调用 为何如此之多的
  • STM32---stm32f103c8t6与stm32f103zet6之间的代码移植转换

    目录 一 将c8t6转换为zet6 1 修改启动文件 2 修改芯片 3 将MD修改为HD 4 下载器的修改 5 修改完成 编译成功 二 将zet6转换为c8t6 一 将c8t6转换为zet6 1 修改启动文件 最终结果如下 2 修改芯片 将
  • RedHat8(RHEL8)超详细安装教程--图文解说版

    目录 一 RHEL8介绍 二 产品地址 三 安装 1 文件 gt 新建虚拟机 快捷键 Ctrl N 2 这里我们选择 自定义 即可 gt 下一步 3 兼容性 保持默认 gt 下一步 4 稍后安装 gt 下一步 5 选择 Linux 操作系统
  • OBJ转GLTF

    obj转gltf的方法较多 这里采用cesium 1 下载cesuim开发包 2 进入cesium根目录 npm下载obj2gltf 没有npm的 自行安装 npm install obj2gltf save 3 将 obj mlt等文件复
  • 数据挖掘学习

    文章目录 绪论 定义 挖掘过程 数据准备 数据探索EDA 数据仓库 空间数据库 时间数据库和时序数据库 流数据 异构数据和遗产数据 数据挖掘的模式 数据准备 数据组成 什么是数据对象 什么是数据属性 数据搜集 数据质量分析 数据类型 考点
  • 国产操作系统产业

    操作系统是计算机的灵魂 目前国外操作系统品牌几乎垄断了巨大的中国市场 其中在桌面端 移动端的市占率分别超过94 75 98 86 根据Gartner的统计数据 2018年中国的操作系统市场容量在189亿以上 其中国外操作系统品牌几乎在中国市
  • Gossip协议

    Gossip协议 一 Gossip协议 1 1 工作原理 1 2 Gossip优点 1 3 Gossip传播方式 1 3 1 Anti Entropy 反熵 1 3 2 Rumor Mongering 谣言传播 1 3 3 结合 1 4 G
  • 初识C语言(二)

    目录 五 字符串 六 转义字符 七 注释 7 1注释的类型 7 1 1单行注释 7 1 2多行注释 7 2注释的使用方法 7 2 1解释代码功能注释 7 2 2提供代码示例注释 7 2 3禁用或屏蔽代码 八 选择语句 8 1if语句 8 1
  • 利用python3自动在36kr里查找自己感兴趣的内容

    最近常常在36kr网站的快讯及资讯 最新里查看自己感兴趣内容的及时信息 由于快讯及资讯 最新里信息更新得比较及时快速 自己也很难一直盯着看 故想着要是写个脚本让其自动在后天挂着每隔5分钟查询一次 有的话就写入txt档中并在控制台打印出来 这