ScrapySharp是一个帮助我们快速实现网页数据采集的库,它主要提供了如下两个功能

  1. 从Url获取Html数据
  2. 提供CSS选择器的方式解析Html节点

安装:

ScrapySharp可以直接从Nuget上下载,直接从Package Console里面输入如下命令即可:

PM> Install-Package ScrapySharp

Html下载

首先我们来看看它的Html下载功能,它是通过ScrapingBrowser类来实现的:

var browser = new ScrapingBrowser();
    var html = browser.DownloadString(new
Uri("http://www.cnblogs.com/"));

这个只是一个简单的示例,实际上ScrapingBrowser的功能还是非常全面的,常见的功能如:Charset探测,AutoRedirect、Cache、 Proxy、Cookie、UserAgent、表单提交等都支持得非常好,用它来获取网页比HttClient要方便很多。

Html解析

ScrapySharp的Html解析是基于大名鼎鼎的HtmlAgilityPack来实现的,它主要提供了两个扩展函数CssSelect和CssSelect:

static
IEnumerable<HtmlNode> CssSelect(this
HtmlNode node, string expression);
    static
IEnumerable<HtmlNode> CssSelect(this
IEnumerable<HtmlNode> nodes, string expression);
    static
IEnumerable<HtmlNode> CssSelectAncestors(this
HtmlNode node, string expression);
    static
IEnumerable<HtmlNode> CssSelectAncestors(this
IEnumerable<HtmlNode> nodes, string expression);

相比HtmlAgilityPack提供的层级式解析和Xpath方式的解析比起来,CSS选择器的更为简单快捷,这里以解析博客园的首页标题为例,首先用开发者工具定位标题,可以看到其HTML结构的方式如下:

解析的代码如下:

var doc = new
HtmlDocument();
    doc.LoadHtml(html);

var docNode = doc.DocumentNode;

var nodes = docNode.CssSelect(".titlelnk");
    foreach (var htmlNode in nodes)
    {
        Console.WriteLine(htmlNode.InnerText);
    }

其中关键代码只有docNode.CssSelect(".titlelnk")一句,非常简洁。另外,由于CSS方式比较灵活,如下方式也能获取到标题

var nodes = docNode.CssSelect(".post_item_body > h3");
    var nodes = docNode.CssSelect("div#post_list").CssSelectAncestors("h3");

最后,列举一下常用的CSS查询,以方便后续的使用:

html.CssSelect("div"); //all div elements
    html.CssSelect("div.content"); //all div elements with css class 'content'
    html.CssSelect("div.widget.monthlist"); //all div elements with the both css class
    html.CssSelect("#postPaging"); //all HTML elements with the id postPaging
    html.CssSelect("div#postPaging.testClass");     // all HTML elements with the id postPaging and css class testClass
    html.CssSelect("div.content > p.para");     //p elements who are direct children of div elements with css class 'content'
    html.CssSelect("input[type = text].login");     // textbox with css class login

更多的CSS选择器使用方法可以参看W3的网页:CSS 选择器参考手册

使用ScrapySharp快速从网页中采集数据的更多相关文章

  1. Web网页中动态数据区域的识别与抽取 Dynamical Data Regions Identification and Extraction in Web Pages

    Web网页中动态数据区域的识别与抽取 Dynamical Data Regions Identification and Extraction in Web Pages Web网页中动态数据区域的识别 ...

  2. 网页中的数据的4个处理方式:CRUD(Creat, Retrive, Update, Delete)

    网页中的数据的4个处理方式:CRUD(Creat, Retrive, Update, Delete) 2018-12-21, 后续完善

  3. 使用Xpath从网页中获取数据

    /// <summary> /// 从官方网站中抓取产品信息存放在本地数据库中 /// </summary> /// <returns></returns&g ...

  4. 使用 CSS 选择器从网页中提取数据

    在 R 中,关于网络爬虫最简单易用的扩展包是 rvest.运行以下代码从 CRAN 上安装:install.packages("rvest")首先,加载包并用 read_html( ...

  5. 【转载】使用 gnuplot 在网页中显示数据

    来源:http://www.ibm.com/developerworks/cn/aix/library/au-gnuplot/ 简介 gnuplot 是一个用于生成趋势图和其他图形的工具.它通常用于收 ...

  6. PHP 爬取网页中表格数据

    public function spider_j($page) { $url="http://aaa/bbb".$page."_0/"; $fcontents= ...

  7. 通过spark-sql快速读取hive中的数据

    1 配置并启动 1.1 创建并配置hive-site.xml 在运行Spark SQL CLI中需要使用到Hive Metastore,故需要在Spark中添加其uris.具体方法是将HIVE_CON ...

  8. Asp.net网页中DataGridView数据导出到Excel

    经过上网找资料,终于找到一种可以直接将GridView中数据导出到Excel文件的方法,归纳方法如下: 1. 注:其中的字符集格式若改为“GB2312”,导出的部分数据可能为乱码: 导出之前需要关闭分 ...

  9. css注入获取网页中的数据

    <style><?php echo htmlspecialchars($_GET['x']);?></style> <br><br>< ...

随机推荐

  1. JVM的分区+查看GC对象是否存活+3种GC算法+7种垃圾收集器+如何减少GC次数

    一.JVM的分区:   1.程序计数器(私有) 程序计数器是一块较小的内存分区,你可以把它看做当前线程所执行的字节码的指示器. 在虚拟机的概念模型里,字节码解释器工作时,就是通过改变计数器的值来选择下 ...

  2. acm专题--并查集

    题目来源:http://hihocoder.com/problemset/problem/1066 #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256M ...

  3. C# 获取计算机cpu,硬盘,内存相关的信息

    using System;using System.Management; namespace MmPS.Common.Helper{ /// <summary> /// 获取计算机相关的 ...

  4. HTML+CSS图文排版

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  5. json数据操作

    <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...

  6. hdu 5920(模拟)

    Ugly Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  7. C++ 静多态与动多态

    多态是指通过单一的标识支持不同的特定行为的能力. C++中有两种多态,称为动多态(运行期多态)和静多态(编译期多态),而静多态主要通过模板来实现,宏也是实现静多态的一种途径. 动多态在C++中是通过虚 ...

  8. 深入理解 WordPress 数据库中的用户数据 wp_user

    WordPress 使用 wp_users 数据表存储用户的主要数据,该数据表结构类似于wp_posts 和 wp_comments 数据表,存储的是需要经常访问的用户数据,该数据表的结构以及该数据表 ...

  9. IEEEXtreme 10.0 - N-Palindromes

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - N-Palindromes 题目来源 第10届IEEE极限编程大赛 https://www.hackerra ...

  10. [实战]MVC5+EF6+MySql企业网盘实战(5)——页面模板

    写在前面 上篇文章更新了网盘的登录界面,以及用户头像的等比例压缩功能.今天折腾一下页面的样式,将从网上找的一个模板套用在项目中. 系列文章 [EF]vs15+ef6+mysql code first方 ...