其实,本质上和爬虫没区别,只不过这是人家主动给你数据,而且是编排好格式后的数据
按个人主页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
--------------上面如果可以就不用进行下面的了-------------
报错提示: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 新关注的展示文章的数量控制