asp.net采集页面上所有图像图片资源的具体方法

有时我们需要采集一些信息到自己的数据库,本地磁盘,我们经常使用的是WebClient,WebRequest等等,今天主要说一下,对于一个URI地址,采集这个页面上所有的图像资源,下面是源代码,供大家参考,学习。

/// <summary>
  /// 下载指定URL下的所有图片
  /// </summary>
  public class WebPageImage
  {
    /// <summary>
    /// 获取网页中全部图片
    /// </summary>
    /// <param name="url">网页地址</param>
    /// <param name="charSet">网页编码,为空自动判断</param>
    /// <returns>全部图片显示代码</returns>
    public string getImages(string url, string charSet)
    {
      string s = getHtml(url, charSet);
      return getPictures(s, url);
    }

    /// <summary>
    /// 获取网页中全部图片
    /// </summary>
    /// <param name="url">网址</param>
    /// <returns>全部图片代码</returns>
    public string getImages(string url)
    {
      return getImages(url, "");
    }

    string doman(string url)
    {
      Uri u = new Uri(url);
      return u.Host;
    }

    /// <summary>
    /// 获取网页内容
    /// </summary>
    /// <param name="url">网站地址</param>
    /// <param name="charSet">目标网页的编码,如果传入的是null或者"",那就自动分析网页的编码 </param>
    /// <returns></returns>
    string getHtml(string url, string charSet)
    {
      WebClient myWebClient = new WebClient();
      //创建WebClient实例myWebClient
      // 需要注意的:
      //有的网页可能下不下来,有种种原因比如需要cookie,编码问题等等
      //这是就要具体问题具体分析比如在头部加入cookie
      // webclient.Headers.Add("Cookie", cookie);
      //这样可能需要一些重载方法。根据需要写就可以了 

      //获取或设置用于对向 Internet 资源的请求进行身份验证的网络凭据。
      myWebClient.Credentials = CredentialCache.DefaultCredentials;
      //如果服务器要验证用户名,密码
      //NetworkCredential mycred = new NetworkCredential(struser, strpassword);
      //myWebClient.Credentials = mycred;
      //从资源下载数据并返回字节数组。(加@是因为网址中间有"/"符号)
      byte[] myDataBuffer = myWebClient.DownloadData(url);
      string strWebData = Encoding.Default.GetString(myDataBuffer);

      //获取网页字符编码描述信息
      Match charSetMatch = Regex.Match(strWebData, "<meta([^<]*)charset=([^<]*)\"", RegexOptions.IgnoreCase | RegexOptions.Multiline);
      string webCharSet = charSetMatch.Groups[2].Value.Replace("\"", "");
      if (charSet == null || charSet == "")
        charSet = webCharSet;

      if (charSet != null && charSet != "" && Encoding.GetEncoding(charSet) != Encoding.Default)
        strWebData = Encoding.GetEncoding(charSet).GetString(myDataBuffer);
      return strWebData;
    }

    string getPictures(string data, string url)
    {
      MatchCollection ps = Regex.Matches(data, @"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>");
      string s = string.Empty;
      for (int i = 0; i < ps.Count; i++)
      {
        pictures p = new pictures(ps[i].Value, url);
        s += p.GetHtml + "<br />" + Environment.NewLine;
      }
      return s;
    }

    /// <summary>
    /// 图片实体
    /// 图片文件属性处理类
    /// </summary>
    public class pictures
    {
      public pictures(string strHtml, string baseUrl)
      {
        _html = strHtml;
        Uri u1 = new Uri(baseUrl);
        _doman = u1.Host;
        _baseUrl = u1.Scheme + "://" + _doman;
        setSrc();
      }

      private string _html = string.Empty;
      private string _baseUrl = string.Empty;
      private string _doman = string.Empty;

      public string GetHtml
      {
        get { return _html; }
      }

      public string Alt
      {
        get
        {
          return GetAttribute("alt")[0];
        }
      }

      public string Src
      {
        get
        {
          string s = GetAttribute("src")[0];
          return s;
        }
      }

      /// <summary>
      /// 根据基路径把相对路径转换成绝对径
      /// </summary>
      /// <param name="baseUrl">基础路径</param>
      /// <param name="u">待转换的相对路径</param>
      /// <returns>绝对路径</returns>
      public string absUrl(string baseUrl, string u)
      {
        Uri ub = new Uri(baseUrl);
        Uri ua = new Uri(ub, u);
        return ua.AbsoluteUri;
      }

      private void setSrc()
      {
        string strPattern = @"src[\s\t\r\n]*=[\s\t\r\n]*[""']?\S+[""']?";
        string src = GetAttribute("src")[0].ToLower();
        if (!(src.IndexOf("http://") == 0 || src.IndexOf("https://") == 0) && _baseUrl.Length > 10)
        {
          src = absUrl(_baseUrl, src);
          string s = "src=\"" + src + "\"";
          _html = Regex.Replace(_html, strPattern, s);
        }
      }

      /// <summary>
      /// 获取HTML代码中标签属性
      /// </summary>
      /// <param name="strHtml">HTML代码</param>
      /// <param name="strAttributeName">属性名称</param>
      /// <returns>属性值集合</returns>
      private string[] GetAttribute(string strAttributeName)
      {
        List<string> lstAttribute = new List<string>();
        string strPattern = string.Format(
          @"{0}[\s\t\r\n]*=[\s\t\r\n]*[""']?\S+[""']?",
          strAttributeName
          );
        MatchCollection matchs = Regex.Matches(_html, strPattern, RegexOptions.IgnoreCase);
        foreach (Match m in matchs)
        {
          lstAttribute.Add(m.Value.Split('=')[1].Replace("\"", "").Replace("'", ""));
        }
        if (lstAttribute.Count == 0) lstAttribute.Add("");
        return lstAttribute.ToArray();
      }
    }
  }

调用:

new WebPageImage().getImages(http://www.sina.com)

结果:

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

(0)

相关推荐

  • asp.net c#采集需要登录页面的实现原理及代码

    首先说明:代码片段是从网络获取,然后自己修改.我想好的东西应该拿来分享. 实现原理:当我们采集页面的时候,如果被采集的网站需要登录才能采集.不管是基于Cookie还是基于Session,我们都会首先发送一个Http请求头,这个Http请求头里面就包含了网站需要的Cookie信息.当网站接收到发送过来的Http请求头时,会从Http请求头获取相关的Cookie或者Session信息,然后由程序来处理,决定你是否有权限访问当前页面. 好了,原理搞清楚了,就好办了.我们所要做的仅仅是在采集的时候(或者

  • PHP远程采集图片详细教程

    当我们需要采集网络上的某个网页内容时,如果目标网站上的图片做了防盗链的话,我们直接采集过来的图片在自己网站上是不可用的.那么我们使用程序将目标网站上的图片下载到我们网站服务器上,然后就可调用图片了. 本文将使用PHP实现采集远程图片功能.基本流程: 1.获取目标网站图片地址. 2.读取图片内容. 3.创建要保存图片的路径并命名图片名称. 4.写入图片内容. 5.完成. 我们通过写几个函数来实现这一过程. 函数make_dir()建立目录.判断要保存的图片文件目录是否存在,如果不存在则创建目录,并

  • asp.net采集网页图片的具体方法

    在网上找了下大多都是通过字符串操作找出img标签,这种方式操作起来比较麻烦,而且代码看起来比较累.这里我用的方法是通过WebBrowser来加载一个页面,然后HTMLDocument类来操作省去了字符串操作的步骤,直接调用GetElementsByTagName把所有图片地址返回到一个HtmlElementCollection对象里.代码如下: 复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;u

  • 利用MSXML2.XmlHttp和Adodb.Stream采集图片

    利用MSXML2.XmlHttp和Adodb.Stream 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml">  <

  • asp.net(c#)做一个网页数据采集工具

    通过这个软件一两天就完成了几千产品数据的录入,可见很多工作不是一味用人工去做,作为一个程序员,就是要让很多让那些经常做重复性的.繁琐的工作中的人解放出来.下面只是写了一些核心代码,而且采集必须要和对应网站相挂钩,作者:郑少群 复制代码 代码如下: //提取产品列表页中产品最终页的网页 private void button1_Click(object sender, EventArgs e) { if (textBox1.Text.Trim() == "" || textBox2.Te

  • asp.net采集页面上所有图像图片资源的具体方法

    有时我们需要采集一些信息到自己的数据库,本地磁盘,我们经常使用的是WebClient,WebRequest等等,今天主要说一下,对于一个URI地址,采集这个页面上所有的图像资源,下面是源代码,供大家参考,学习. /// <summary> /// 下载指定URL下的所有图片 /// </summary> public class WebPageImage { /// <summary> /// 获取网页中全部图片 /// </summary> /// <

  • 使用CamanJS在Web页面上处理图像的技巧

    你可能会想问既然CSS已经有现成的功能可以支持基础的图像操作了,为什么我们还会想要为此使用一个像这样的 JavaScript 库呢. 好吧,除了有浏览器的支持,使用 CamanJS 有许多的好处.它为我们操作图像提供了更多的过滤器和选项.你可以在你的图像中创建高级过滤器,进而控制其中的每一个像素.你可以使用其内置的混合模式和图层系统.而它也能让你进行图像的跨域操作,并可以对操作产生的图像进行保存. 现在,就让我们来开始探索 CamanJS 所提供的特性吧! 引入必要的文件 要开始使用 Caman

  • JavaScript实现自动对页面上敏感词进行屏蔽的方法

    本文实例讲述了JavaScript实现自动对页面上敏感词进行屏蔽的方法.分享给大家供大家参考.具体如下: <html> <head> <title>Bad Words Example</title> <script type="text/javascript"> function filterText(sText) { var reBadWords = /badword|anotherbadword/gi; return sT

  • JS禁用页面上所有控件的实现方法(附demo源码下载)

    本文实例讲述了JS禁用页面上所有控件的实现方法.分享给大家供大家参考,具体如下: 利用页面元素的特征,可以捕捉到所有元素. function DisableElements(container,blnHidenButton) { if (!container) return; var aEle; if (navigator.appName =="Microsoft Internet Explorer") //IE { for (var i=0;i<container.all.le

  • ASP.NET在IIS上注册报0x800702e4错误解决方法

    1.--404.3 not found 2.-- 关于asp.net2.0在iis下的注册问题,因为我的win7是后装的iis,而.framework2.0则是跟着vs2005一起早就装好的,这 个时候需要手动注册一下.framework2.0,方法如下:在xp下,在"运行"里面执行一下x:\Windows\Microsoft.NET \Framework\v2.0.50727\aspnet_regiis.exe –i就行了,但在win7下,会报一个"0x800702e4 请

  • asp.net 将图片上传到mysql数据库的方法

    这是页面上的按钮单击事件 复制代码 代码如下: protected void Button1_Click(object sender, EventArgs e) { string tid = Utils.getRandom(32); Stream mystream = this.FileUpload1.PostedFile.InputStream; int length = this.FileUpload1.PostedFile.ContentLength; byte[] pic = new b

  • php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法

    date.csv:"ID" "NAME" "EMAIL""1" "小明" "xm@163.com""2" "小东" "xd@sina.com""3" "小少" "shaozi@hotmai.com" 读取这个csv文件 复制代码 代码如下: <?php$handl

  • ASP.Net刷新页面后自动滚动到原来位置方法汇总

    在网上搜索之后总结了三种方式: 1.设置Page中的MaintainScrollPositionOnPostback属性为true A>.页面里有MaintainScrollPositionOnPostback,默认是false,设为true即可(页面级) 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"  Mai

  • Asp.net在IIS上运行不了的解决方法

    1..NET 安装的顺序应该是先装IIS,再装VS.NET,如果次序反了,或者IIS重装了,就需要使用aspnet_regiis.exe -i来重新安装IIS Mapping(主要用于aspx, asmx等文 件的Extention的匹配).在C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705目录下,运行下面的命令:aspnet_regiis.exe -i. 2.重设ASP.NET的密码,然后在下面的目录中找到Machine.config文件:%System

  • JavaScript获取页面上被选中文字的方法技巧

    这里介绍的一个小技巧是如何用JavaScript获取页面上被选中的文字的方法.最关键的JavaScript API是: 复制代码 代码如下: event.selection = window.getSelection(); 这里的selection实际上是个对象,但如果我们使用 .toString()或强行转化成字符串,我们将得到被选中的文字. 复制代码 代码如下: $(document).ready(function () {    $(".contenttext").mouseup

随机推荐