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. Xcode及模拟器SDK下载

    http://blog.csdn.net/zhangao0086/article/details/38491271 吐槽下,百度打着无限分享的旗号,却又让分享资源过期,让分享者持续维护 如果你嫌在Ap ...

  2. 微信开发,调用js-SDK接口

    微信开发,调用js-SDK接口<!DOCTYPE html><html><head lang="en"> <meta charset=&q ...

  3. html基础-css-选择器

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. 通过复制(拷贝)新建javaweb项目报错无法访问

    我们有时候为了方便,用eclipse在原来动态web项目上直接复制,粘贴项目,来形成以一个新的项目.可是运行的时候,它显示的url地址,还是原来的项目地址.初步判定,有可能是eclipse配置的问题. ...

  5. java并发编程实战笔记---(第五章)基础构建模块

    . 5.1同步容器类 1.同步容器类的问题 复合操作,加容器内置锁 2.迭代器与concurrentModificationException 迭代容器用iterator, 迭代过程中,如果有其他线程 ...

  6. webStorage,离线缓存

    一.webStorage 1.目标 1.了解cookie的不足之处,引入webstorage的概念    2.学习并且掌握webstorage有哪两种    3.学习并且掌握sessionStorag ...

  7. 洛谷 P1469 找筷子 题解

    题目传送门 先排序一遍,再一个一个判断是否有偶数个.注意for循环要i+=2. #include<bits/stdc++.h> using namespace std; ]; int ma ...

  8. IEEEXtreme 10.0 - Flower Games

    这是 meelo 原创的 IEEEXtreme极限编程比赛题解 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank.com/contests/ieeextreme-c ...

  9. 记一次ceph集群的严重故障

    问题:集群状态,坏了一个盘,pg状态好像有点问题[root@ceph-1 ~]# ceph -s    cluster 72f44b06-b8d3-44cc-bb8b-2048f5b4acfe     ...

  10. 使用Unity解耦你的系统—PART3——依赖注入

    继续学习Unity,在前几篇中已经将Unity的使用方法做了一个还算详细的介绍了,主要是如何通过代码及配置文件来注册对象之间的关系.Unity内置所有的生命周期管理使用介绍,及Unity的Regist ...