C#网络爬虫代码分享 C#简单的爬取工具

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

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

private string GetHttpWebRequest(string url)
    {
      HttpWebResponse result;
      string strHTML = string.Empty;
      try
      {
        Uri uri = new Uri(url);
        WebRequest webReq = WebRequest.Create(uri);
        WebResponse webRes = webReq.GetResponse(); 

        HttpWebRequest myReq = (HttpWebRequest)webReq;
        myReq.UserAgent = "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705";
        myReq.Accept = "*/*";
        myReq.KeepAlive = true;
        myReq.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");
        result = (HttpWebResponse)myReq.GetResponse();
        Stream receviceStream = result.GetResponseStream();
        StreamReader readerOfStream = new StreamReader(receviceStream, System.Text.Encoding.GetEncoding("utf-8"));
        strHTML = readerOfStream.ReadToEnd();
        readerOfStream.Close();
        receviceStream.Close();
        result.Close();
      }
      catch
      {
        Uri uri = new Uri(url);
        WebRequest webReq = WebRequest.Create(uri);
        HttpWebRequest myReq = (HttpWebRequest)webReq;
        myReq.UserAgent = "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705";
        myReq.Accept = "*/*";
        myReq.KeepAlive = true;
        myReq.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");
        //result = (HttpWebResponse)myReq.GetResponse();
        try
        {
          result = (HttpWebResponse)myReq.GetResponse();
        }
        catch (WebException ex)
        {
          result = (HttpWebResponse)ex.Response;
        }
        Stream receviceStream = result.GetResponseStream();
        StreamReader readerOfStream = new StreamReader(receviceStream, System.Text.Encoding.GetEncoding("gb2312"));
        strHTML = readerOfStream.ReadToEnd();
        readerOfStream.Close();
        receviceStream.Close();
        result.Close();
      }
      return strHTML;
    }

这是根据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文件的方法

/// <summary>
    /// // 把网址写入xml文件
    /// </summary>
    /// <param name="strURL"></param>
    /// <param name="alHyperLinks"></param>
    private static void WriteToXml(string strURL, List<string> alHyperLinks)
    {
      XmlTextWriter writer = new XmlTextWriter(@"D:\HyperLinks.xml", Encoding.UTF8);
      writer.Formatting = Formatting.Indented;
      writer.WriteStartDocument(false);
      writer.WriteDocType("HyperLinks", null, "urls.dtd", null);
      writer.WriteComment("提取自" + strURL + "的超链接");
      writer.WriteStartElement("HyperLinks");
      writer.WriteStartElement("HyperLinks", null);
      writer.WriteAttributeString("DateTime", DateTime.Now.ToString());
      foreach (string str in alHyperLinks)
      {
        string title = GetDomain(str);
        string body = str;
        writer.WriteElementString(title, null, body);
      }
      writer.WriteEndElement();
      writer.WriteEndElement();
      writer.Flush();
      writer.Close();
    }
    /// <summary>
    /// 获取网址的域名后缀
    /// </summary>
    /// <param name="strURL"></param>
    /// <returns></returns>
    private static string GetDomain(string strURL)
    {
      string retVal;
      string strRegex = @"(\.com/|\.net/|\.cn/|\.org/|\.gov/)";
      Regex r = new Regex(strRegex, RegexOptions.IgnoreCase);
      Match m = r.Match(strURL);
      retVal = m.ToString();
      strRegex = @"\.|/$";
      retVal = Regex.Replace(retVal, strRegex, "").ToString();
      if (retVal == "")
        retVal = "other";
      return retVal;
    }
/// <summary>
    /// 获取标题
    /// </summary>
    /// <param name="html"></param>
    /// <returns></returns>
    private static string GetTitle(string html)
    {
      string titleFilter = @"<title>[\s\S]*?</title>";
      string h1Filter = @"<h1.*?>.*?</h1>";
      string clearFilter = @"<.*?>"; 

      string title = "";
      Match match = Regex.Match(html, titleFilter, RegexOptions.IgnoreCase);
      if (match.Success)
      {
        title = Regex.Replace(match.Groups[0].Value, clearFilter, "");
      } 

      // 正文的标题一般在h1中,比title中的标题更干净
      match = Regex.Match(html, h1Filter, RegexOptions.IgnoreCase);
      if (match.Success)
      {
        string h1 = Regex.Replace(match.Groups[0].Value, clearFilter, "");
        if (!String.IsNullOrEmpty(h1) && title.StartsWith(h1))
        {
          title = h1;
        }
      }
      return title;
    }

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#简单爬虫案例分享

    本文实例为大家分享了C#简单爬虫案例,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program

  • 基于C#实现网络爬虫 C#抓取网页Html源码

    最近刚完成一个简单的网络爬虫,开始的时候很迷茫,不知道如何入手,后来发现了很多的资料,不过真正能达到我需要,有用的资料--代码很难找.所以我想发这篇文章让一些要做这个功能的朋友少走一些弯路. 首先是抓取Html源码,并选择<ul class="post_list">  </ul>节点的href:要添加using System.IO;using System.Net; private void Search(string url) { string rl; Web

  • 基于C#实现网页爬虫

    本文实例为大家分享了基于C#实现网页爬虫的详细代码,供大家参考,具体内容如下 HTTP请求工具类: 功能: 1.获取网页html 2.下载网络图片 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Form

  • 利用C#实现最基本的小说爬虫示例代码

    前言 作为一个新手,最近在学习C#,自己折腾弄了个简单的小说爬虫,实现了把小说内容爬下来写入txt,还只能爬指定网站. 第一次搞爬虫,涉及到了网络协议,正则表达式,弄得手忙脚乱跑起来效率还差劲,慢慢改吧.下面话不多说了,来一起看看详细的介绍吧. 爬的目标:http://www.166xs.com/xiaoshuo/83/83557/ 一.先写HttpWebRequest把网站扒下来 这里有几个坑,大概说下: 第一个就是记得弄个代理IP爬网站,第一次忘了弄代理然后ip就被封了..... 第二个就是

  • C#制作多线程处理强化版网络爬虫

    上次做了一个帮公司妹子做了爬虫,不是很精致,这次公司项目里要用到,于是有做了一番修改,功能添加了网址图片采集,下载,线程处理界面网址图片下载等. 说说思路:首相获取初始网址的所有内容 在初始网址采集图片 去初始网址采集链接 把采集到的链接放入队列 继续采集图片,然后继续采集链接,无限循环 还是上图片大家看一下, 处理网页内容抓取跟网页网址爬取都做了改进,下面还是大家来看看代码,有不足之处,还请之处! 网页内容抓取HtmlCodeRequest, 网页网址爬取GetHttpLinks,用正则去筛选

  • 利用C#实现网络爬虫

    网络爬虫在信息检索与处理中有很大的作用,是收集网络信息的重要工具. 接下来就介绍一下爬虫的简单实现. 爬虫的工作流程如下 爬虫自指定的URL地址开始下载网络资源,直到该地址和所有子地址的指定资源都下载完毕为止. 下面开始逐步分析爬虫的实现. 1. 待下载集合与已下载集合 为了保存需要下载的URL,同时防止重复下载,我们需要分别用了两个集合来存放将要下载的URL和已经下载的URL. 因为在保存URL的同时需要保存与URL相关的一些其他信息,如深度,所以这里我采用了Dictionary来存放这些UR

  • C#多线程爬虫抓取免费代理IP的示例代码

    这里用到一个HTML解析辅助类:HtmlAgilityPack,如果没有网上找一个增加到库里,这个插件有很多版本,如果你开发环境是使用VS2005就2.0的类库,VS2010就使用4.0,以此类推..........然后直接创建一个控制台应用,将我下面的代码COPY替换就可以运行,下面就来讲讲我两年前做爬虫经历,当时是给一家公司做,也是用的C#,不过当时遇到一个头痛的问题就是抓的图片有病毒,然后系统挂了几次.所以抓网站图片要注意安全,虽然我这里没涉及到图片,但是还是提醒下看文章的朋友. clas

  • C#网络爬虫代码分享 C#简单的爬取工具

    公司编辑妹子需要爬取网页内容,叫我帮忙做了一简单的爬取工具 这是爬取网页内容,像是这对大家来说都是不难得,但是在这里有一些小改动,代码献上,大家参考 private string GetHttpWebRequest(string url) { HttpWebResponse result; string strHTML = string.Empty; try { Uri uri = new Uri(url); WebRequest webReq = WebRequest.Create(uri);

  • java实现一个简单的网络爬虫代码示例

    目前市面上流行的爬虫以python居多,简单了解之后,觉得简单的一些页面的爬虫,主要就是去解析目标页面(html).那么就在想,java有没有用户方便解析html页面呢?找到了一个jsoup包,一个非常方便解析html的工具呢. 使用方式也非常简单,引入jar包: <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.8.

  • Python tornado队列示例-一个并发web爬虫代码分享

    Queue Tornado的tornado.queue模块为基于协程的应用程序实现了一个异步生产者/消费者模式的队列.这与python标准库为多线程环境实现的queue模块类似. 一个协程执行到yieldqueue.get会暂停,直到队列中有条目.如果queue有上限,一个协程执行yieldqueue.put将会暂停,直到队列中有空闲的位置. 在一个queue内部维护了一个未完成任务的引用计数,每调用一次put操作便会增加引用计数,而调用task_done操作将会减少引用计数. 下面是一个简单的

  • Python爬虫实现简单的爬取有道翻译功能示例

    本文实例讲述了Python爬虫实现简单的爬取有道翻译功能.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #!python3 import urllib.request import urllib.parse import json while True : content = input("请输入需要翻译的内容:(按q退出)") if content == 'q' : break url = 'http://fanyi.youdao.com/trans

  • Python爬虫简单运用爬取代理IP的实现

    功能1: 爬取西拉ip代理官网上的代理ip 环境:python3.8+pycharm 库:requests,lxml 浏览器:谷歌 IP地址:http://www.xiladaili.com/gaoni/ 分析网页源码: 选中div元素后右键找到Copy再深入子菜单找到Copy Xpath点击一下就复制到XPath 我们复制下来的Xpth内容为:/html/body/div/div[3]/div[2]/table/tbody/tr[50]/td[1] 虽然可以查出来ip,但不利于程序自动爬取所有

  • Python3爬虫学习之MySQL数据库存储爬取的信息详解

    本文实例讲述了Python3爬虫学习之MySQL数据库存储爬取的信息.分享给大家供大家参考,具体如下: 数据库存储爬取的信息(MySQL) 爬取到的数据为了更好地进行分析利用,而之前将爬取得数据存放在txt文件中后期处理起来会比较麻烦,很不方便,如果数据量比较大的情况下,查找更加麻烦,所以我们通常会把爬取的数据存储到数据库中便于后期分析利用. 这里,数据库选择MySQL,采用pymysql 这个第三方库来处理python和mysql数据库的存取,python连接mysql数据库的配置信息 db_

  • python 爬虫 实现增量去重和定时爬取实例

    前言: 在爬虫过程中,我们可能需要重复的爬取同一个网站,为了避免重复的数据存入我们的数据库中 通过实现增量去重 去解决这一问题 本文还针对了那些需要实时更新的网站 增加了一个定时爬取的功能: 本文作者同开源中国(殊途同归_): 解决思路: 1.获取目标url 2.解析网页 3.存入数据库(增量去重) 4.异常处理 5.实时更新(定时爬取) 下面为数据库的配置 mysql_congif.py: import pymysql def insert_db(db_table, issue, time_s

  • python百行代码实现汉服圈图片爬取

    目录 分析网站 子链接获取 获取标题和图片地址 保存图片 主函数 平时旅游的时候,在旅游景区我们经常可以看到穿各种服饰去拍照的游客,也不会刻意多关注.前两天浏览网页无意看到一个网站,看到穿汉服的女孩是真的很好看.无论是工作需要还是创作文案,把这么漂亮的图片来当作素材都是一个很好的idea.有需要,我们就爬它,爬它,爬它! 话不多说,我们下面详细介绍图片爬取. 分析网站 网址如下: https://www.aihanfu.com/zixun/tushang-1/ 这是第一页的网址,根据观察,第二页

  • Python实现爬取知乎神回复简单爬虫代码分享

    看知乎的时候发现了一个 "如何正确地吐槽" 收藏夹,里面的一些神回复实在很搞笑,但是一页一页地看又有点麻烦,而且每次都要打开网页,于是想如果全部爬下来到一个文件里面,是不是看起来很爽,并且随时可以看到全部的,于是就开始动手了. 工具 1.Python 2.7 2.BeautifulSoup 分析网页 我们先来看看知乎上该网页的情况 网址:,容易看到,网址是有规律的,page慢慢递增,这样就能够实现全部爬取了. 再来看一下我们要爬取的内容: 我们要爬取两个内容:问题和回答,回答仅限于显示

  • 基于Java HttpClient和Htmlparser实现网络爬虫代码

    开发环境的搭建,在工程的 Build Path 中导入下载的Commons-httpClient3.1.Jar,htmllexer.jar 以及 htmlparser.jar 文件. 图 1. 开发环境搭建 HttpClient 基本类库使用 HttpClinet 提供了几个类来支持 HTTP 访问.下面我们通过一些示例代码来熟悉和说明这些类的功能和使用. HttpClient 提供的 HTTP 的访问主要是通过 GetMethod 类和 PostMethod 类来实现的,他们分别对应了 HTT

随机推荐