用.NET Core写爬虫爬取电影天堂

自从上一个项目从.NET迁移到.NET core之后,磕磕碰碰磨蹭了一个月才正式上线到新版本。

然后最近又开了个新坑,搞了个爬虫用来爬dy2018电影天堂上面的电影资源。这里也借机简单介绍一下如何基于.NET Core写一个爬虫。

PS:如有偏错,敬请指明…

PPS:该去电影院还是多去电影院,毕竟美人良时可无价。

准备工作(.NET Core准备)

首先,肯定是先安装.NET Core咯。下载及安装教程在这里: https://www.jb51.net/article/87907.htm https://www.jb51.net/article/88735.htm。无论你是Windows、linux还是mac,统统可以玩。

我这里的环境是:Windows10 + VS2015 community updata3 + .NET Core 1.1.0 SDK + .NET Core 1.0.1 tools Preview 2.

理论上,只需要安装一下 .NET Core 1.1.0 SDK 即可开发.NET Core程序,至于用什么工具写代码都无关紧要了。

安装好以上工具之后,在VS2015的新建项目就可以看到.NET Core的模板了。如下图:

用.NET Core写爬虫爬取电影天堂

为了简单起见,我们创建的时候,直接选择VS .NET Core tools自带的模板。

一个爬虫的自我修养 分析网页

写爬虫之前,我们首先要先去了解一下即将要爬取的网页数据组成。

具体到网页的话,便是分析我们要抓取的数据在HTML里面是用什么标签抑或有什么样的标记,然后使用这个标记把数据从HTML中提取出来。在我这里的话,用的更多的是HTML标签的ID和CSS属性。

以本文章想要爬取的dy2018.com为例,简单描述一下这个过程。dy2018.com主页如下图:

用.NET Core写爬虫爬取电影天堂

在chrome里面,按F12进入开发者模式,接着如下图使用鼠标选择对应页面数据,然后去分析页面HTML组成。

用.NET Core写爬虫爬取电影天堂

接着我们开始分析页面数据:

用.NET Core写爬虫爬取电影天堂

用.NET Core写爬虫爬取电影天堂

经过简单分析HTML,我们得到以下结论:

首页的电影数据存储在一个class为co_content222的div标签里面

电影详情链接为a标签,标签显示文本就是电影名称,URL即详情URL

那么总结下来,我们的工作就是:找到class='co_content222' 的div标签,从里面提取所有的a标签数据。

开始写代码…

之前在写做项目的时候用到过AngleSharp库,一个基于.NET(C#)开发的专门为解析xHTML源码的DLL组件。

AngleSharp主页在这里: https://anglesharp.github.io/

详细介绍:https://www.jb51.net/article/99082.htm

Nuget地址: Nuget AngleSharp 安装命令:Install-Package AngleSharp

获取电影列表数据

private static HtmlParser htmlParser = new HtmlParser(); private ConcurrentDictionary<string, MovieInfo> _cdMovieInfo = new ConcurrentDictionary<string, MovieInfo>(); privatevoidAddToHotMovieList() { //此操作不阻塞当前其他操作,所以使用Task // _cdMovieInfo 为线程安全字典,存储了当期所有的电影数据 Task.Factory.StartNew(()=> { try { //通过URL获取HTML var htmlDoc = HTTPHelper.GetHTMLByURL("http://www.dy2018.com/"); //HTML 解析成 IDocument var dom = htmlParser.Parse(htmlDoc); //从dom中提取所有class='co_content222'的div标签 //QuerySelectorAll方法接受 选择器语法 var lstDivInfo = dom.QuerySelectorAll("div.co_content222"); if (lstDivInfo != null) { //前三个DIV为新电影 foreach (var divInfo in lstDivInfo.Take(3)) { //获取div中所有的a标签且a标签中含有"/i/"的 //Contains("/i/") 条件的过滤是因为在测试中发现这一块div中的a标签有可能是广告链接 divInfo.QuerySelectorAll("a").Where(a => a.GetAttribute("href").Contains("/i/")) .ToList().ForEach( a => { //拼接成完整链接 var onlineURL = "http://www.dy2018.com" + a.GetAttribute("href"); //看一下是否已经存在于现有数据中 if (!_cdMovieInfo.ContainsKey(onlineURL)) { //获取电影的详细信息 MovieInfo movieInfo = FillMovieInfoFormWeb(a, onlineURL); //下载链接不为空才添加到现有数据 if (movieInfo.XunLeiDownLoadURLList != null && movieInfo.XunLeiDownLoadURLList.Count != 0) { _cdMovieInfo.TryAdd (movieInfo.Dy2018OnlineUrl,movieInfo); } } }); } } } catch(Exception ex) { } }); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjywxg.html