澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

抓取网站数据不再是难事了,爬虫获得专栏博客

序言:筹算做一个药材价格查询的成效,但刚初始一点数据都不曾靠本身找消息录入的话很辛勤的,所以唯有先到此外网址抓取存到数据库再发轫做那么些了。

前些天,梦姐问我们,她存在三个职责,找到 关切数排行100 和 浏览量排行100 的专辑博客,在二〇一七年还应该有立异的专栏。

       首先从标题谈到,为什么说抓取网站数量不再难(其实抓取网址数量有自然难度卡塔 尔(阿拉伯语:قطر‎,SO EASY!!!使用Fizzler全解决,作者百顺百依大部分人或公司相应都有抓取外人网址数量的涉世,举个例子说咱们天涯论坛每回宣布完作品都会被别的网址给抓取去了,不相信你们看看就清楚了。还或然有人抓取外人网址上的邮箱、电话号码、QQ等等有用音讯,那个音信抓取下来自然能够卖钱依旧干任何事情,大家每一天都会平日接到垃圾短信或邮件,大概就这么回事了,有同感吗,O(∩_∩)O哈哈~。

HtmlAgilityPack在c#里应该多五个人用吗,轻便又有力。在此之前也用它做过多少个爬撤废息的小工具。然而非常久了源代码都不曾了,都忘了怎么用了,此次也是一点一点找资料渐渐做出来的!

梦姐说她要出来意气风发趟,M大神在吃饭,于是本人推断时间,唯有半个钟。

       自个儿近些日子了写了两个程序,贰个顺序是抓取某彩票网址的数额(双色球卡塔 尔(英语:State of Qatar),一个是抓取求职网址(猎聘、拉勾网、海峡人才网等等卡塔尔的数据,那时在写那三个程序的时候显得特别棘手,看见一群的HTML标签真的是想死。首先来回想一下事先笔者是何许深入深入分析HTML的,非常平常的做法,通过WebRequest获得HTML内容,再通过HTML标签一步一步截取你想要的内容,以下代码正是截取双色球的红球和篮球的代码。大器晚成旦网址的标签爆发一些更改恐怕面对的就是要重新改程序了,使用起来优质不便于。

(可是最辛勤的是将数据存到mysql,.net数据库小编直接用的都是mssql,所以首先次做连接mysql遭遇了好些个难题。卡塔 尔(阿拉伯语:قطر‎

整合治理一下:半个钟时间,找到八个表格中,在二〇一七年翻新的专辑。那便是急需。

      下边是小编在深入剖判双色球的红球和篮球的代码,做得最多的是截取(正则表明式卡塔尔国标签相应的从头到尾的经过,或然这段代码显得还不是很复杂,因为那些截取的多少有限,並且十一分有规律所以显得比较简单。

1、使用HtmlAgilityPack

<!--more-->

 1         #region * 在一个TR中,解析TD,获取一期的号码
 2         /// <summary>
 3         /// 在一个TR中,解析TD,获取一期的号码
 4         /// </summary>
 5         /// <param name="wn"></param>
 6         /// <param name="trContent"></param>
 7         private void ResolveTd(ref WinNo wn, string trContent)
 8         {
 9             List<int> redBoxList = null;
10             //匹配期号的表达式
11             string patternQiHao = "<td align="center" title="开奖日期";
12             Regex regex = new Regex(patternQiHao);
13             Match qhMatch = regex.Match(trContent);
14             wn.QiHao = trContent.Substring(qhMatch.Index   17   patternQiHao.Length, 7);
15             //匹配蓝球的表达式
16             string patternChartBall02 = "<td class="chartBall02">";
17             regex = new Regex(patternChartBall02);
18             Match bMatch = regex.Match(trContent);
19             wn.B = Convert.ToInt32(trContent.Substring(bMatch.Index   patternChartBall02.Length, 2));
20             //存放匹配出来的红球号码
21             redBoxList = new List<int>();
22             //匹配红球的表达式
23             string patternChartBall01 = "<td class="chartBall01">";
24             regex = new Regex(patternChartBall01);
25             MatchCollection rMatches = regex.Matches(trContent);
26             foreach (Match r in rMatches)
27             {
28                 redBoxList.Add(Convert.ToInt32(trContent.Substring(r.Index   patternChartBall01.Length, 2)));
29             }
30             //匹配红球的表达式
31             string patternChartBall07 = "<td class="chartBall07">";
32             regex = new Regex(patternChartBall07);
33             rMatches = regex.Matches(trContent);
34             foreach (Match r in rMatches)
35             {
36                 redBoxList.Add(Convert.ToInt32(trContent.Substring(r.Index   patternChartBall07.Length, 2)));
37             }
38             //排序红球号码
39             redBoxList.Sort();
40             //第一个红球号码
41             wn.R1 = redBoxList[0];
42             //第二个红球号码
43             wn.R2 = redBoxList[1];
44             wn.R3 = redBoxList[2];
45             wn.R4 = redBoxList[3];
46             wn.R5 = redBoxList[4];
47             wn.R6 = redBoxList[5];
48         }
  • 下载HtmlAgilityPack类库,并引用到您的项目

自个儿起来分别必要,第一步,读取数据,读取三个表的数额。第二步获取博客更新时间,博客更新时间正是近些日子的稿子的颁发时间。第三步,把结果写到文件里。

      下边那块的代码是某招徕约请网址的截取数据,正是豆蔻梢头串的截取HTML标签的内容,哈哈,那个时候在写当时一定的恨之入骨,不知有做个那措施职业的人是还是不是有共识,当您深入分析超多网址的数量就进一层了(笔者写了抓取拉勾网、赶集网、中华英才网和兼职网的数额卡塔尔,O(∩_∩)O哈哈~想死呀,使用正则表达是去截取数据,再去领取相应音讯的做事。

  作者那边运用的调节台项目

初叶因为xlsx的读取难题卡了作者弹指间,小编计算了,读取excel的章程,小编索要20秒钟写完,而把excel转变为csv读取,小编假使1分钟,于是笔者就把excel格式换为csv。

// 正则表达式过滤:正则表达式,要替换成的文本
        private static readonly string[][] Filters =
        {
            new[] { @"(?is)<script.*?>.*?</script>", "" },
            new[] { @"(?is)<style.*?>.*?</style>", "" },
            new[] { @"(?is)<!--.*?-->", "" },    // 过滤Html代码中的注释
            new[] { @"(?is)<footer.*?>.*?</footer>",""},
            //new[] { "(?is)<div class="job-require bottom-job-require">.*?</div></div>",""}
            new[] { @"(?is)<h3>常用链接:.*?</ul>",""}
        };

        private void GetJobInfoFromUrl(string url)
        {
            try
            {
                JobInfo info = new JobInfo();
                //--
                string pageStr = GetHtmlCode.GetByget(url, "utf-8");
                if (string.IsNullOrEmpty(pageStr))
                {
                    return;
                }
                //--
                pageStr = pageStr.Replace("rn", "");//替换换行符
                // 获取html,body标签内容
                string body = string.Empty;
                string bodyFilter = @"(?is)<body.*?</body>";
                Match m = Regex.Match(pageStr, bodyFilter);
                if (m.Success)
                {
                    body = m.ToString().Replace("<tr >", "<tr>").Replace("rn", "");
                }
                // 过滤样式,脚本等不相干标签
                foreach (var filter in Filters)
                {
                    body = Regex.Replace(body, filter[0], filter[1]);
                }
                //--
                if (!string.IsNullOrEmpty(mustKey) && !body.Contains(mustKey))
                {
                    return;
                }
                body = Regex.Replace(body, "\s", "");

                info.Url = url;

                string basicInfoRegexStr0 = "<h1title=([\s\S] ?)>(.*?)</h1>"; //职位名称
                string position = Regex.Match(body, basicInfoRegexStr0).Value;
                info.Position = string.IsNullOrEmpty(position) ? "" : position.Substring(position.IndexOf(">")   1, position.IndexOf("</") - position.IndexOf(">") - 1);//职位名称

                string basicInfoRegexStr1 = "</h1><h3>(.*?)</h3>";//公司名称
                string company = Regex.Match(body, basicInfoRegexStr1).Value;
                info.Company = string.IsNullOrEmpty(company) ? "" : company.Substring(company.IndexOf("<h3>")   4, company.IndexOf("</h3>") - company.IndexOf("<h3>") - 4);//公司名称

                string basicInfoRegexStr2 = "<divclass="resumeclearfix">(.*?)";//工作地点
                string address = Regex.Match(body, basicInfoRegexStr2).Value;
                info.Address = string.IsNullOrEmpty(address) ? "" : address.Substring(address.IndexOf("")   6, address.IndexOf("</") - address.IndexOf("") - 6);//工作地点

                string basicInfoRegexStr3 = "<li>企业性质:(.*?)</li>";//公司性质
                string nature = Regex.Match(body, basicInfoRegexStr3).Value;
                info.Nature = string.IsNullOrEmpty(nature) ? "" : nature.Substring(nature.IndexOf("")   7, nature.IndexOf("</li>") - nature.IndexOf("") - 7);//公司性质

                if (string.IsNullOrEmpty(info.Nature))
                {
                    string basicInfoRegexStr3_1 = "<br>性质:(.*?)<br>";
                    string nature_1 = Regex.Match(body, basicInfoRegexStr3_1).Value;
                    info.Nature = string.IsNullOrEmpty(nature_1) ? "" : nature_1.Substring(nature_1.IndexOf("")   7, nature_1.LastIndexOf("<br>") - nature_1.IndexOf("") - 7);//公司性质
                }

                string basicInfoRegexStr4 = "<li>企业规模:(.*?)</li>";//公司规模
                string scale = Regex.Match(body, basicInfoRegexStr4).Value;
                info.Scale = string.IsNullOrEmpty(scale) ? "" : scale.Substring(scale.IndexOf("")   7, scale.IndexOf("</li>") - scale.IndexOf("") - 7);//公司规模

                if (string.IsNullOrEmpty(info.Scale))
                {
                    string basicInfoRegexStr4_1 = "<br>规模:(.*?)<br>";
                    string scale_1 = Regex.Match(body, basicInfoRegexStr4_1).Value;
                    info.Scale = info.Nature = string.IsNullOrEmpty(scale_1) ? "" : scale_1.Substring(scale_1.IndexOf("")   7, scale_1.LastIndexOf("<br>") - scale_1.IndexOf("") - 7);//公司规模
                }

                string basicInfoRegexStr5 = "(.*?)";//工作经验
                string experience = Regex.Match(body, basicInfoRegexStr5).Value;
                info.Experience = string.IsNullOrEmpty(experience) ? "" : experience.Substring(experience.IndexOf(">")   1, experience.IndexOf("</") - experience.IndexOf(">") - 1);//工作经验

                string basicInfoRegexStr6 = "(.*?)";//最低学历
                string education = Regex.Match(body, basicInfoRegexStr6).Value;
                info.Education = string.IsNullOrEmpty(education) ? "" : education.Substring(education.IndexOf("")   6, education.IndexOf("") - 6);//最低学历

                string basicInfoRegexStr7 = "<pclass="job-main-title">(.*?)<";//月薪
                string salary = Regex.Match(body, basicInfoRegexStr7).Value;
                info.Salary = string.IsNullOrEmpty(salary) ? "" : salary.Substring(salary.IndexOf(">")   1, salary.LastIndexOf("<") - salary.IndexOf(">") - 1);//月薪

                string timeInfoRegexStr = "<pclass="release-time">发布时间:<em>(.*?)</em></p>";//发布时间
                string time = Regex.Match(body, timeInfoRegexStr).Value;
                info.Time = string.IsNullOrEmpty(time) ? "" : time.Substring(time.IndexOf("<em>")   4, time.IndexOf("</em>") - time.IndexOf("<em>") - 4);//发布时间

                if (GetJobEnd != null)
                {
                    GetJobEnd(pageStr, info);
                }
            }
            catch (Exception exMsg)
            {
                throw new Exception(exMsg.Message);
            }
        }
    }

图片 1

到此地,预管理就做完了。

       从上述代码能够观察都是在截取(正则表明式卡塔尔相应内容,特别复杂,稍稍一不注意就截取不到网址数据,写起来极度的困苦,最后经过QQ群(186841119卡塔尔国里的爱侣的牵线选用了Fizzler来提取网址数量,一下子以为就便于多了,下边着中来介绍一下Fizzler这一个工具(好像那个是开源的卡塔尔国,相关介绍可以去网址查询到。

项目增加援引

本身索要定义四个数据结构,用来积攒数据。

率先提供这几个工具的下载地址:Fizzler

图片 2

仓库储存从表格读取到的数目,必要看一下表格存在怎么样数据。

以此里面满含三个文件:Fizzler.dll、Fizzler.Systems.HtmlAgilityPack.dll、HtmlAgilityPack.dll三个公文,在VS二零一零里引用里一向开展援用就足以了。

代码里丰硕引用

图片 3

图片 4


于是本身定义一个类

图片 5

 

因为不了然专栏诗人叫什么,于是自身就把那么些类叫我们

做到上述即成功了对Fizzler的援引。

2、深入分析网页

     class Proficient 
    {
        /// <summary>
        /// 标题
        /// </summary>
        public string Title
        {
            get; set;
        }
        /// <summary>
        /// 网址
        /// </summary>
        public string Url
        {
            get; set;
        }

        /// <summary>
        /// 最后更新时间
        /// </summary>
        public string Date
        {
            get; set;
        }
    }
using HtmlAgilityPack;
using Fizzler;
using Fizzler.Systems.HtmlAgilityPack;
  • 网页地址:

急需读取的多寡有 标题 和 网站,时间是内需举行测算。题指标功效是去重,网址是输入。但是表格还会有其余剧情,于是随意增多五个属性把他放进去。

以上就足以在CS里实行了引用,

    首先看每生机勃勃页的url变化,阅览后开掘这几个很粗大略:

接下去,如何从一个博客专栏网址读取到最新更新的博客?

上边来开展代码的兑现,

    第生机勃勃页就是:1-0-0恐怕1-0-0-1表示第意气风发页

笔者那边运用 HtmlAgilityPack 扶植剖析网页。

        private static WebDownloader m_wd = new WebDownloader();
        /// <summary>
        /// 获取HTML内容
        /// </summary>
        /// <param name="Url">链接</param>
        /// <param name="Code">字符集</param>
        /// <returns></returns>
        public static string GetHtml(string Url, Encoding Code)
        {
            return m_wd.GetPageByHttpWebRequest(Url, Code);
        }

        public string GetPageByHttpWebRequest(string url, Encoding encoding)
        {
            Stream sr = null;
            StreamReader sReader = null;
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "Get";
                request.Timeout = 30000;

                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                if (response.ContentEncoding.ToLower() == "gzip")//如果使用了GZip则先解压
                {
                    sr = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress);
                }
                else
                {
                    sr = response.GetResponseStream();
                }
                sReader = new StreamReader(sr, encoding);
                return sReader.ReadToEnd();
            }
            catch
            {
                return null;
            }
            finally
            {
                if (sReader != null)
                    sReader.Close();
                if (sr != null)
                    sr.Close();
            }
        }

    第二页就是:1-0-0-2叁次类推

HtmlAgilityPack 是叁个强大的东西,使用的诀即使从nuget寻觅一下,就足以拿走他。

上述即落到实处抓取HTML数据代码,,以上代码基本上也没啥不相同,就是不感到奇抓取数据的点子。

  • 接下来再剖析她的源代码图片 6

安装进去,就足以选用了。

        /// <summary>
        /// 获取相应的标签内容
        /// </summary>
        /// <param name="Url">链接</param>
        /// <param name="CSSLoad">CSS路径</param>
        /// <param name="Code">字符集</param>
        /// <returns></returns>
        public static IEnumerable<HtmlNode> GetUrlInfo(string Url, string CSSLoad, Encoding Code)
        {
            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument
            {
                OptionAddDebuggingAttributes = false,
                OptionAutoCloseOnEnd = true,
                OptionFixNestedTags = true,
                OptionReadEncoding = true
            };

            htmlDoc.LoadHtml(GetHtml(Url, Code));
            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;
        }

很猛烈那生机勃勃页的数码都坐落了ul标签里了,并且还会有类名:<ul class="priceTableRows">,

于是作者写了三个函数 static void GetDate(Proficient proficient)用来读取时间。

        以上八个点子即贯彻对相应路线标签数据的抓取,三个情势是基于U昂科拉L举行抓取,七个是依据HTML内容去抓取相应的数码,上面重视介绍CSSLoad的拿走情势,这几个须要安装火狐浏览器就能够,火狐浏览器必要安装FireBug插件进行查询,如下图(网站工具栏卡塔尔:

接下来再看下ul下的li标签,li标签里的html写的也都同样,然后就能够起来写代码抓取了。

赢得网站:var url = proficient.Url;

图片 7

图片 8

取拿到了网址,就足以收获网页。

再点击像蜘蛛相似的Logo,那样能够观望如下:

3、抓取新闻

获得网页的点子请看代码

图片 9

  • 首先新建三个类公事,来囤积抓取的音讯。因为小编是向来存到数据库用的是ado.net实体数据模型生成的文书。
  • 下边是ado.net实体数据模型生成的文本:
             HtmlWeb web = new HtmlWeb();
            HtmlDocument doc = web.Load(url);

这么能够看见全数的HTML标签,那么随着怎么样去赢得CSS路线呢,那相对来讲就特轻易了。

 

因而查看csdn的代码,可以精晓贮存博客的是 detail_list

图片 10

//------------------------------------------------------------------------------
// <auto-generated>
//     此代码已从模板生成。
//
//     手动更改此文件可能导致应用程序出现意外的行为。
//     如果重新生成代码,将覆盖对此文件的手动更改。
// </auto-generated>
//------------------------------------------------------------------------------

namespace 测试项目1
{
    using System;
    using System.Collections.Generic;

    public partial class C33hao_price
    {
        public long ID { get; set; }
        public string Name { get; set; }
        public string Guige { get; set; }
        public string Shichang { get; set; }
        public decimal Price { get; set; }
        public string Zoushi { get; set; }
        public decimal Zhouzd { get; set; }
        public decimal Yuezd { get; set; }
        public decimal Nianzd { get; set; }
        public int editDate { get; set; }
        public string other { get; set; }
    }
}

图片 11

点击绯红的箭头选拔网址相关的开始和结果,

 

如何从 HtmlAgilityPack 获取钦定的 class ?

图片 12

  • 上面这一个是刚在此以前测量试验存到本地时写的类:
  • using System;

    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 测试项目1
    {
        public class Product
        {
            /// <summary>
            /// 品名
            /// </summary>
            public string Name { get; set; }
            /// <summary>
            /// 规格
            /// </summary>
            public string Guige { get; set; }
            /// <summary>
            /// 市场
            /// </summary>
            public string Shichang { get; set; }
            /// <summary>
            /// 最新价格
            /// </summary>
            public string Price { get; set; }
            /// <summary>
            /// 走势
            /// </summary>
            public string Zoushi { get; set; }
            /// <summary>
            /// 周涨跌
            /// </summary>
            public string Zhouzd { get; set; }
            /// <summary>
            /// 月涨跌
            /// </summary>
            public string Yuezd { get; set; }
            /// <summary>
            /// 年涨跌
            /// </summary>
            public string Nianzt { get; set; }
    
        }
    }
    

    上面是珍视的拍卖代码

  • using System;

    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using HtmlAgilityPack;
    using System.IO;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;
    
    namespace 测试项目1
    {
        public class Program
        {
            /// <summary>
            /// 本地测试信息类
            /// </summary>
            static List<Product> ProductList = new List<Product>();
            /// <summary>
            /// 数据库生成的信息类
            /// </summary>
            static List<C33hao_price> PriceList = new List<C33hao_price>();
            public static void Main(string[] args)
            {
    
                int start = 1;//开始页数
                int end = 10;//结束页数
                Console.WriteLine("请输入开始和结束页数例如1-100,默认为1-10");
                string index = Console.ReadLine();//获取用户输入的页数
    
                if(index != "")
                {
                    //分割页数
                    string[] stt = index.Split('-');
                    start = Int32.Parse(stt[0]);
                    end = Int32.Parse(stt[1]);
                }
                //循环抓取
                for(int i = start; i<= end; i  )
                {
                    string url = string.Format("http://www.zyctd.com/jiage/1-0-0-{0}.html", i);
    

因为有xpath的留存,使用 xpath 就足以钦定 class ,xpath 是和正则大约的东西。

如此相应的HTML近似入选了,这样离大家得到CCS路线更近一步了,紧接着点击右键就可以复制CCS路线就能够。如下:

                HtmlWeb web = new HtmlWeb();
                HtmlDocument doc = web.Load(url);//获取网页

                HtmlNode node = doc.DocumentNode;
                string xpathstring = "//ul[@class='priceTableRows']/li";//路径  
                HtmlNodeCollection aa = node.SelectNodes(xpathstring);//获取每一页ul下的所有li标签里的html
                    if (aa == null)
                    {
                        Console.WriteLine("出错:当前页为{0}", i.ToString());
                        continue;
                    }
                foreach(var item in aa)
                {
                    //处理li标签信息添加到集合
                    string cc = item.InnerHtml;
                    test(cc);

                }
                }
                //写入json并存到本地
                //string path = "json/test.json";
                //using(StreamWriter sw = new StreamWriter(path))
                //{
                //    try
                //    {
                //        JsonSerializer serializer = new JsonSerializer();
                //        serializer.Converters.Add(new JavaScriptDateTimeConverter());
                //        serializer.NullValueHandling = NullValueHandling.Ignore;
                //        //构建Json.net的写入流
                //        JsonWriter writer = new JsonTextWriter(sw);
                //        //把模型数据序列化并写入Json.net的JsonWriter流中  
                //        serializer.Serialize(writer,ProductList);
                //        //ser.Serialize(writer, ht);  
                //        writer.Close();
                //        sw.Close();
                //    }
                //    catch (Exception ex)
                //    {
                //        string error = ex.Message.ToString();
                //        Console.WriteLine(error);
                //    }
                //}
                int count = PriceList.Count();//抓取到的信息条数
                Console.WriteLine("获取信息{0}条", count);
                Console.WriteLine("开始添加到数据库");
                Insert();//插入到数据库
                Console.WriteLine("数据添加完毕");
                Console.ReadLine();
            }
            /// <summary>
            /// 处理信息并添加到集合中
            /// </summary>
            /// <param name="str">li标签的html内容</param>
            static void test(string str)
            {
                //Product product = new Product();
                C33hao_price Price = new C33hao_price();

                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(str);
                HtmlNode node = doc.DocumentNode;
                //获取药材名称
                string namepath = "//span[@class='w1']/a[1]";//名称路径
                HtmlNodeCollection DomNode = node.SelectNodes(namepath);//根据路径获取内容
                //product.Name = DomNode[0].InnerText;
                Price.Name = DomNode[0].InnerText;//将内容添加到对象中
                //获取规格
                string GuigePath = "//span[@class='w2']/a[1]";
                DomNode = node.SelectNodes(GuigePath);
                //product
                Price.Guige = DomNode[0].InnerText;
                //获取市场名称
                string adsPath = "//span[@class='w9']";
                DomNode = node.SelectNodes(adsPath);
                Price.Shichang = DomNode[0].InnerText;
                //获取最新价格
                string pricePath = "//span[@class='w3']";
                DomNode = node.SelectNodes(pricePath);
                Price.Price = decimal.Parse(DomNode[0].InnerText);
                //获取走势
                string zoushiPath = "//span[@class='w4']";
                DomNode = node.SelectNodes(zoushiPath);
                Price.Zoushi = DomNode[0].InnerText;
                //获取周涨跌
                string zhouzdPath = "//span[@class='w5']/em[1]";
                DomNode = node.SelectNodes(zhouzdPath);
                Price.Zhouzd = decimal.Parse(GetZD(DomNode[0].InnerText));
                //获取月涨跌
                string yuezdPath = "//span[@class='w6']/em[1]";
                DomNode = node.SelectNodes(yuezdPath);
                Price.Yuezd = decimal.Parse(GetZD(DomNode[0].InnerText));
                //获取年涨跌
                string nianzdPath = "//span[@class='w7']/em[1]";
                DomNode = node.SelectNodes(nianzdPath);
                Price.Nianzd = decimal.Parse(GetZD(DomNode[0].InnerText));
                //添加时间
                Price.editDate = Int32.Parse(GetTimeStamp());//转换为时间戳格式,方便php使用
                //ProductList.Add(product);
                PriceList.Add(Price);//添加到对象集合
            }

            //查询
            static void Query()
            {
                var context = new mallEntities();
                var member = from e in context.member select e;
                foreach(var u in member)
                {
                    Console.WriteLine(u.member_name);
                    Console.WriteLine(u.member_mobile);
                }
                Console.ReadLine();
            }
            //插入
            static void Insert()
            {
                var context = new mallEntities();
                C33hao_price Price = new C33hao_price();
                int i = 0;
                foreach (C33hao_price item in PriceList)
                {
                    context.C33hao_price.Add(item);
                    context.SaveChanges();
                    i  ;
                    Console.WriteLine("{0}/{1}", i, PriceList.Count);
                }
            }
            /// <summary>  
            /// 获取时间戳  
            /// </summary>  
            /// <returns></returns>  
            public static string GetTimeStamp()
            {
                TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                return Convert.ToInt64(ts.TotalSeconds).ToString();
            }
            /// <summary>
            /// 去除字符串中的百分比
            /// </summary>
            /// <param name="str">处理的字符串</param>
            /// <returns></returns>
            public static string GetZD(string str)
            {
                string st = str.Substring(0, str.Length - 1);
                return st;
            }

        }
    }

关于 xpath ,请看C#抓取网站数据不再是难事了,爬虫获得专栏博客更新排行。 HtmlAgilityPack X帕特h带你搜集数据(以搜罗天气数据为例子) - 数据之巅 - 微博

图片 13

  • 如上代码主若是存到数据库,上边说下怎么存到本地。
  • 4、存款和储蓄到地面

看到detail_list前边是 ul 所以 xpath能够那样写

抓取网站数据不再是难事了,爬虫获得专栏博客更新排行。点击复制CSS路线就足以了,复制出CSS路线如下:

  存款和储蓄到本地只要求把test方法里的Price对象改为Product类型,然后再add到ProductList会集里,再把注释的//写入json并存到地面//方法裁撤注释就好了。

             var temp = doc.DocumentNode.SelectNodes("//ul[@class='detail_list']/li");

html body#Posts form#frmMain table#BodyTable tbody tr td#Body div#Main div#Editor_Edit div#Editor_Edit_Contents div#edit_container div#Editor_Edit_APOptions div#Editor_Edit_APOptions_Contents.Edit div.edit_option div#Editor_Edit_APOptions_Advancedpanel1 div#Editor_Edit_APOptions_Advancedpanel1_Header.subCollapsibleTitle

  • 5、连接到mysql

其中的//不畏从网页任性地方

阅览那风度翩翩串路线别急,我们也不需求把那串路径全体复制到大家前后相继里,否则这样显得太担任了,大家只需求将最终的某个节点放到上边包车型地铁措施里面,大家就能够读取到HTML标签相应的剧情,下边举三个总结例子就进展表明。

  待续。。。。。。。。。。

ul便是标签,内定哪个标签,之后正是标签是不是存在属性,这里钦点属性是 class ,看起来很简短。那么前面的/li正是路径,其实精通四个因素在哪,能够平素用路线来写。

  1 /// <summary>
  2         /// 解析每一条招聘信息
  3         /// </summary>
  4         /// <param name="Url"></param>
  5         private void GetJobInfoFromUrl(object Url)
  6         {
  7             try
  8             {
  9                 JobInfo info = new JobInfo();
 10                 info.Url = Url.ToString();
 11                 //--获取HTML内容
 12                 string html =AnalyzeHTML.GetHtml(Url.ToString(), Encoding.UTF8);
 13                 if (string.IsNullOrEmpty(html)) { return; }
 14                 //--职位名称
 15                 IEnumerable<HtmlNode> NodesMainContent1 = AnalyzeHTML.GetHtmlInfo(html, "div.title-info h1");
 16                 if(NodesMainContent1.Count()>0)
 17                 {
 18                     info.Position = NodesMainContent1.ToArray()[0].InnerText;
 19                 }
 20                 //--公司名称
 21                 IEnumerable<HtmlNode> NodesMainContent2 = AnalyzeHTML.GetHtmlInfo(html, "div.title-info h3");
 22                 if (NodesMainContent2.Count() > 0)
 23                 {
 24                     info.Company = NodesMainContent2.ToArray()[0].InnerText;
 25                 }
 26                 //--公司性质/公司规模
 27                 IEnumerable<HtmlNode> NodesMainContent4 = AnalyzeHTML.GetHtmlInfo(html, "div.content.content-word ul li");
 28                 if (NodesMainContent4.Count() > 0)
 29                 {
 30                     foreach (var item in NodesMainContent4)
 31                     {
 32                         if (item.InnerHtml.Contains("企业性质"))
 33                         {
 34                             string nature = item.InnerText;
 35                             nature = nature.Replace("企业性质:", "");
 36                             info.Nature = nature;
 37                         }
 38                         if (item.InnerHtml.Contains("企业规模"))
 39                         {
 40                             string scale = item.InnerText;
 41                             scale = scale.Replace("企业规模:", "");
 42                             info.Scale = scale;
 43                         }
 44                     }
 45                 }
 46                 else//第二次解析企业性质和企业规模
 47                 {
 48                     IEnumerable<HtmlNode> NodesMainContent4_1 = AnalyzeHTML.GetHtmlInfo(html, "div.right-post-top div.content.content-word");
 49                     if (NodesMainContent4_1.Count() > 0)
 50                     {
 51                         foreach (var item_1 in NodesMainContent4_1)
 52                         {
 53                             string[] arr = item_1.InnerText.Split("rn".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
 54                             if (arr != null && arr.Length > 0)
 55                             {
 56                                 foreach (string str in arr)
 57                                 {
 58                                     if (str.Trim().Contains("性质"))
 59                                     {
 60                                         info.Nature = str.Replace("性质:", "").Trim();
 61                                     }
 62                                     if (str.Trim().Contains("规模"))
 63                                     {
 64                                         info.Scale = str.Replace("规模:", "").Trim();
 65                                     }
 66                                 }
 67                             }
 68                         }
 69                     }
 70                 }
 71                 //--工作经验
 72                 IEnumerable<HtmlNode> NodesMainContent5 = AnalyzeHTML.GetHtmlInfo(html, "div.resume.clearfix span.noborder");
 73                 if (NodesMainContent5.Count() > 0)
 74                 {
 75                     info.Experience = NodesMainContent5.ToArray()[0].InnerText;
 76                 }
 77                 //--公司地址/最低学历
 78                 IEnumerable<HtmlNode> NodesMainContent6 = AnalyzeHTML.GetHtmlInfo(html, "div.resume.clearfix");
 79                 if (NodesMainContent6.Count() > 0)
 80                 {
 81                     foreach (var item in NodesMainContent6)
 82                     {
 83                         string lable = Regex.Replace(item.InnerHtml, "\s", "");
 84                         lable = lable.Replace("", "");
 85                         string[] arr = lable.Split("".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
 86                         if (arr != null && arr.Length > 2)
 87                         {
 88                             info.Address = arr[0];//公司地址
 89                             info.Education = arr[1];//最低学历
 90                         }
 91                     }
 92                 }
 93                 //--月薪
 94                 IEnumerable<HtmlNode> NodesMainContent7 = AnalyzeHTML.GetHtmlInfo(html, "div.job-title-left p.job-main-title");
 95                 if (NodesMainContent7.Count() > 0)
 96                 {
 97                     info.Salary = NodesMainContent7.ToArray()[0].InnerText;
 98                 }
 99                 //--发布时间
100                 IEnumerable<HtmlNode> NodesMainContent8 = AnalyzeHTML.GetHtmlInfo(html, "div.job-title-left p.release-time em");
101                 if (NodesMainContent8.Count() > 0)
102                 {
103                     info.Time = NodesMainContent8.ToArray()[0].InnerText;
104                 }
105                 //--
106                 if (GetJobEnd != null)
107                 {
108                     GetJobEnd("", info);
109                 }
110             }
111             catch (Exception exMsg)
112             {
113                 throw new Exception(exMsg.Message);
114             }
115         }

 

只是自个儿意识,其实找到detail_b更快

       以上这么些主意也是解析某招聘网址标签的内容,但黄金年代度看不到复杂的正则表明式去截取HTML标签了,那样显得代码越发成熟、轻松,再整一个配备页面既可应付抓取网址标签常常变化的难题,那样就显得抓取外人网址数量就是后生可畏件特别轻便的事情了,O(∩_∩)O哈哈~是否啦!!!

下边正是专栏的代码,能够见届期间使用的 class 是detail_b

       以上只表示个人观点!!!如有兴趣一同加QQ群:(186841119卡塔 尔(英语:State of Qatar),出席座谈和读书调换

        <ul class="detail_list">
                <li>
                  <h4><a href="http://blog.csdn.net/lindexi_gd/article/details/52041944" target="_blank">win10 uwp 入门</a></h4>
                  <p class="detail_p">UWP是什么我在这里就不说,本文主要是介绍如何入门UWP,也是合并我写的博客。</p>
                  <div class="detail_b">2016-07-27 08:55
                    <div class="fa fa-eye"></div><em>2752</em>
                  </div>
                </li>

 

于是乎把代码改为

                temp = doc.SelectNodes("//div[@class='detail_b']");

和方面相近,只是这里运用的是div,接下去正是拿届时刻。

去掉html之后的文书正是光阴

于是乎获得第三个的小时便是博客的更新时间了,大概有一点点大神排序不是依照时间排的,然而此地不管理。

怎么样赢得文本?请看代码

                proficient.Date = temp.Elements().FirstOrDefault().InnerText;

如此那般正是获取到了日期了,因为存在部分日子是 昨天 9:00的,作者就没转换了

日期获取成功,正是写入文件,写入的文本很简短,直接放代码

         private static void Write(List<Proficient> proficient)
        {
            string file = "E:\专栏排行\csdn排行100.csv";
            using (StreamWriter stream=new StreamWriter(new FileStream(file,FileMode.Create),Encoding.GetEncoding("gbk")))
            {
                foreach (var temp in proficient)
                {
                    stream.WriteLine(temp.Title "," temp.Url "," temp.Date "," temp.Folpv "," temp.Num);
                }
            }
        }

急需改革的:

接收命令行钦赐读取文件,判别博客最新的日子,不得以行使第生机勃勃篇博客。

去重不能运用博客专栏标题,因为存在双重。

如果我们有写品质高的稿子,想推荐到csdn首页,能够调换自个儿啊……小编会在梦姐前边多多美言

2017 CSDN博客专栏评选

参见:选用HtmlAgilityPack XPath 说明式抓取博客园数据 - 晓风拂月 - 今日头条
Html Agility Pack底工类介绍及应用 - itmuse - 新浪

图片 14
本作品使用文化共享签名-非商业性利用-相仿方法分享 4.0 国际许可左券进行许可。款待转发、使用、重新宣布,但必须要保留小说签字林德熙(包括链接: ),不得用于生意目标,基于本文修正后的创作必得以平等的批准发表。如有任何难题,请与自家联系。

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i ) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:抓取网站数据不再是难事了,爬虫获得专栏博客