抓取新浪博客中的图片

    导入的新浪博客中的图片地址链接到新浪网址,而在别的站点看新浪博客图片无法正常显示.为了解决这个问题,就要想办法将图片抓取到本地.

    在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 >

      有了这个主核心,接下来就是一些琐碎的工作,比如读取博客内容的图片链接,构造图片存放的目录及文件名。

      在新浪博客中的图片地址是遵循一定的规则的,比如基本都是这样的构造

< 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&amp;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位随机编号&amp;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;
  }   

 而文件名就使用21位随机ID,21位随机ID在url的最后,有的21位随机ID后带了&amp;690字符,所以需要用以下的代码过滤一下:

  filename  =  url.Substring(url.Length  -   29 29 );
   
if (filename.Substring(filename.Length - 8 , 8 ) == " &amp;690 " )
     {
        filename
= filename.Substring(filename.Length - 29 , 21 );
     }
else
      {
        filename 
=  url.Substring(url.Length  -   21 21 );
      }

   上面的url是原始图片的地址,而在博客中的图片往往是小图片,但是这个小图片的地址跟原始图片的地址关联性很强,很容易得到:

 smallurl  =  url.Replace( " orignal " " small " );
 smallurl 
=  smallurl  +   " &amp;690 " ;

   这样,在每个"Match"到的地址中都使用最开始的抓取图片的方式就可以抓取每个链接中的图片了。

    参考文档:

   

 正则-匹配超链接地址及内容

 asp.net文件流操作
  asp.net正则表达式提取网址、标题、图片等

asp.net将数据写入到文本文件中

asp.net创建文件夹与文件类

http://www.xueit.com/html/2009-02/21_584_00.html
 

转载于:https://www.cnblogs.com/miniflyfish/archive/2011/05/14/2046134.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值