• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 用.NET Core写爬虫爬取电影天堂

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

作者:codelover 字体:[增加 减小] 来源:互联网 时间:2017-05-11

codelover通过本文主要向大家介绍了net.core磊科,net.core磊科安装,net.core磊科官网,net.core磊科设置,net.core磊科改密码等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

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

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

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

准备工作(.NET Core准备)

首先,肯定是先安装.NET Core咯。下载及安装教程在这里: http://www.weikejianghu.com/article/87907.htm http://www.weikejianghu.com/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的模板了。如下图:

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

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

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

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

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

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

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

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

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

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

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

开始写代码…

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

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

详细介绍:http://www.weikejianghu.com/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)
	 {
	
	 }
	});
}

获取电影详细信息

 privateMovieInfoFillMovieInfoFormWeb(AngleSharp.Dom.IElement a,
 string onlineURL)
{
 var movieHTML = HTTPHelper.GetHTMLByURL(onlineURL);
 var movieDoc = htmlParser.Parse(movieHTML);
 //http://www.dy2018.com/i/97462.html 分析过程见上,不再赘述
 //电影的详细介绍 在id为Zoom的标签中
 var zoom = movieDoc.GetElementById("Zoom");
 //下载链接在 bgcolor='#fdfddf'的td中,有可能有多个链接
 var lstDownLoadURL = movieDoc.QuerySelectorAll("[bgcolor='#fdfddf']");
 //发布时间 在class='updatetime'的span标签中
 var updatetime = movieDoc.QuerySelector("span.updatetime"); 
 var pubDate = DateTime.Now;
 if(updatetime!=null && !string.IsNullOrEmpty(updatetime.InnerHtml))
 {
  //内容带有“发布时间:”字样,
  //replace成""之后再去转换,转换失败不影响流程
  DateTime.TryParse(updatetime.InnerHtml.Replace("发布时间:", 
  ""), out pubDate);
 }
 

 var movieInfo = new MovieInfo()
 {
  //InnerHtml中可能还包含font标签,做多一个Replace
  MovieName = a.InnerHtml.Replace("<font color=\"#0c9000\">","")
  .Replace("<font color=\" #0c9000\">","")
  .Replace("</font>", ""),
  Dy2018OnlineUrl = onlineURL,
  MovieIntro = zoom != null ? WebUtility.HtmlEncode(zoom.InnerHtml) : "暂无介绍...",
  //可能没有简介,虽然好像不怎么可能
  XunLeiDownLoadURLList = lstDownLoadURL != null ?
  lstDownLoadURL.Select(d => d.FirstElementChild.InnerHtml).ToList() : null,
  //可能没有下载链接
  PubDate = pubDate,
 };
 return movieInfo;
}

HTTPHelper

这边有个小坑,dy2018网页编码格式是GB2312,.NET Core默认不支持GB2312,使用Encoding.GetEncoding(“GB2312”)的时候会抛出异常。

解决方案是手动安装System.Text.Encoding.CodePages包(Install-Package System.Text.Encoding.CodePages),

然后在Starup.cs的Configure方法中加入Encoding.RegisterProvider(CodePagesEncodingProvider.Instance),接着就可以正常使用Encoding.GetEncoding(“GB2312”)了。

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;

namespace Dy2018Crawler
{
 public class HTTPHelper
 {

  public static HttpClient Client { get; } = new HttpClient();

  publicstaticstringGetHTMLByURL(stringurl)
  {
   try
   {
    System.Net.WebRequest wRequest = System.Net.WebRequest.Create(url);
    wRequest.ContentType = "text/html; charset=gb2312";

    wRequest.Method = "get";
    wRequest.UseDefaultCredentials = true;
    // Get the response instance.
    var task = wRequest.GetResponseAsync();
    System.Net.WebResponse wResp = task.Result;
    System.IO.Stream respStream = wResp.GetResponseStream();
    //dy2018这个网站编码方式是GB2312,
    using (System.IO.StreamReader reader =
    new System.IO.StreamReader(respStream,
    Encoding.GetEncoding("GB2312")))
    {
     return reader.ReadToEnd();
    }
   }
   catch (Exception ex)
   {
    Console.WriteLine(ex.ToString());
    return string.Empty;
   }
  }
  
 }


}

定时任务的实现

定时任务我这里使用的是 Pomelo.AspNetCore.TimedJob 。

Pomelo.AspNetCore.TimedJob是一个.NET

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • .NET Core创建一个控制台(Console)程序
  • .NET Core 1.0创建Self-Contained控制台应用
  • 用.NET Core写爬虫爬取电影天堂
  • .Net Core 下使用ZKWeb.System.Drawing实现验证码功能(图形验证码)
  • .Net Core 之 Ubuntu 14.04 部署过程(图文详解)
  • .Net core下直接执行SQL语句并生成DataTable的实现方法
  • .Net Core 之 Ubuntu 14.04 部署过程(图文详解)
  • .Net core下直接执行SQL语句并生成DataTable的实现方法
  • .NET Core Windows环境安装配置教程

相关文章

  • 2017-05-11ASP.net 页面被关闭后,服务器端是否仍然执行中?
  • 2018-08-20SignalR Self Host+MVC等多端消息推送服务(二)
  • 2017-05-11Asp.net中的mail的发送
  • 2018-08-20XAML: 自定义控件中事件处理的最佳实践方法
  • 2017-05-11asp.net批量多选文件上传解决方案
  • 2017-05-11防SQL注入 生成参数化的通用分页查询语句
  • 2017-05-11asp.net实现上传文件显示本地绝对路径的实例代码
  • 2017-05-11asp.net GridView控件中实现全选的解决方案
  • 2017-05-11Asp.net response对象与request对象使用介绍
  • 2017-05-11在ASP.NET 2.0中操作数据之六十九:处理Computed Columns列

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ASP.net WebAPI 上传图片实例
    • 使用Visual Studio 2017写静态库
    • asp.net下 jquery jason 高效传输数据
    • C# 生转换网页为pdf
    • asp.net 在global中拦截404错误的实现方法
    • ASP.NET生成Google网站地图的代码
    • asp.net 按字节检查包含全半角的文字
    • 实现Asp.net mvc上传头像加剪裁功能
    • c# 读取文件内容存放到int数组 array.txt
    • ASP.NET自定义Web服务器控件之Button控件

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有