导入的新浪博客中的图片地址链接到新浪网址,而在别的站点看新浪博客图片无法正常显示.为了解决这个问题,就要想办法将图片抓取到本地.
在Asp.net中抓取网络上的图片需要四个类:WebRequest、WebResponse、Stream、FileStream。
WebRequest、WebResponse 的名称空间是:System.Net
Stream、FileStream 的名称空间是:System.IO
示例如下:
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.IO" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
try
{
WebRequest request = WebRequest.Create("图片地址");
WebResponse response = request.GetResponse();
Stream reader = response.GetResponseStream();
FileStream writer = new FileStream("存放目录及新文件名", FileMode.OpenOrCreate, FileAccess.Write);
byte[] buff = new byte[512];
int c = 0; //实际读取的字节数
while ((c=reader.Read(buff, 0, buff.Length)) > 0)
{
writer.Write(buff, 0, c);
}
writer.Close();
writer.Dispose();
reader.Close();
reader.Dispose();
response.Close();
tb.Text = "保存成功!";
}
catch (Exception ex)
{
tb.Text = ex.Message;
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>抓取网页图片并保存</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="tb" runat="server" Width="500" Height="300" TextMode="multiLine"></asp:TextBox>
</div>
</form>
</body>
</html>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.IO" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
try
{
WebRequest request = WebRequest.Create("图片地址");
WebResponse response = request.GetResponse();
Stream reader = response.GetResponseStream();
FileStream writer = new FileStream("存放目录及新文件名", FileMode.OpenOrCreate, FileAccess.Write);
byte[] buff = new byte[512];
int c = 0; //实际读取的字节数
while ((c=reader.Read(buff, 0, buff.Length)) > 0)
{
writer.Write(buff, 0, c);
}
writer.Close();
writer.Dispose();
reader.Close();
reader.Dispose();
response.Close();
tb.Text = "保存成功!";
}
catch (Exception ex)
{
tb.Text = ex.Message;
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>抓取网页图片并保存</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="tb" runat="server" Width="500" Height="300" TextMode="multiLine"></asp:TextBox>
</div>
</form>
</body>
</html>
有了这个主核心,接下来就是一些琐碎的工作,比如读取博客内容的图片链接,构造图片存放的目录及文件名。
在新浪博客中的图片地址是遵循一定的规则的,比如基本都是这样的构造
<a href=http"://blog.photo.sina.com.cn/showpic.html#url=http://s15.sinaimg.cn/orignal/21位随机编号ID target="_blank"><img src="http://s15.sinaimg.cn/small/21位随机编号ID&690" name="image_operate_21位随机编号ID" id="image_operate_21位随机编号ID"/></a>
但有个别是这样的构造
<a href="http://photo.blog.sina.com.cn/showpic.html#blogid=blogID编号url=http://s5.sinaimg.cn/orignal/21位随机编号&690" target="_blank"><img src="http://s5.sinaimg.cn/bmiddle/21</a>
找出规律,就可以使用正则表达式来提取链接,为了统一格式,我是先将第二种格式中的 blogid=blogID编号替换为null,这样地址的结构基本相同,然后用匹配组的方式提取链接
,注意在asp.net中使用正则表达式的命名空间为:System.Text.RegularExpressions
MatchCollection mc = Regex.Matches(content, @"<a\s+href=""http://(/?<website>.+?)/showpic.html#url=(?<url>.+?)""\s+target=""_blank"">(?<content>.+?)</a>");
我们需要的图片地址就存在于<url>中,提取的代码为:
foreach (Match m in mc)
{
url = m.Groups["url"].Value;
}
{
url = m.Groups["url"].Value;
}
而文件名就使用21位随机ID,21位随机ID在url的最后,有的21位随机ID后带了&690字符,所以需要用以下的代码过滤一下:
filename = url.Substring(url.Length - 29, 29);
if(filename.Substring(filename.Length-8,8)=="&690")
{
filename=filename.Substring(filename.Length-29,21);
}else
{
filename = url.Substring(url.Length - 21, 21);
}
if(filename.Substring(filename.Length-8,8)=="&690")
{
filename=filename.Substring(filename.Length-29,21);
}else
{
filename = url.Substring(url.Length - 21, 21);
}
上面的url是原始图片的地址,而在博客中的图片往往是小图片,但是这个小图片的地址跟原始图片的地址关联性很强,很容易得到:
smallurl = url.Replace("orignal", "small");
smallurl = smallurl + "&690";
smallurl = smallurl + "&690";
这样,在每个"Match"到的地址中都使用最开始的抓取图片的方式就可以抓取每个链接中的图片了。
参考文档:
asp.net文件流操作
asp.net正则表达式提取网址、标题、图片等
http://www.flatws.cn/article/program/asp/2011-04-20/21726.html
asp.net将数据写入到文本文件中
http://www.99mianfei.net/article/html/5905.html
asp.net创建文件夹与文件类
http://www.flatws.cn/article/program/asp/2011-04-20/21726.html
asp.net将数据写入到文本文件中
http://www.99mianfei.net/article/html/5905.html
asp.net创建文件夹与文件类