闽公网安备 35020302035485号
最近看到一个图片网站,上面有很多很漂亮的图片,一张张下载另存为效率太慢了,于是就想用.NET做一个自动爬取网站图片的功能。要实现自动爬取网站图片的功能,主要有以下几个步骤:
1.爬取图片所在的页面url,实现模拟打开页面的功能
2.用正则表达式提取页面的图片url
3.再根据提取的url抓取图片的内容,并保存在本地(要存储在数据库也可以直接把图片二进制流存进数据库)
具体实现:
1.抓取需要自动爬取图片所在的页面,我们就以抓取duidaima.com首页的图片为例子,来看一下如何实现抓取页面的内容。在抓取前,先在命名空间引入如下三个命名空间,在这里主要要用到WebRequest来模拟页面访问的功能
using System.Net; using System.IO; using System.Text;抓取需要批量爬取的图片所在的页面信息,具体代码如下:
HttpWebRequest req;
HttpWebResponse res = null;
try
{
System.Uri httpUrl = new System.Uri("https://www.duidaima.com/");
req = (HttpWebRequest)(WebRequest.Create(httpUrl));
req.Timeout = 180000; //设置超时值10秒
req.UserAgent = "XXXXX";
req.Accept = "XXXXXX";
req.Method = "GET";
res = (HttpWebResponse)(req.GetResponse());
using (Stream stream = res.GetResponseStream())
{
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
String responseString = reader.ReadToEnd();
}
}
catch (Exception ex)
{
}
上面的代码执行后可以得到如下一段html文本信息:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-language" content="zh-CN"/>
<meta charset="utf-8"/>
<meta name="renderer" content="webkit"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
<title>堆代码-是程序员就上堆代码</title>
<meta name="keywords" content="堆代码,duidaima,程序员,码农,堆,编程博客,编程教程,编程基础知识,编程网课,在线阅读,在线书籍" />
<meta name="description" content="编程遇到问题?请上堆代码!想要学习编程知识?请上堆代码!无处记录日常?还是上堆代码!堆代码,堆的是生活,码的是理想。" />
.....
第二步:把上一步获取到的字符串信息传入下面的提取图片url的方法
/// <summary>
/// 取得HTML中所有图片的 URL。
/// </summary>
/// <param name="sHtmlText">HTML代码</param>
/// <returns>图片的URL列表</returns>
public static 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 = 0;
string[] sUrlList = new string[matches.Count];
// 取得匹配项列表
foreach (Match match in matches)
sUrlList[i++] = match.Groups["imgUrl"].Value;
return sUrlList;
}
第三步:循环读取第二步获取到的图片数组信息,把图片数组里的每个图片url传入到下面的这个方法实现图片下载到本地的功能(或者存储到数据库)
public Bitmap GetImgContent(string imgUrl)
{
Bitmap img = null;
HttpWebRequest req;
HttpWebResponse res = null;
try
{
System.Uri httpUrl = new System.Uri(imgUrl);
req = (HttpWebRequest)(WebRequest.Create(httpUrl));
req.Timeout = 180000; //设置超时值10秒
req.UserAgent = "XXXXX";
req.Accept = "XXXXXX";
req.Method = "GET";
res = (HttpWebResponse)(req.GetResponse());
img = new Bitmap(res.GetResponseStream());//获取图片流
img.Save(@"E:/" + DateTime.Now.ToFileTime().ToString() + ".png");//随机名,盘符可以自行选择,如果要存储到数据,直接把上面的图片流存储到数据库就可以了
}
catch (Exception ex)
{
string aa= ex.Message;
}
finally
{
res.Close();
}
return img;
}