前言

这是基于Scrapy重写的友链朋友圈爬虫项目。基于原来项目的重构,新增加了一些主题的爬取。

前排提醒

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

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

debug记录

  • wordpress类型博客的时间格式问题
  • butterfly主题友链页解析不再抓取背景图片了
  • 修复了github和gitee对volantis主题的友链获取
  • 屏蔽站点现在不计入失联数
  • 修复了sakura主题和nexmoe主题偶尔报错的问题
  • 现在可以获取Yun主题的外置JSON友链
  • 优化了启动项配置
  • feed订阅解析更加精准了
  • 解决了docker和server定时任务运行爬虫报错的问题

功能概览

  • 支持 gitee 和 github 上的 issuse 友链获取
  • 支持butterfly、volantis、matery、sakura、fluid、nexmoe、Yun、stun、stellar主题的友链和文章获取
  • 支持feed订阅规则,如atom、rss等规则(支持wordpress类型的博客)
  • 支持自定义订阅后缀
  • 支持站点屏蔽
  • 支持按照更新时间和创建时间排序
  • 支持未适配的hexo主题和非hexo用户使用,在配置项选择开启配置项友链
  • 额外的友链页同时爬取
  • 支持添加HTTP代理
  • 新增数据存储配置,提供多种存储方式
  • 新增部署方式配置,可部署在本地服务端
  • 将api整合到主仓库

TODO

代码注释,方便二次开发。

BUG提交

如果你在使用过程中出现任何问题,请联系我提交反馈!
github上提交issue,或者在评论区留言。

问题解决

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