zoukankan      html  css  js  c++  java
  • [小项目] rss订阅

    其实,本质上和爬虫没区别,只不过这是人家主动给你数据,而且是编排好格式后的数据

    按个人主页url更新内容
    去重,按照redis去重的方式
    按时间保存内容
    mysql 保存为时间格式(可以根据时间比较大小,需要把post时间转换为datetime类型存储)
    定时更新,可以设置更新时间


    从数据库中取前10条最新更新文章,下一页-再取10条展示
    按兴趣等级标记文章:不感兴趣-不展示,一般-展示,很感兴趣-收藏,
    提供收藏功能,单独展示收藏过的文字

    查看关注的人的信息,提供取消关注功能,被取消的不再更新内容
    提供历史关注信息?


    ---这种方式暂时不使用,因为有滑动验证码比较麻烦,不如直接维护关注的人的id
    ---虽然短时间内频繁登录很麻烦,但隔时间比较久更新还是可以的,比如隔一周后两三天更新一次关注列表

    刷新关注列表时,把新增的up的头像url保存
    是否更新成功用头像+id来判断,到时候首页展示所关注的up的信息
    对于长期来讲就方便多了,不用手动维护一个列表,而只要设置定时任务即可
    1.爬虫-登录
    2.获取关注的人列表

    刷新关注列表时,把新增的up的头像url保存

    对于up的信息展示:头像/昵称,都可以点击到个人文章主页

    文章:

    标题,摘要,链接(唯一标识),post时间,作者引用,

    具体实现讨论:

    因为要存储,直接写sql太麻烦,考虑用模块

    最终是要通过html显示的,所以直接上flask,配合sqlalchemy使用

    flask + flask_sqlalchemy

    更新-up:根据id判断,头像不进行更新

    更新-文章:

    是否是新文章:判断文章url

    是否更新:判断post时间

    数据分为写和读

    定时向数据库保存数据,通过请求来获取数据

    定时任务:一周登录一次更新关注的up,6h更新一次文章

    更新:up以id为主,文章以更新时间为准

    登录-关注-昵称/头像url,由昵称获得rss-id,请求获取xml

    通过唯一的字段来判断是否是新用户;通过每次的登录来维护用户数据

    (暂时不做用户的更新,因为基本都不会变,只做是否存在的判断)

    文章:无论是什么时候关注的up,每个文章都有时间标识,最终的显示也是以时间为标准的,所以只要直接添加即可

    这样附带的问题:是以时间为主,而不是以自己的关注点为主了,也无法体现出学习线路,可能文章很久了,所以会被显示在很后面,但确实是现在正在接触的东西,对自己来说是‘最新’的

    解决:有突出显示两个,一个是关注的up新发布的文章,二是最新关注了那个up,所以如果是新关注的up说明当前的兴趣点在这一方面,所以把这个up的文章时间保存为另一个字段,而原来的文章时间由关注up的时间代替,这样新关注的up的文章就会显示在当前时间点,即使文章比较早了

    收藏的整合,一个是博客主体平台上的,一个在rss上的,但这里是收藏时间而不是文章创建时间,所以和个人的关注点在时间顺序上是统一的

    up的最终列表中,如果是新关注的,那么增加关注时间,即[1,2,[3,2019-12],4]

    在遍历时判断长度,如果为2则将时间取出来代替原来的post_time,原文章发布时间保存为另一个字段

    携带时间的问题:初次获取数据与之后的正常更新的区别,数据库初始化时会使得每个up都会携带时间,但并不需要这样做

    两种处理方式:1.初始化时都不携带时间信息,额外字段设为空;之后更改代码逻辑,携带时间;

    2.post_time保留本来的时间;初始化时都携带时间,设置给额外字段,之后新关注的也是;正常更新的,将额外字段设置为发布时间;之后取数据依照额外字段的时间

    3.取数据直接依照入库时间

    1需要改代码,不能保持代码的完整性;2会使得初始化文章的显示时间错乱;3与2的问题一致,且后续更新的时间不准确

    还是取1,保证post时间的准确性

    初始化数据库-cnblog

    给文章表增加subscribe_time字段,用来通过这个字段显示文章而不是发布时间

    在保存up时,如果是新的则将id保存到redis列表中;保存文章时,先判断up是否在列表中,如果在则pop出来,并将subscribe_time设置为up的create_time,否则不存在,则将subscribe_time设置为post_time

    1.安装mysql,redis

    创建数据库rss_db,进行数据库迁移

    2.chrome

    ①安装的是chromium

    安装chromium,无界面

    apt-get install chromium-browser

    查看位置

    whereis chromium-browser

    查看版本

    chromium-browser --version

    ②chromedriver

    树莓派中不用手动下载压缩包,直接apt安装即可

    安装:

    sudo apt-get install chromium-chromedriver

    查看安装路径

    dpkg -L chromium-chromedriver

    selenium的driver对象配置:

    不用写chromedriver的路径executable_path
    browser = webdriver.Chrome(desired_capabilities=caps,options=chrome_options)

    无法import cv2模块的问题:

    原因:是由于opencv在linux上的bug导致的

    解决:

    在~/.bashrc中添加

    export LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1.2.0

    参考: http://www.yoyojacky.com/

    --------------上面如果可以就不用进行下面的了-------------

    报错提示:ImportError: … cannot open shared object file: No such file or directory

    问题说明及解决:https://blog.piwheels.org/how-to-work-out-the-missing-dependencies-for-a-python-package/

    上面的shared object file都有了后import cv2仍然有问题

    报错提示:undefined symbol: __atomic_fetch_add_8

    论坛讨论及一些可行方案: https://github.com/piwheels/packages/issues/59

    pillow模块安装问题:

    报错提示:”The headers or library files could not be found for jpeg”

    解决:

    sudo apt-get install libjpeg-dev zlib1g-dev
    pip install Pillow

    树莓派的问题太多,改用debian官方amd64的就没什么问题,selenium正常运行,也不需要其他额外的什么东西

    已经在官方系统amd64上跑通了所有东西;树莓派上最致命的是selenium的chrome用不了,又有些东西必须依赖chrome

    树莓派安装官方debian:

    但amd64和armhf是不同的架构,官方倒是也有armhf的版本,但selenium不能正常使用可能就是arm的问题,这就难办了

    还必须得在pc上运行,这样的话得需要一个类似nuc的东西

    不在nuc上跑,可以放到云服务器上,对性能没什么要求的情况,费用也较少

    -----------------------

    1.登录失败的处理(原因:点击登录未出现验证码图片)

    递归调用2次,实际会有3次的登录,测试结果:是起作用的

    2.增加了user,article的显示信息:共处理的数据数量,更新的数量,删除的数量

    3.更新文章后同步其update_time字段;如果是之前关注过但取关了,则同步其create_time/delete字段

    4.用户的id才是唯一标识,用户名不是,取消了用户名的unique

    5.只要关注一次就当作老用户处理,无论之后是否取关/关注

    6.文章的url/post_time不能是联合索引,url相同post_time不同则又会插入数据,但其实为一条数据;取消了联合索引,设置url为unique

    7.取关时删除redis中的user_id

    # TODO 新关注的展示文章的数量控制

  • 相关阅读:
    重装win7之后,wubi安装的ubuntu的启动菜单不见
    data_source.rb:182: TZInfo::DataSourceNotFound解决办法
    Gem::InstallerError:The 'json' native gem requires installed build tools
    去掉DL is deprecated, please use Fiddle警告信息
    ruby on rails安装(ubuntu 14.04)
    ruby on rails 安装(win8 64位)
    满城月季花开
    python中的zip()函数
    python学习之“序列”的理解
    二进制、十进制、八进制、十六进制的理解
  • 原文地址:https://www.cnblogs.com/justaman/p/11925395.html
Copyright © 2011-2022 走看看