数据抓取Fizzler

Fizzler插件下载地址

需要引用:

using Fizzler;

using Fizzler.Systems.HtmlAgilityPack;

using HtmlAgilityPack;

 public class FizzlerHelper
    {
        /// <summary>
        /// 获取相应的标签内容
        /// </summary>
        /// <param name="url">地址链接</param>
        /// <param name="cssLoad">css路径</param>
        /// <returns></returns>
        public static IEnumerable<HtmlNode> GetUrlInfo(string url, string cssLoad)
        {
            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument
            {
                OptionAddDebuggingAttributes = false,
                OptionAutoCloseOnEnd = true,
                OptionFixNestedTags = true,
                OptionReadEncoding = true
            };
            string html = HttpGet<string>(url);
            htmlDoc.LoadHtml(html);
            IEnumerable<HtmlNode> NodesMainContent = htmlDoc.DocumentNode.QuerySelectorAll(cssLoad);//查询的路径
            return NodesMainContent;
        }

        /// <summary>
        /// 获取相应的标签内容
        /// </summary>
        /// <param name="html">html内容</param>
        /// <param name="cssLoad">css路径</param>
        /// <returns></returns>
        public static IEnumerable<HtmlNode> GetHtmlInfo(string html, string cssLoad)
        {
            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument
            {
                OptionAddDebuggingAttributes = false,
                OptionAutoCloseOnEnd = true,
                OptionFixNestedTags = true,
                OptionReadEncoding = true
            };

            htmlDoc.LoadHtml(html);
            IEnumerable<HtmlNode> NodesMainContent = htmlDoc.DocumentNode.QuerySelectorAll(cssLoad);//查询的路径
            return NodesMainContent;
        }

        #region GET请求
        public static T HttpGet<T>(string url)
        {
            try
            {
                string retString = "";
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "GET";
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    Stream stream = response.GetResponseStream();
                    using (StreamReader streamReader = new StreamReader(stream, Encoding.UTF8))
                    {
                        retString = streamReader.ReadToEnd().ToString();
                    }
                }

                return (T)Convert.ChangeType(retString, typeof(T));
            }
            catch
            {
                return default(T);
            }
        }
        #endregion
    }

实现数据抓取(透明售房网),Fizzler:主要是通过Html中的标签样式获取数据,屏蔽了复杂的正则表达式。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;
using Fizzler;
using Fizzler.Systems.HtmlAgilityPack;
using HtmlAgilityPack;
using Newtonsoft.Json;
using DataCollectionCommon;
using System.Text;
using DataCollectionDAL;
using DataCollectionModel;
using System.Text.RegularExpressions;

namespace DataCollectionDemo
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        public static FizzlerHelper fizzlerHelper = new FizzlerHelper();
        public string resultHtml = string.Empty;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //杭州
                resultHtml = StartDataCollection("http://www.tmsf.com/daily.htm");
            }
        }

        /// <summary>
        /// 开始抓取数据
        /// </summary>
        /// <param name="<span style="font-family: Arial, Helvetica, sans-serif;">url</span><span style="font-family: Arial, Helvetica, sans-serif;">">网站地址路径</param></span>
        /// <returns></returns>
        [WebMethod]
        public static string StartDataCollection(string url)
        {
            StringBuilder temp_table = new StringBuilder();
            temp_table.Append("<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">");
            temp_table.Append("<tr><td>楼盘名称</td><td>城区</td><td>签约套数</td><td>预定套数</td><td>签约面积</td><td>签约均价</td></tr>");
            List<HtmlNode> list_tr = FizzlerHelper.GetUrlInfo(url, "div.datanowin table tr").ToList();
            if (list_tr.Count > 0)
            {
                //移除表头
                list_tr.RemoveAt(0);
            }
            //循环行tr
            foreach (HtmlNode node_tr in list_tr)
            {
                string tdHtml = node_tr.InnerHtml;//再去解析html中的td
                List<HtmlNode> list_td = FizzlerHelper.GetHtmlInfo(tdHtml, "td").ToList();
                temp_table.Append("<tr>");
                //循环列td
                foreach (HtmlNode node_td in list_td)
                {
                    string spanHtml = node_td.InnerHtml;
                    MatchCollection mcc_temp = Regex.Matches(spanHtml, @"<span class=""(?<url>.+?)""></span>", RegexOptions.Singleline);
                    string values = GetValueBySpanClass(mcc_temp);
                    temp_table.AppendFormat("<td>{0}{1}</td>", values, node_td.InnerText);
                }
                temp_table.Append("</tr>");
            }
            temp_table.Append("</table>");
            return temp_table.ToString();

            //return JsonConvert.SerializeObject(new { code = 1, msg = "数据采集失败", data = temp.ToString() });
        }

        /// <summary>
        /// 根据span样式名称 解析值
        /// </summary>
        /// <param name="mcc_span"></param>
        /// <returns></returns>
        private static string GetValueBySpanClass(MatchCollection mcc_span)
        {
            string str_value = "";
            for (int i = 0, length = mcc_span.Count; i < length; i++)
            {
                switch (mcc_span[i].Groups["url"].Value)
                {
                    case "numbdor":
                        str_value += ".";
                        break;
                    case "numbzero":
                        str_value += "0";
                        break;
                    case "numbone":
                        str_value += "1";
                        break;
                    case "numbtwo":
                        str_value += "2";
                        break;
                    case "numbthree":
                        str_value += "3";
                        break;
                    case "numbfour":
                        str_value += "4";
                        break;
                    case "numbfive":
                        str_value += "5";
                        break;
                    case "numbsix":
                        str_value += "6";
                        break;
                    case "numbseven":
                        str_value += "7";
                        break;
                    case "numbeight":
                        str_value += "8";
                        break;
                    case "numbnine":
                        str_value += "9";
                        break;
                    default:
                        break;
                }
            }
            return str_value;
        }
    }
}
时间: 2024-11-25 10:56:31

数据抓取Fizzler的相关文章

ngrep环回接口数据抓取方法,使用-d lo参数

ngrep环回接口数据抓取方法,使用-d lo参数,注意顺序: ngrep -W byline -d lo port 80

利用Selenium制作python数据抓取,以及对Selenium资源介绍

当当当~第三篇博客开始啦~ 这次的话题是数据抓取.终于到了核心部分的探讨,我的心情也是非常激动啊!如果大家baidu或者google(如果可以的话)数据抓取或者data crawling,将会找到数以千计的例子.但是大多数的代码非常的冗长,并且许多代码还是抓取静态数据之后,对动态JS写成的数据却毫无办法.或者,利用HTML解析网址后,再找到JS写的数据页面来寻找到所想要的数据. 但是!不知各位是否有发现过,如果打开chrome或者safari或者各种浏览器的审查元素.网页上能看到的数据,其实都会

delphi 用idhttp做web页面数据抓取 注意事项

这里不讨论webbrowse方式了 .直接采用indy的 idhttp  Get post 可以很方便的获取网页数据. 但如果要抓取大量数据 程序稳定运行不崩溃就不那么容易了.这几年也做了不少类似工具 总结了几点 好记性不如烂笔头. 内存泄露 获取页面文本 少不了用到html解析 具体到delphi 估计采用mshtml htmltotext 方法的不少,这个方案再大数据量时就会内存溢出 导致程序崩溃,而这并不是每个程序员都知道.解决的方案:采用自己的html解析类 这里我要感谢 武稀松(csd

Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)

概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容.主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作. 先进行所有页面的内容进行抓取 var page =require('webpage').create(); var address='http://product.pconline.com.cn/server/'; var fs = require('fs'); var mypath = 'ver

Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)

概要 这篇博客是在上一篇博客Phantomjs+Nodejs+Mysql数据抓取(1.抓取数据) http://blog.csdn.net/jokerkon/article/details/50868880 后进行的第二部分,请各位读者在看这篇博客之前先浏览上一篇,因为这里面有部分代码会沿用到上一部分的抓取结果. 好,现在开始正式的抓取图片的讲解 首先,我们先来看看代码: var page =require('webpage').create(); var address='http://pro

数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置

数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置 2013-05-15 15:08:14 分类: Python/Ruby 数据抓取是一门艺术,和其他软件不同,世界上不存在完美的.一致的.通用的抓取工具.为了不同的目的,需要定制不同的代码.不过,我们不必Start from Scratch,已经有许多的基本工具.基本方法和基础框架可供使用.不同的工具.不同的方法.不同的框架的特点也不同.了解这些工具.方法和框架是首要任务,接下来就需要明白它们的差异都在哪里.什么情境该用什

C# 微信 生活助手 空气质量 天气预报等 效果展示 数据抓取 (一)

第一次在博客园写博客写的不好,大家见谅.最近工作辞了,然后感冒发烧输了一个星期的液,感觉很烦躁,心情不是很好,在帝都感觉压力大,废话不说了开始正题把! 还没有完全完成,后续考虑开源! 可以关注微信公众帐号体验一下先看下 效果把 先介绍下工具 我用的有 httpwatch,fiddler 国家环保部的数据链接 http://datacenter.mep.gov.cn/report/air_daily/airDairyCityHour.jsp 原以为直接get请求就可以了 试了下 发现没有获取了 然

数据抓取的艺术(三):抓取Google数据之心得

本来是想把这部分内容放到前一篇<数据抓取的艺术(二):数据抓取程序优化>之中.但是随着任务的完成,我越来越感觉到其中深深的趣味,现总结如下: (1)时间     时间是一个与抓取规模相形而生的因素,数据规模越大,时间消耗往往越长.所以程序优化变得相当重要,要知道抓取时间越长,出错的可能性就越大,这还不说程序需要人工干预的情境.一旦运行中需要人工干预,时间越长,干预次数越多,出错的几率就更大了.在数据太多,工期太短的情况下,使用多线程抓取,也是一个好办法,但这会增加程序复杂度,对最终数据准确性产

Hibernate学习---第十一节:Hibernate之数据抓取策略&amp;批量抓取

1.hibernate 也可以通过标准的 SQL 进行查询 (1).将SQL查询写在 java 代码中 /** * 查询所有 */ @Test public void testQuery(){ // 基于标准的 sql 语句查询 String sql = "select * from t_person"; // 通过 createSQLQuery 获取 SQLQuery,而 SQLQuer 是 Query的子类 SQLQuery query = session.createSQLQue