项目介绍

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

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

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

开发进度

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

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

版本更新

当前版本4.4.3

新版本的更新规划如下:

  • 添加后台管理面板,以实现通过面板进行配置更新、版本检测、版本更新等功能

  • 友链的json配置继续完善

  • 更加规范、详细的运行日志记录

  • 傻瓜式部署脚本升级,增加更多可选项

  • 整体逻辑进一步梳理,完成基本结构封装,添加更加详细的注释

  • 为了后续动态下发配置,并考虑扩展性,将用户配置独立出来,而不在settings.py中修改

BUG提交

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

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

提问范例:

  • 标题:简要地描述您所遇到的问题

  • 正文:正文一般应包含如下内容

    • 问题描述,详细描述问题,可以参考如下顺序进行:

      1. 用户操作。如:在部署后端数据库时/修改配置文件后/在运行程序后…
      2. 预期结果。如:数据库部署成功/配置文件修改成功/运行程序后可以在数据库看到数据
      3. 实际结果。如:数据库报错/修改配置后程序报错/运行程序后数据库没有数据/运行一段时间后程序崩溃…

      将上述三条拼成一句话,即可得到问题描述。如:修改配置文件,添加了一个屏蔽站点后(用户操作),本来应该将该站点屏蔽掉(预期结果),但在数据库中仍然出现了该站点(实际结果)。

    • 相关参数配置,如

      • 部署方式,如:docker
      • 数据库:如:mysql
      • 博客主题:如:butterfly

      或者直接提供您的配置文件(方便复现)

    • 错误日志,如:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      Traceback (most recent call last):
      File "/var/task/vc__handler__python.py", line 293, in vc_handler
      response = asgi_cycle(__vc_module.app, body)
      File "/var/task/vc__handler__python.py", line 204, in __call__
      loop.run_until_complete(asgi_task)
      File "/var/task/vc__handler__python.py", line 232, in send
      self.on_request(headers, status_code)
      File "/var/task/vc__handler__python.py", line 253, in on_request
      self.response['headers'] = format_headers(headers, decode=True)
      File "/var/task/vc__handler__python.py", line 20, in format_headers
      key = key.decode()
    • 其他,如:博客地址、github仓库地址等

附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()