C#网络爬虫

公司编辑妹子需要爬取网页内容,叫我帮忙做了一简单的爬取工具

这是爬取网页内容,像是这对大家来说都是不难得,但是在这里有一些小改动,代码献上,大家参考

 1 private string GetHttpWebRequest(string url)
 2        {
 3            HttpWebResponse result;
 4            string strHTML = string.Empty;
 5            try
 6            {
 7                Uri uri = new Uri(url);
 8                WebRequest webReq = WebRequest.Create(uri);
 9                WebResponse webRes = webReq.GetResponse();
10
11                HttpWebRequest myReq = (HttpWebRequest)webReq;
12                myReq.UserAgent = "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705";
13                myReq.Accept = "*/*";
14                myReq.KeepAlive = true;
15                myReq.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");
16                result = (HttpWebResponse)myReq.GetResponse();
17                Stream receviceStream = result.GetResponseStream();
18                StreamReader readerOfStream = new StreamReader(receviceStream, System.Text.Encoding.GetEncoding("utf-8"));
19                strHTML = readerOfStream.ReadToEnd();
20                readerOfStream.Close();
21                receviceStream.Close();
22                result.Close();
23            }
24            catch
25            {
26                Uri uri = new Uri(url);
27                WebRequest webReq = WebRequest.Create(uri);
28                HttpWebRequest myReq = (HttpWebRequest)webReq;
29                myReq.UserAgent = "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705";
30                myReq.Accept = "*/*";
31                myReq.KeepAlive = true;
32                myReq.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");
33                //result = (HttpWebResponse)myReq.GetResponse();
34                try
35                {
36                    result = (HttpWebResponse)myReq.GetResponse();
37                }
38                catch (WebException ex)
39                {
40                    result = (HttpWebResponse)ex.Response;
41                }
42                Stream receviceStream = result.GetResponseStream();
43                StreamReader readerOfStream = new StreamReader(receviceStream, System.Text.Encoding.GetEncoding("gb2312"));
44                strHTML = readerOfStream.ReadToEnd();
45                readerOfStream.Close();
46                receviceStream.Close();
47                result.Close();
48            }
49            return strHTML;
50        }  

  这是根据url爬取网页远吗,有一些小改动,很多网页有不同的编码格式,甚至有些网站做了反爬取的防范,这个方法经过能够改动也能爬去

以下是爬取网页所有的网址链接

/// <summary>
        /// 提取HTML代码中的网址
        /// </summary>
        /// <param name="htmlCode"></param>
        /// <returns></returns>
        private static List<string> GetHyperLinks(string htmlCode, string url)
        {
            ArrayList al = new ArrayList();
            bool IsGenxin = false;
            StringBuilder weburlSB = new StringBuilder();//SQL
            StringBuilder linkSb = new StringBuilder();//展示数据
            List<string> Weburllistzx = new List<string>();//新增
            List<string> Weburllist = new List<string>();//旧的
            string ProductionContent = htmlCode;
            Regex reg = new Regex(@"http(s)?://([\w-]+\.)+[\w-]+/?");
            string wangzhanyuming = reg.Match(url, 0).Value;
            MatchCollection mc = Regex.Matches(ProductionContent.Replace("href=\"/", "href=\"" + wangzhanyuming).Replace("href=‘/", "href=‘" + wangzhanyuming).Replace("href=/", "href=" + wangzhanyuming).Replace("href=\"./", "href=\"" + wangzhanyuming), @"<[aA][^>]* href=[^>]*>", RegexOptions.Singleline);
            int Index = 1;
            foreach (Match m in mc)
            {
                MatchCollection mc1 = Regex.Matches(m.Value, @"[a-zA-z]+://[^\s]*", RegexOptions.Singleline);
                if (mc1.Count > 0)
                {
                    foreach (Match m1 in mc1)
                    {
                        string linkurlstr = string.Empty;
                        linkurlstr = m1.Value.Replace("\"", "").Replace("‘", "").Replace(">", "").Replace(";", "");
                        weburlSB.Append("$-$");
                        weburlSB.Append(linkurlstr);
                        weburlSB.Append("$_$");
                        if (!Weburllist.Contains(linkurlstr) && !Weburllistzx.Contains(linkurlstr))
                        {
                            IsGenxin = true;
                            Weburllistzx.Add(linkurlstr);
                            linkSb.AppendFormat("{0}<br/>", linkurlstr);
                        }
                    }
                }
                else
                {
                    if (m.Value.IndexOf("javascript") == -1)
                    {
                        string amstr = string.Empty;
                        string wangzhanxiangduilujin = string.Empty;
                        wangzhanxiangduilujin = url.Substring(0, url.LastIndexOf("/") + 1);
                        amstr = m.Value.Replace("href=\"", "href=\"" + wangzhanxiangduilujin).Replace("href=‘", "href=‘" + wangzhanxiangduilujin);
                        MatchCollection mc11 = Regex.Matches(amstr, @"[a-zA-z]+://[^\s]*", RegexOptions.Singleline);
                        foreach (Match m1 in mc11)
                        {
                            string linkurlstr = string.Empty;
                            linkurlstr = m1.Value.Replace("\"", "").Replace("‘", "").Replace(">", "").Replace(";", "");
                            weburlSB.Append("$-$");
                            weburlSB.Append(linkurlstr);
                            weburlSB.Append("$_$");
                            if (!Weburllist.Contains(linkurlstr) && !Weburllistzx.Contains(linkurlstr))
                            {
                                IsGenxin = true;
                                Weburllistzx.Add(linkurlstr);
                                linkSb.AppendFormat("{0}<br/>", linkurlstr);
                            }
                        }
                    }
                }
                Index++;
            }
            return Weburllistzx;
        }  

这块的技术其实就是简单的使用了正则去匹配!接下来献上获取标题,以及存储到xml文件的方法

 1 /// <summary>
 2         /// // 把网址写入xml文件
 3         /// </summary>
 4         /// <param name="strURL"></param>
 5         /// <param name="alHyperLinks"></param>
 6         private static void WriteToXml(string strURL, List<string> alHyperLinks)
 7         {
 8             XmlTextWriter writer = new XmlTextWriter(@"D:\HyperLinks.xml", Encoding.UTF8);
 9             writer.Formatting = Formatting.Indented;
10             writer.WriteStartDocument(false);
11             writer.WriteDocType("HyperLinks", null, "urls.dtd", null);
12             writer.WriteComment("提取自" + strURL + "的超链接");
13             writer.WriteStartElement("HyperLinks");
14             writer.WriteStartElement("HyperLinks", null);
15             writer.WriteAttributeString("DateTime", DateTime.Now.ToString());
16             foreach (string str in alHyperLinks)
17             {
18                 string title = GetDomain(str);
19                 string body = str;
20                 writer.WriteElementString(title, null, body);
21             }
22             writer.WriteEndElement();
23             writer.WriteEndElement();
24             writer.Flush();
25             writer.Close();
26         }
27         /// <summary>
28         /// 获取网址的域名后缀
29         /// </summary>
30         /// <param name="strURL"></param>
31         /// <returns></returns>
32         private static string GetDomain(string strURL)
33         {
34             string retVal;
35             string strRegex = @"(\.com/|\.net/|\.cn/|\.org/|\.gov/)";
36             Regex r = new Regex(strRegex, RegexOptions.IgnoreCase);
37             Match m = r.Match(strURL);
38             retVal = m.ToString();
39             strRegex = @"\.|/$";
40             retVal = Regex.Replace(retVal, strRegex, "").ToString();
41             if (retVal == "")
42                 retVal = "other";
43             return retVal;
44         }
45 /// <summary>
46         /// 获取标题
47         /// </summary>
48         /// <param name="html"></param>
49         /// <returns></returns>
50         private static string GetTitle(string html)
51         {
52             string titleFilter = @"<title>[\s\S]*?</title>";
53             string h1Filter = @"<h1.*?>.*?</h1>";
54             string clearFilter = @"<.*?>";
55
56             string title = "";
57             Match match = Regex.Match(html, titleFilter, RegexOptions.IgnoreCase);
58             if (match.Success)
59             {
60                 title = Regex.Replace(match.Groups[0].Value, clearFilter, "");
61             }
62
63             // 正文的标题一般在h1中,比title中的标题更干净
64             match = Regex.Match(html, h1Filter, RegexOptions.IgnoreCase);
65             if (match.Success)
66             {
67                 string h1 = Regex.Replace(match.Groups[0].Value, clearFilter, "");
68                 if (!String.IsNullOrEmpty(h1) && title.StartsWith(h1))
69                 {
70                     title = h1;
71                 }
72             }
73             return title;
74         }  

这就是所用的全部方法,还是有很多需要改进之处!大家如果有发现不足之处还请指出,谢谢!

源码送上:http://download.csdn.net/detail/nightmareyan/9584256

时间: 2024-10-13 22:47:38

C#网络爬虫的相关文章

简谈-网络爬虫的几种常见类型

众所周知,网络爬虫(或称为网络爬虫.网络蜘蛛.机器人)是搜索引擎最上游的一个模块,是负责搜索引擎内容索引的第一关. 很多人为了提高自己网站的索引量,都是去网上随便找一些爬虫工具来使用.但是很多人不知道,这些抓取网站的小爬虫是有各种各样的不同性格的. 常见的优秀网络爬虫有以下几种类型: 1.批量型网络爬虫:限制抓取的属性,包括抓取范围.特定目标.限制抓取时间.限制数据量以及限制抓取页面,总之明显的特征就是受限: 2.增量型网络爬虫(通用爬虫):与前者相反,没有固定的限制,无休无止直到抓完所有数据.

[No000090]微信公众号网络爬虫接口分析1

一直想做个公众号的网络爬虫,网上的好多接口都依赖于"瘦狗",不过微信接口一直在变,现在"瘦狗"也只允许查看10条历史记录,所以今天趁着下雨,研究了一下apk内部的东西,但是怕微信又改,我透漏的不能太多,有兴趣可以私下交流. 从微信上复制出来的url:https://mp.weixin.qq.com/mp/getmasssendmsg?__biz=MzI4OTA5MDgxNw==#wechat_webview_type=1&wechat_redirect 用浏

基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎

网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并提供了大量的配置定制选项.由于网络爬虫只负责网络资源的抓取,所以,需要一个分布式搜索引擎,用来对网络爬虫抓取到的网络资源进行实时的索引和搜索. 搜 索引擎架构在ElasticSearch之上,是一个典型的分布式在线实时交互查询架构,无单点故障,高伸缩.高可用.对大量信息的索引与搜索都可以在近 乎实时的情况下完成,能够快速实时搜索数十亿的文件以及PB级的数据,同时提供了全方面的选项,可以对

网络爬虫技术入门_Python基础与爬虫技术

Python基础与爬虫技术  课程学习地址:http://www.xuetuwuyou.com/course/195 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本作为一种便捷地收集网上信息并从中抽取出可用信息的方式,网络爬虫技术变得越来越有用.使用Python这样的简单编程语言,你可以使用少量编程技能就可以爬取复杂的网站. <Python 基础与爬虫技术>讲解了从静态页面爬取数据的方法以及使用缓存来管理服务器负载的方法.此外,本课程还介绍了如何使用AJA

网络爬虫小案例_2017/3/10

今晚,了解了一下网络爬虫,那么什么是网络爬虫呢? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常被称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本,已被广泛应用于互联网领域.搜索引擎使用网络爬虫抓取Web网页.文档甚至图片.音频.视频等资源,通过相应的索引技术组织这些信息,提供给搜索用户进行查询.网络爬虫也为中小站点的推广提供了有效的途径,网站针对搜索引擎爬虫的优化曾风靡一时. 网络爬虫的基本工作流程如下:     1.首先选取一部分精心挑选的种子U

使用网络爬虫的一丝心得

因为参与了创新计划,所以懵懵懂懂的接触到了网络爬虫. 爬数据使用工具,因此了解到Python.asp.net等可以用来抓数据. 想想在学习.net的时候根本没有想到会使用在这个上面--书本上的知识都是死的,那学习的基础知识只能通过不断的拓展使用领域才能在更好的得到深化.应用! 进入一个陌生的领域,从入门到精通的路真的是需要用汗水积累起来的--没有真正的天才,只有自感聪明的蠢材.(自我审视) 有句话说的特别的好:"世界上两种聪明的人:一种是从来不认为自己聪明的聪明人:而另一种是自以为自己很聪明的'

网络爬虫之selenium(综述)

   现阶段网络爬虫的工具主要是有scrapy.selenium(第二版)等.总的来说各有好处,scrapy最大 的好处是爬取的速度快而selenium的好处是能爬去的网站种类多.详细点的解释是:scrapy在爬取网页时不 用点击开页面(selenium似乎需要页面全部加载完才可以查找定位),selenium可以爬取动态网页和静态网页 (模拟浏器操作)而scrapy可以很顺利的爬取静态网页(但是很难或者不能爬取动态网页).由于爬取知网 的需要,本人学习了selenium,现分享一下个人的心得(如

下载大数据实战课程第一季Python基础和网络爬虫数据分析

python语言近年来越来越被程序相关人员喜欢和使用,因为其不仅简单容易学习和掌握,而且还有丰富的第三方程序库和相应完善的管理工具:从命令行脚本程序到gui程序,从B/S到C/S,从图形技术到科学计算,软件开发到自动化测试,从云计算到虚拟化,所有这些领域都有python的身影:python已经深入到程序开发的各个领域,并且会越来越多的人学习和使用. 大数据实战课程第一季Python基础和网络爬虫数据分析,刚刚入手,转一注册文件,视频的确不错,可以先下载看看:链接:http://pan.baidu

网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息及ISBN码

这一篇首先从allitebooks.com里抓取书籍列表的书籍信息和每本书对应的ISBN码. 一.分析需求和网站结构 allitebooks.com这个网站的结构很简单,分页+书籍列表+书籍详情页. 要想得到书籍的详细信息和ISBN码,我们需要遍历所有的页码,进入到书籍列表,然后从书籍列表进入到每本书的详情页里,这样就能够抓取详情信息和ISBN码了. 二.从分页里遍历每一页书籍列表 通过查看分页功能的HTML代码,通过class="current"可以定位当前页码所在span标签,此s

网络爬虫

网络爬虫 概述 这是一个网络爬虫学习的技术分享,主要通过一些实际的案例对爬虫的原理进行分析,达到对爬虫有个基本的认识,并且能够根据自己的需要爬到想要的数据.有了数据后可以做数据分析或者通过其他方式重新结构化展示. 什么是网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫.via 百度百科网络爬虫网络蜘蛛(Web spider)也叫网络爬