宝哥软件园

使用 NET Core写爬虫爬行电影乐园

编辑:宝哥软件园 来源:互联网 时间:2021-09-07

自从上一个项目从。NET到。NET核心,花了一个月的时间上线到新版本。

然后最近新开了一个坑,设置了一个爬虫,爬上了dy2018电影乐园的电影资源。这里我们也借此机会简单介绍一下如何编写一个基于爬虫的。NET核心。

PS:如有错误,请注明…

PPS:应该去电影院或者更常去电影院。毕竟,美好的时光里,美丽是无价的。

准备(。净核心准备)

首先,你必须安装。NET Core优先。在这里下载安装教程://www . JB 51 . net/article/87907 . htm//www . JB 51 . net/article/88735 . htm无论你是Windows、linux还是mac,都可以全部玩。

我这里的环境是:Windows 10 VS 2015社区Updata 3。Net Core 1.1.0 SDK。Net Core 1.0.1工具预览2。

理论上来说。NET核心程序只能通过安装。NET Core 1.1.0 SDK,用什么工具写代码都无所谓。

安装上述工具后,您可以看到的模板。VS2015新项目中的NET Core。下图:

为了简单起见,当我们创建它时,我们直接选择VS .NET Core工具附带的模板。

爬行动物自我培养分析的网页

在编写爬虫之前,首先要了解待爬网页的数据组成。

具体到网页,就是针对我们想要抓取的数据,分析HTML中使用了哪些标签或者标记,然后用这个标签从HTML中提取数据。在我的例子中,我使用了更多的HTML标签ID和CSS属性。

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

在chrome中,按F12进入开发者模式,然后用鼠标选择如下图对应的页面数据,然后分析页面的HTML构成。

然后我们开始分析页面数据:

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

www.dy2018.com主页的电影数据存储在一个div标签中,该标签的类是co_content222

电影详细信息链接是一个标签,标签上显示的文本是电影名称,网址是详细信息网址

综上所述,我们的工作是找到class='co_content222 '的div标签,并从中提取所有的A标签数据。

开始写代码.

安格尔夏普库,一个基于。NET(C#)是专门为解析xHTML源代码而开发的,之前写项目的时候就用过。

安格尔夏普的主页在这里:https://anglesharp.github.io/.

详细介绍://www . JB 51 . net/article/99082 . htm。

Nuget地址: Nuget AngleSharp安装命令:安装-打包AngleSharp

获取电影列表数据

私有静态HTMl解析器HTMl解析器=新建HTMl解析器();private ConcurrentDictionarystring,MovieInfo _ cdMovieInfo=new ConcurrentDictionarystring,MovieInfo();private void addtohotmovielist(){//此操作不阻塞当前其他操作,所以使用Task//_cdMovieInfo为线程安全字典,存储了当期所有的电影数据任务。工厂。StartNew(()={ try { //通过统一资源定位器获取HTML var htmlDoc=HTTPHelper .gethtml byurl(' http://www。2018年去世。com/');//HTML解析成IDocument var dom=htmlParser .解析(HTMlDoc);//从数字正射影像图中提取所有class='co_content222 '的差异标签//QuerySelectorAll方法接受选择器语法var lstDivInfo=dom .查询selectorall(' div。co _ content 222’;if(lsti nfo!=null) { //前三个差异为新电影foreach(var DivinFo in lsDivinFo .Take(3)) { //获取差异中所有的a标签且a标签中含有/i/'的//包含('/i/')条件的过滤是因为在测试中发现这一块差异中的a标签有可能是广告链接占卜者QuerySelectorAll('a ').其中(a=a.GetAttribute('href ').包含('/i/').ToList().ForEach(a={ //拼接成完整链接var OnLineURl=' http://www .2018年去世。com ' a . GetAttribute(' href ');//看一下是否已经存在于现有数据中if(!_cdMovieInfo .ContainsKey(onlineURL)) { //获取电影的详细信息MovieInfo MovieInfo=fillmoveinfoformweb(a,在线网址);//下载链接不为空才添加到现有数据if (movieInfo .迅雷下载网址列表!=空电影信息.迅雷下载列表。计数!=0) { _cdMovieInfo .尝试添加(电影信息.Dy2018OnlineUrl,movieInfo);} } });} } } catch(Exception ex){ } });}获取电影详细信息

privatemoveinfofilmovieinfoformweb(AngleSharp .多姆。IElement a,string OnLineURl){ var movieHTML=Httpelper .gethtml by URL(OnLineURl);var movieDoc=htmlParser .解析(movieHTML);//http://www .2018年去世。com/I/97462。超文本标记语言分析过程见上,不再赘述//电影的详细介绍在编号为一款云视频会议软件的标签中var zoom=movieDoc .GetElementById(' Zoom ');//下载链接在bgcolor=' # fdfdfddf '的任务描述中,有可能有多个链接var lstDownLoadURL=movieDoc .查询selector all('[bgcolor=' # fdfdfddf ']');//发布时间在class='updatetime '的跨度标签中var updatetime=movieDoc .查询选择或(' span。update time’);var pubDate=DateTime .现在;if(updatetime!=null!字符串IsNullOrEmpty(更新时间.InnerHtml)) { //内容带有"发布时间:"字样,//替换成''之后再去转换,转换失败不影响流程日期时间特里帕斯(更新时间。内部Html .替换('发布时间:',''),out PubDate);} var movieInfo=new movieInfo(){//InnerHtml中可能还包含字体标签,做多一个替换MovieName=a . innerhtml。替换(' font color= ' # 0c 9000 ',' ').替换(' font color=' #0c9000 ',' ').替换('/font ',''),Dy2018OnlineUrl=onlineURL,MovieIntro=zoom!=null?网络实用程序.HtmlEncode(缩放' InnerHtml) : '暂无介绍.', //可能没有简介,虽然好像不怎么可能Xun leidownloadurllist=lstdowloadurl!=null?lstDownLoadURL .选择(d=d . first elementchild。innerhtml ).ToList() : null,//可能没有下载链接PubDate=pubDate,};返回movieInfo}HTTPHelper

这边有个小坑,dy2018网页编码格式是英国标准2312 .净核心默认不支持GB2312,使用编码GetEncoding(GB2312)的时候会抛出异常。

解决方案是手动安装系统。文本。编码。代码页包(安装包系统。文本。编码。代码页),

然后在Starup.cs的安装使成形方法中加入编码注册提供商(代码页编码提供商.实例),接着就可以正常使用编码GetEncoding(GB2312)了。

使用系统;使用系统. Net。超文本传送协议(Hyper Text Transport Protocol的缩写)使用系统. Net。Http。头球使用系统。文字;命名空间Dy2018Crawler{公共类HTTPHelper {公共静态HttpClient Client { get }=new HttpClient();publicationstatisticstringgethtml byurl(string gurl){ 0尝试{系统.网络请求=系统净。WebRequest。创建(网址);wRequest .content TYPe=' text/html;字符集=GB 2312 ';wRequest .方法=' getwRequest .UseDefaultCredentials=true//获取响应实例var task=wRequest .getresponsiysync();系统. Net。WebResponse wResp=任务1 .结果;系统。输入输出流响应流GetResponseStream();//dy2018这个网站编码方式是GB2312,使用(系统。流阅读器=新系统。流阅读器(响应流,编码GetEncoding(' GB2312 ')(返回读取器ReadToEnd();} } catch(异常例如){控制台.WriteLine(例如. ToString());返回字符串。空的;} } }}定时任务的实现

定时任务我这里使用的是柚子AspNetCore。TimedJob。

柚子AspNetCore。TimedJob是一个。净核心实现的定时任务工作库,支持毫秒级定时任务、从数据库读取定时配置、同步异步定时任务等功能。

由。净核心社区大神兼前微软MVP AmamiyaYuuko(入职微软之后就卸任MVP……)开发维护,不过好像没有开源,回头问下看看能不能开源掉。

nuget上有各种版本,按需自取。地址:https://www.nuget.org/packages/Pomelo。AspNetCore.TimedJob/1.1.0-rtm-10026

作者自己的介绍文章:定时作业-柚子扩展包系列

Startup.cs相关代码

我这边使用的话,首先肯定是先安装对应的包:安装-包装柚子AspNetCore。计时器作业-预

然后在Startup.cs的配置服务函数里面添加服务,在安装使成形函数里面使用一下。

//运行时调用此方法。使用此方法将服务添加到容器中公共voitconfigureservice(iServiceCollection services){//添加框架服务。服务addMVc();//添加TimedJob服务服务AddTimedJob();}公共void configure(IApplicationBuilder应用程序,IHostingEnvironment env,ILoggerFactory logger factory工厂){//使用TimedJob应用UseTimedJob();if (env .IsDevelopment()) { app .usedeveloper异常页();应用程序.UseBrowserLink();} else { app .UseExceptionHandler('/Home/Error ');}应用程序.UseStaticFiles();应用程序.UseMvc(routes={ routes .MapRoute(名称: '默认',模板: ' {控制器=Home }/{操作=Index }/{ id?}');});编码注册提供商(代码页编码提供商.实例);}工作相关代码

接着新建一个类,明明为XXXJob.cs,引用命名空间使用柚子AspNetCore。计时器作业,XXXJob继承于工作,添加以下代码。

公共类autogetmovielistjob :作业{//开始起始时间;间隔执行时间间隔,单位是毫秒,建议使用以下格式,此处为3小时;//Skipwhilexecuting是否等待上一个执行完成,真的为等待;[Invoke(Begin=' 2016-11-29 22:10 ',Interval=1000 * 3600*3,SkipWhileExecuting=true)]public void run(){//Job要执行的逻辑代码//LogHelper .信息("开始爬网");//AddToLatestMovieList(100);//AddToHotMovieList();//LogHelper .信息("完成爬网");}}项目发布相关新增运行时节点

使用VS2015新建的模板工程,project.json配置默认是没有运行时节点的。

我们想要发布到非Windows操作系统操作系统平台的时候,需要手动配置一下此节点以便生成。

运行时' : { ' win 7-x64 ' : { },' win7-x86': {},' osx.10.10-x64': {},' osx.10.11-x64': {},' ubuntu.14.04-x64': {}删除/注释剧本节点

生成时会调用node.js脚本构建前端代码,这个不能确保每个环境都有凉亭存在…注释完事。

//' scripts ' : {//' prepublish ' :[' bower install ',' dotnet bundle' ],/' post publish ' :[' dotnet publish-IIS-publish-folder % publish :输出路径%-framework % publish : full target framework % ']/},删除/注释属国节点里面的类型

依赖项' : { '微软。net core . app ' : { ' version ' : ' 1 . 1 . 0 '//' type ' : ' platform ' },project.json的相关配置描述可以在这个官方文档中找到:Project.json-file。

还是张善友老师的文章。NET Core系列:2。项目葫芦里卖的是什么药

开发、汇编和发布

//还原各种包文件dotnet还原;//发布到c: code 网站 dy2018 crawler文件夹dotnet publish-r Ubuntu . 14.04-x64-cre less-o ' c : code 网站 dy 2018 crawler ';最后,照常开放源代码.上面的代码如下:

盖枢纽地址:https://github.com/liguobao/Dy2018Crawler

PS:以后写爬坡片。你拿着它吗…

更多资讯
游戏推荐
更多+