项目介绍

项目地址:https://github.com/Rock-Candy-Tea/hexo-circle-of-friends

部署教程:文档 | 备用地址

本篇博客主要是友链朋友圈的前/后端开发记录,以及后续更新规划,如果您有好的想法,欢迎留言贡献。

开发进度

从2021年11月左右开始重构友链朋友圈项目,采用爬虫框架Scrapy来完成对旧版(3.x版本)项目的重构,也就是最初的4.0版本,该版本仅仅是做到了与旧版功能兼容,并未提供新的功能。随着各种issues的解决和新的idea不断地推动下,目前的朋友圈功能已经丰富了许多,相较于旧版(3.x版本),5.x版本新增了如下功能:

  • 增加了nexmoe、Yun、stun、stellar主题的友链和文章爬取
  • 采用了feedparser解决了旧版本一直以来无法兼容rss订阅格式的问题
  • 支持自定义定义后缀功能,完善对于不规则友链的适配
  • 多个友链页面同时爬取
  • 支持HTTP代理
  • 新增了sqlite、mysql、mongodb三种数据库部署的支持
  • 新增了服务器server部署和docker部署方式
  • 将api集成到主仓库,并添加了众多与前端交互的api
  • 屏蔽站点优化,支持正则表达式
  • 配置项友链添加json配置,支持通过url获取友链配置,支持动态更新
  • 前端管理面板,告别繁琐的配置
  • 增加极简模式

开发趣闻:由于想做一个管理面板,构思好需求后,首先找来了Heo帮我画UI(虽然后来没怎么用上),然后经过大概半个月,后端开发完成。由于店长咕咕咕,前端部分的开发也由我来完成了(众所周知友链朋友圈开发组只有一个人)。
做之前我的前端大概在html、css、js,jquery的水平,既然要做,那就通过这次开发学到点新东西。于是决定从现有的木木的前端样式入手,将他的方案用vue重写一遍,并在此基础上添加管理面板。因此整个国庆7天基本都是在学vue:边看文档,边看视频,边google,边写友圈前端。总之,尽管样式很平庸,还是磕磕绊绊把前端撸出来了。
不过话又说回来,前后端一起写的感觉还不错,前端想要什么接口,自己写就可以了,接口规范也是自己定。交流成本为零,因此开发效率是极其高的,大概这就是全栈开发的乐趣了

版本更新

当前版本5.0.6

新版本的更新规划如下:

  • 暂无

BUG提交

如果您在使用过程中出现任何问题,请联系我提交反馈!
推荐在github上提交issue,或者在这里的评论区进行留言。

在寻求帮助时,希望您提供详细的错误描述与必要的信息,方便我快速定位问题。

附1:

附2:崩溃提问收费表(bushi

image-20220731232837123

附3:论日志的重要性

image-20220731235730943

问题解决

在这里记录一些在开发出现的问题,以及解决思路。(出现的问题与解决的问题太多了,这部分暂时咕咕咕)

1 定时任务重复运行爬虫报错的问题

一开始在server和docker部署方案的编写中,通过启动定时任务多次运行爬虫,会报错twisted.internet.error.ReactorNotRestartable,原因是twisted不能重复运行。解决方案参考这里,另起一个进程启动reactor。

相关代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerProcess
from settings import *
import schedule
from multiprocessing.context import Process
import time

def main():
setting = get_project_settings()
# init settings
initsettings(setting)
process = CrawlerProcess(setting)
didntWorkSpider = ['xiaoso',]
for spider_name in process.spiders.list():
if spider_name in didntWorkSpider :
continue
# print("Running spider %s" % (spider_name))
process.crawl(spider_name)
process.start()

def sub_process_start():
process = Process(target=main)
process.start() # 开始执行
process.join() # 阻塞等待进程执行完毕

def initsettings(setting):
if DATABASE == 'leancloud':
setting["ITEM_PIPELINES"]["hexo_circle_of_friends.pipelines.leancloud_pipe.LeancloudPipeline"] = 300
elif DATABASE == 'mysql' or DATABASE== "sqlite":
setting["ITEM_PIPELINES"]["hexo_circle_of_friends.pipelines.sql_pipe.SQLPipeline"] = 300

if __name__ == '__main__':
if DEPLOY_TYPE == "docker" or DEPLOY_TYPE == "server":
# server/docker部署
schedule.every(6).hours.do(sub_process_start)
schedule.run_all()
while 1:
n = schedule.idle_seconds()
if n is None:
# no more jobs
break
elif n > 0:
# sleep exactly the right amount of time
time.sleep(n)
schedule.run_pending()
else:
main()