当前位置: 首页 > news >正文

做网站找客户申请免费域名空间

做网站找客户,申请免费域名空间,成都住建局官网报名被挤爆黑幕,怎么创建网页桌面快捷方式上一篇文章使用AutoMapper来处理对象与对象之间的映射关系#xff0c;本篇主要围绕定时任务和数据抓取相关的知识点并结合实际应用#xff0c;在定时任务中循环处理爬虫任务抓取数据。开始之前可以删掉之前测试用的几个HelloWorld#xff0c;没有什么实际意义#xff0c;直… 上一篇文章使用AutoMapper来处理对象与对象之间的映射关系本篇主要围绕定时任务和数据抓取相关的知识点并结合实际应用在定时任务中循环处理爬虫任务抓取数据。开始之前可以删掉之前测试用的几个HelloWorld没有什么实际意义直接干掉吧。抓取数据我主要用到了HtmlAgilityPack和PuppeteerSharp一般情况下HtmlAgilityPack就可以完成大部分的数据抓取需求了当在抓取动态网页的时候可以用到PuppeteerSharp同时PuppeteerSharp还支持将图片保存为图片和PDF等牛逼的功能。关于这两个库就不多介绍了不了解的请自行去学习。先在.BackgroundJobs层安装两大神器Install-Package HtmlAgilityPack、Install-Package PuppeteerSharp。我在使用Package Manager安装包的时候一般都不喜欢指定版本号因为这样默认是给我安装最新的版本。之前无意中发现爱思助手的网页版有很多手机壁纸(https://www.i4.cn/wper_4_0_1_1.html)于是我就动了小心思把所有手机壁纸全部抓取过来自嗨可以看看我个人博客中的成品吧https://meowv.com/wallpaper ????????????最开始我是用Python实现的现在我们在.NET中抓它。我数了一下一共有20个分类直接在.Domain.Shared层添加一个壁纸分类的枚举WallpaperEnum.cs。//WallpaperEnum.cs using System.ComponentModel;namespace Meowv.Blog.Domain.Shared.Enum {public enum WallpaperEnum{[Description(美女)]Beauty 1,[Description(型男)]Sportsman 2,[Description(萌娃)]CuteBaby 3,[Description(情感)]Emotion 4,[Description(风景)]Landscape 5,[Description(动物)]Animal 6,[Description(植物)]Plant 7,[Description(美食)]Food 8,[Description(影视)]Movie 9,[Description(动漫)]Anime 10,[Description(手绘)]HandPainted 11,[Description(文字)]Text 12,[Description(创意)]Creative 13,[Description(名车)]Car 14,[Description(体育)]PhysicalEducation 15,[Description(军事)]Military 16,[Description(节日)]Festival 17,[Description(游戏)]Game 18,[Description(苹果)]Apple 19,[Description(其它)]Other 20,} } 查看原网页可以很清晰的看到每一个分类对应了一个不同的URL于是手动创建一个抓取的列表列表内容包括URL和分类然后我又想用多线程来访问URL返回结果。新建一个通用的待抓项的类起名为:WallpaperJobItem.cs为了规范和后续的壁纸查询接口我们放在.Application.Contracts层中。//WallpaperJobItem.cs using Meowv.Blog.Domain.Shared.Enum;namespace Meowv.Blog.Application.Contracts.Wallpaper {public class WallpaperJobItemT{/// summary/// see crefResult//// /summarypublic T Result { get; set; }/// summary/// 类型/// /summarypublic WallpaperEnum Type { get; set; }} } WallpaperJobItemT接受一个参数TResult的类型由T决定在.BackgroundJobs层Jobs文件夹中新建一个任务起名叫做WallpaperJob.cs吧。老样子继承IBackgroundJob。//WallpaperJob.cs using Meowv.Blog.Application.Contracts.Wallpaper; using Meowv.Blog.Domain.Shared.Enum; using System.Collections.Generic; using System.Threading.Tasks;namespace Meowv.Blog.BackgroundJobs.Jobs.Wallpaper {public class WallpaperJob : IBackgroundJob{public async Task ExecuteAsync(){var wallpaperUrls new ListWallpaperJobItemstring{new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_1_1.html, Type WallpaperEnum.Beauty },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_58_1.html, Type WallpaperEnum.Sportsman },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_66_1.html, Type WallpaperEnum.CuteBaby },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_4_1.html, Type WallpaperEnum.Emotion },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_3_1.html, Type WallpaperEnum.Landscape },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_9_1.html, Type WallpaperEnum.Animal },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_13_1.html, Type WallpaperEnum.Plant },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_64_1.html, Type WallpaperEnum.Food },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_11_1.html, Type WallpaperEnum.Movie },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_5_1.html, Type WallpaperEnum.Anime },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_34_1.html, Type WallpaperEnum.HandPainted },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_65_1.html, Type WallpaperEnum.Text },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_2_1.html, Type WallpaperEnum.Creative },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_10_1.html, Type WallpaperEnum.Car },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_14_1.html, Type WallpaperEnum.PhysicalEducation },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_63_1.html, Type WallpaperEnum.Military },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_17_1.html, Type WallpaperEnum.Festival },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_15_1.html, Type WallpaperEnum.Game },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_12_1.html, Type WallpaperEnum.Apple },new WallpaperJobItemstring { Result https://www.i4.cn/wper_4_19_7_1.html, Type WallpaperEnum.Other }};}} } 先构建一个要抓取的列表 wallpaperUrls这里准备用 HtmlAgilityPack默认只抓取第一页最新的数据。public async Task RunAsync() {...var web new HtmlWeb();var list_task new ListTaskWallpaperJobItemHtmlDocument();wallpaperUrls.ForEach(item {var task Task.Run(async () {var htmlDocument await web.LoadFromWebAsync(item.Result);return new WallpaperJobItemHtmlDocument{Result htmlDocument,Type item.Type};});list_task.Add(task);});Task.WaitAll(list_task.ToArray()); } 上面这段代码先new了一个HtmlWeb对象我们主要用这个对象去加载我们的URL。web.LoadFromWebAsync(...)它会返回一个HtmlDocument对象这样就和上面的list_task对应起来从而也应证了前面添加的WallpaperJobItem是通用的一个待抓项的类。循环处理 wallpaperUrls等待所有请求完成。这样就拿到了20个HtmlDocument和它的分类接下来就可以去处理list_task就行了。在开始处理之前要想好抓到的图片数据存放在哪里我这里还是选择存在数据库中因为有了之前的自定义仓储之增删改查的经验可以很快的处理这件事情。添加实体类、自定义仓储、DbSet、Code-First等一些列操作就不一一介绍了我相信看过之前文章的人都能完成这一步。Wallpaper实体类包含主键Guid标题Title图片地址Url类型Type和一个创建时间CreateTime。自定义仓储包含一个批量插入的方法BulkInsertAsync(...)。贴一下完成后的图片就不上代码了如果需要可以去GitHub获取。回到WallpaperJob因为我们要抓取的是图片所以获取到HTML中的img标签就可以了。查看源代码发现图片是一个列表呈现的并且被包裹在//article[idwper]/div[classjbox]/div[classkbox]下面学过XPath语法的就很容易了关于XPath语法这里也不做介绍了对于不会的这里有一篇快速入门的文章XPath语法 。利用XPath Helper工具我们在浏览器上模拟一下选择的节点是否正确。使用//article[idwper]/div[classjbox]/div[classkbox]/div/a/img可以成功将图片高亮说明我们的语法是正确的。public async Task RunAsync() {...var wallpapers new ListWallpaper();foreach (var list in list_task){var item await list;var imgs item.Result.DocumentNode.SelectNodes(//article[idwper]/div[classjbox]/div[classkbox]/div/a/img[1]).ToList();imgs.ForEach(x {wallpapers.Add(new Wallpaper{Url x.GetAttributeValue(data-big, ),Title x.GetAttributeValue(title, ),Type (int)item.Type,CreateTime x.Attributes[data-big].Value.Split(/).Last().Split(_).First().TryToDateTime()});});}... } 在 foreach 循环中先拿到当前循环的Item对象即WallpaperJobItemHtmlDocument。通过.DocumentNode.SelectNodes()语法获取到图片列表因为在a标签下面有两个img标签取第一个即可。GetAttributeValue()是HtmlAgilityPack的扩展方法用于直接获取属性值。在看图片的时候发现图片地址的规则是根据时间戳生成的于是用TryToDateTime()扩展方法将其处理转换成时间格式。这样我们就将所有图片按分类存进了列表当中接下来调用批量插入方法。在构造函数中注入自定义仓储IWallpaperRepository。...private readonly IWallpaperRepository _wallpaperRepository;public WallpaperJob(IWallpaperRepository wallpaperRepository){_wallpaperRepository wallpaperRepository;} ... ...var urls (await _wallpaperRepository.GetListAsync()).Select(x x.Url);wallpapers wallpapers.Where(x !urls.Contains(x.Url)).ToList();if (wallpapers.Any()){await _wallpaperRepository.BulkInsertAsync(wallpapers);} 因为抓取的图片可能存在重复的情况我们需要做一个去重处理先查询到数据库中的所有的URL列表然后在判断抓取到的url是否存在最后调用BulkInsertAsync(...)批量插入方法。这样就完成了数据抓取的全部逻辑在保存数据到数据库之后我们可以进一步操作比如写日志、发送邮件通知等等这里大家自由发挥吧。写一个扩展方法每隔3小时执行一次。...public static void UseWallpaperJob(this IServiceProvider service){var job service.GetServiceWallpaperJob();RecurringJob.AddOrUpdate(壁纸数据抓取, () job.ExecuteAsync(), CronType.Hour(1, 3));} ... 最后在模块内中调用。...public override void OnApplicationInitialization(ApplicationInitializationContext context){...service.UseWallpaperJob();} 编译运行打开Hangfire界面手动执行看看效果。完美数据库已经存入了不少数据了还是要提醒一下爬虫有风险抓数需谨慎。Hangfire定时处理爬虫任务用HtmlAgilityPack抓取数据后存入数据库你学会了吗????????????开源地址https://github.com/Meowv/Blog/tree/blog_tutorial
http://www.zqtcl.cn/news/24495/

相关文章:

  • 哪些网站做的比较好看淘客推广方法
  • 惠州市企业网站seo点击软件外国网站 icp备案
  • 网上书店网站建设规划书邦派巴洛特网站是谁做的呀
  • 网站建设潍坊wordpress do_action 返回值
  • 爬取漫画数据做网站金华市建设局网站贾润根
  • 做直播网站需要学什么网站数据库如何导入
  • 企业网站好做吗信息课做网站的软件
  • 开发网站公司公司外贸网站
  • 图片网站怎么建设wordpress版型
  • 北京手机专业网站建设公司房产局官网查询系统
  • 网站建设类文章要发多少片中国住房与城乡建设部官方网站
  • wordpress图片特效插件下载如何外贸seo网站建设
  • 建设银行官网首页 网站有没有专门做营销的公司
  • 营销形网站阿里网站建设App开发
  • 如何创建刷单网站手动安装wordpress主题
  • 设计网站都有什么赣州百姓网
  • 孝感网站建设 付款方式 银行建筑培训机构排名前十
  • 外贸公司网站搭建建医疗网站步骤
  • 上海网站制作公司怎么找seo网站关键词排名优化
  • 做婚庆网站的想法wordpress 社交图标
  • 查询网站的二级域名旅游网站怎么自己做
  • 门户网站字体wordpress调用指定分类的文章
  • 微网站在哪建用邮箱做网站
  • wordpress设主题重庆整站seo
  • 上海模板建站公司网站建设策划方案怎么写
  • 淘宝做女鞋在哪个网站找货优秀电商网站
  • 网站建设 微信公众号运营陈仓网站建设
  • 西宁做网站的好公司企业查找
  • 做西装的网站企业网站建设要注意哪方面
  • 服装网站建设项目规划书早8晚5双休的工作