Server/HostService/SpiderHostService.cs

(开头部分) 2KB

这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。

using OnlineOpinionAnalysis.Server.Data;

namespace OnlineOpinionAnalysis.Server.HostService
{
	public class SpiderHostService : IHostedService, IDisposable
    {
		private ILogger<SpiderHostService> _logger;
		private readonly IServiceScopeFactory _scopeFactory;
		private Timer _timer;

        public readonly List<int> Rids = new() {36,1,3,4,188,160,119};

        public SpiderHostService(ILogger<SpiderHostService> logger,IServiceScopeFactory scopeFactory)
		{
			_logger = logger;
			_scopeFactory= scopeFactory;
		}

		public Task StartAsync(CancellationToken cancellationToken)
		{
            _logger.LogInformation($"[{DateTime.Now}]爬取服务启动");
            // 定时启动后每60分钟更新一次数据
            _timer = new Timer(SaveBiliBiliVideoInfo, null, TimeSpan.Zero, TimeSpan.FromMinutes(60));
            return Task.CompletedTask;
		}

		public Task StopAsync(CancellationToken cancellationToken)
		{
			_logger.LogInformation($"[{DateTime.Now}]爬取服务终止");
			return Task.CompletedTask;
		}
		public void Dispose()
		{
			_timer.Dispose();
		}

        public async void SaveBiliBiliVideoInfo(object? state)
        {
            // 创建数据库上下文的作用域
            using var scope = _scopeFactory.CreateScope();
            var dbContext = scope.ServiceProvider.GetRequiredService<DataContext>();
            _logger.LogInformation($"[{DateTime.Now}]开始爬取bilibli各区热门数据");
			List<BiliVideo> videoData;
            // 遍历分区rid,爬取数据
            foreach (var item in Rids)
            {
				videoData = await SpiderHelper.GetBiliBiliVideoOrder(_logger, item);
                // 若视频已经被爬取过,则更新其信息
                foreach (var video in videoData)
                {
                    var oldVideo =await dbContext.BiliVideos.FindAsync(video.AvId);
                    if (oldVideo != null)
                    {
                        _logger.LogInformation("一个视频有了更新的信息,替换");
                        oldVideo = video;
                    }
                    else
                    {
                      await  dbContext.BiliVideos.AddAsync(video);
                    }
后面还有 12 行代码,解锁后查看完整代码

24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明

AI 解读

登录后可用,每次 10 积分,解读结果公开显示在下面。

还没有人解读过这个文件。