/// <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[].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 = ; 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")[];
}
} public string Src
{
get
{
string s = GetAttribute("src")[];
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")[].ToLower();
if (!(src.IndexOf("http://") == || src.IndexOf("https://") == ) && _baseUrl.Length > )
{
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('=')[].Replace("\"", "").Replace("'", ""));
}
if (lstAttribute.Count == ) lstAttribute.Add("");
return lstAttribute.ToArray();
} } /// <summary>
/// 取得HTML中所有图片的 URL。
/// </summary>
/// <param name="sHtmlText">HTML代码</param>
/// <returns>图片的URL列表</returns>
public string[] GetHtmlImageUrlList(string sHtmlText)
{
// 定义正则表达式用来匹配 img 标签
Regex regImg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase); // 搜索匹配的字符串
MatchCollection matches = regImg.Matches(sHtmlText);
int i = ;
string[] sUrlList = new string[matches.Count]; // 取得匹配项列表
foreach (Match match in matches)
sUrlList[i++] = match.Groups["imgUrl"].Value;
return sUrlList;
} }

调用的自己设定修改

/// <summary>
/// 一键下载
/// </summary>
/// <param name="url">url地址</param>
/// <returns></returns>
[HttpPost]
public ActionResult ImgDow(string url)
{
//System.Drawing.Bitmap img = null;
HttpWebRequest req;
HttpWebResponse res = null;
try
{
Common.WebPageImage model = new WebPageImage();
string v = model.getImages(url, "");
string[] Arrt = model.GetHtmlImageUrlList(v);
foreach (var item in Arrt)
{
string[] file = item.Split('/');
if(file.Count()>)
{
//string name = string.IsNullOrEmpty(System.IO.Path.GetFileName(file[0])) ? DateTime.Now.ToFileTime().ToString() : System.IO.Path.GetFileName(file[0]);
//System.Uri httpUrl = new System.Uri(item);
//req = (HttpWebRequest)(WebRequest.Create(httpUrl));
//req.Timeout = 180000; //设置超时值10秒
//req.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
//req.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
//req.Method = "GET";
//res = (HttpWebResponse)(req.GetResponse());
//Stream strea = res.GetResponseStream();
//img = new Bitmap(strea);//获取图片流
//string[] imgGS = file[3].Split('_');
//switch (imgGS[1])
//{
// case "gif":
// img.Save(@"E:/" + DateTime.Now.ToFileTime().ToString() + ".gif", ImageFormat.Gif);
// break;
// case "jpg":
// img.Save(@"E:/" + DateTime.Now.ToFileTime().ToString() + ".jpg");
// break;
// case "png":
// img.Save(@"E:/" + DateTime.Now.ToFileTime().ToString() + ".png");
// break;
// default:
// img.Save(@"E:/" + DateTime.Now.ToFileTime().ToString() + ".jpg");
// break;
//}
WebClient my = new WebClient();
byte[] mybyte;
mybyte = my.DownloadData(item);
MemoryStream ms = new MemoryStream(mybyte);
System.Drawing.Image img;
img = System.Drawing.Image.FromStream(ms);
img.Save(@"E:/" + DateTime.Now.ToFileTime().ToString() + ".gif", ImageFormat.Gif); //保存
System.Threading.Thread.Sleep();
}
} return WriteSuccess("");
}
catch (Exception ex)
{
return WriteError(ex.Message);
}
finally
{
//res.Close();
}
}

asp.net mvc抓取微信文章里面所有的图片的更多相关文章

  1. asp.net MVC 抓取微信文章数据(正文)

    1.抓微信的正文主要是调用第三方的接口(https://market.aliyun.com/products/56928004/cmapi012134.html) using Newtonsoft.J ...

  2. asp.net mvc 抓取京东商城分类

    555 asp.net mvc 抓取京东商城分类   URL:http://www.jd.com/allSort.aspx   效果:   //后台代码 public ActionResult Get ...

  3. [Python爬虫] 之十五:Selenium +phantomjs根据微信公众号抓取微信文章

    借助搜索微信搜索引擎进行抓取 抓取过程 1.首先在搜狗的微信搜索页面测试一下,这样能够让我们的思路更加清晰 在搜索引擎上使用微信公众号英文名进行“搜公众号”操作(因为公众号英文名是公众号唯一的,而中文 ...

  4. 使用redis所维护的代理池抓取微信文章

    搜狗搜索可以直接搜索微信文章,本次就是利用搜狗搜搜出微信文章,获得详细的文章url来得到文章的信息.并把我们感兴趣的内容存入到mongodb中. 因为搜狗搜索微信文章的反爬虫比较强,经常封IP,所以要 ...

  5. 如何利用Python网络爬虫抓取微信朋友圈的动态(上)

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  6. 利用Python网络爬虫抓取微信好友的签名及其可视化展示

    前几天给大家分享了如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化,利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,以及利用Python网络爬虫抓取微信好友的所 ...

  7. 利用Python网络爬虫抓取微信好友的所在省位和城市分布及其可视化

    前几天给大家分享了如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,感兴趣的小伙伴可以点击链接进行查看.今天小编给大家介绍如何利用Python网络爬虫抓取微信好友的省位和城市,并且将 ...

  8. 如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例

    前几天给大家分享了利用Python网络爬虫抓取微信朋友圈的动态(上)和利用Python网络爬虫爬取微信朋友圈动态——附代码(下),并且对抓取到的数据进行了Python词云和wordart可视化,感兴趣 ...

  9. Asp.Net 之 抓取网页内容

    一.获取网页内容——html ASP.NET 中抓取网页内容是非常方便的,而其中更是解决了 ASP 中困扰我们的编码问题. 需要三个类:WebRequest.WebResponse.StreamRea ...

随机推荐

  1. meshing-simple_block

    原视频下载地址:https://yunpan.cn/cqjeSzP7s93Pc  访问密码 aaff

  2. @AUTORELEASEPOOL

    Swift 在内存管理上使用的是自动引用计数 (ARC) 的一套方法,在 ARC 中虽然不需要手动地调用像是 retain,release 或者是 autorelease 这样的方法来管理引用计数,但 ...

  3. 编程微语 2019-Autumn

    很多时候我们要的是[网页全屏],可是许多软件却做成了[浏览器全屏],不要一听到[全屏]就认为真的是传统意义上的全屏.拜托,老板(往往就是最大的产品经理).产品经理.程序员,想想,说清楚,做正确.某度文 ...

  4. 系统调优:如何解决系统报错too many open files

    一.检查系统版本是否手工升级 关于lsb_release -a和/etc/issue显示的发行版本号不同,原因只有一个:系统内核手动升级了 对于高并发高http连接的应用程序例如www或Java,会遇 ...

  5. 实现一个简单的Tomcat

    实现一个简单的Tomcat 1. Tomcat作用 我们的web应用会运行在Tomcat中,那么显然请求必定是先到达Tomcat的,Tomcat对于请求实际上会进行如下的处理: 提供Socket服务: ...

  6. Spring tools

    sts是什么? sts是spring tool suite的缩写,是基于eclipse的.开发spring应用的定制的开发环境. 提供了什么? 实现.调试.运行.部署spring应用的现成的环境.包括 ...

  7. IIS URL Rewriting and ASP.NET Routing

    IIS URL Rewriting and ASP.NET Routing With the release of the URL Rewrite Module for IIS and the inc ...

  8. C# GDI+ 简单实现图片写文字和图片叠加(水印)(转)

    using System; using System.Collections; using System.Configuration; using System.Data; using System. ...

  9. decimal赋值

    decimal dRebate1 = new decimal(1);decimal dRebate2 = Convert.ToDecimal(1);decimal dRebate3 = 1M; htt ...

  10. 算法习题---3.12浮点数(UVa11809)

    一:题目 尴尬的非会员水印 二:题目摘要 1.int和float比较 int共32位,可以表示的最大的数为2^32次方 float虽然也是32位,但是是以指数形式保存,指数占8位(含符号),最大127 ...