C#实现网页爬虫
HTTP请求工具类(功能:1、获取网页html;2、下载网络图片;):
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace Utils
{
/// <summary>
/// HTTP请求工具类
/// </summary>
public class HttpRequestUtil
{
/// <summary>
/// 获取页面html
/// </summary>
public static string GetPageHtml(string url)
{
// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)";
//发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
//返回结果网页(html)代码
string content = sr.ReadToEnd();
return content;
} /// <summary>
/// Http下载文件
/// </summary>
public static void HttpDownloadFile(string url, int minWidth, int minHeight)
{
int pos = url.LastIndexOf("/") + ;
string fileName = url.Substring(pos);
string path = Application.StartupPath + "\\download";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string filePathName = path + "\\" + fileName;
if (File.Exists(filePathName)) return; // 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)";
request.Proxy = null;
//发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream(); MemoryStream memoryStream = new MemoryStream();
byte[] bArr = new byte[];
int size = responseStream.Read(bArr, , (int)bArr.Length);
while (size > )
{
memoryStream.Write(bArr, , size);
size = responseStream.Read(bArr, , (int)bArr.Length);
}
Image tempImage = System.Drawing.Image.FromStream(memoryStream, true);
int imageHeight = tempImage.Height;
int imageWidth = tempImage.Width;
if (imageHeight >= minHeight && imageWidth >= minWidth)
{
memoryStream.Seek(, SeekOrigin.Begin);
size = memoryStream.Read(bArr, , (int)bArr.Length);
FileStream fs = new FileStream(filePathName, FileMode.Create);
while (size > )
{
fs.Write(bArr, , size);
size = memoryStream.Read(bArr, , (int)bArr.Length);
}
fs.Close();
}
memoryStream.Close();
responseStream.Close();
}
}
}
VisitedHelper类:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace Utils
{
/// <summary>
/// 已访问的网址列表
/// </summary>
public class VisitedHelper
{
private static List<string> m_VisitedList = new List<string>(); #region 判断是否已访问
/// <summary>
/// 判断是否已访问
/// </summary>
public static bool IsVisited(string url)
{
if (m_VisitedList.Exists(a => a == url))
{
return true;
}
return false;
}
#endregion #region 添加已访问
/// <summary>
/// 添加已访问
/// </summary>
public static void Add(string url)
{
m_VisitedList.Add(url);
}
#endregion }
}
多线程爬取网页代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Utils; namespace 爬虫
{
public partial class Form1 : Form
{
private static int m_MinWidth = ;
private static int m_MinHeight = ;
private static int m_CompletedCount = ; public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
ThreadPool.SetMaxThreads(, );
int.TryParse(txtMinWidth.Text, out m_MinWidth);
int.TryParse(txtMinHeight.Text, out m_MinHeight);
button1.Enabled = false;
lblMsg.Text = "正在爬取图片…";
timer1.Start();
new Thread(new ThreadStart(delegate()
{
Crawling(txtUrl.Text, null);
})).Start();
} /// <summary>
/// 爬取
/// </summary>
private void Crawling(string url, string host)
{
if (!VisitedHelper.IsVisited(url))
{
VisitedHelper.Add(url); if (host == null)
{
host = GetHost(url);
} string pageHtml = HttpRequestUtil.GetPageHtml(url);
Regex regA = new Regex(@"<a[\s]+[^<>]*href=(?:""|')([^<>""']+)(?:""|')[^<>]*>[^<>]+</a>", RegexOptions.IgnoreCase);
Regex regImg = new Regex(@"<img[\s]+[^<>]*src=(?:""|')([^<>""']+(?:jpg|jpeg|png|gif))(?:""|')[^<>]*>", RegexOptions.IgnoreCase); MatchCollection mcImg = regImg.Matches(pageHtml);
foreach (Match mImg in mcImg)
{
string imageUrl = mImg.Groups[].Value;
try
{
int imageWidth = GetImageWidthOrHeight(mImg.Value, true);
int imageHeight = GetImageWidthOrHeight(imageUrl, false);
if (imageWidth >= m_MinWidth && imageHeight >= m_MinHeight)
{
if (imageUrl.IndexOf("javascript") == -)
{
if (imageUrl.IndexOf("http") == )
{
HttpRequestUtil.HttpDownloadFile(imageUrl, m_MinWidth, m_MinHeight);
}
else
{
HttpRequestUtil.HttpDownloadFile(host + imageUrl, m_MinWidth, m_MinHeight);
}
}
}
}
catch { }
} //递归遍历
MatchCollection mcA = regA.Matches(pageHtml);
foreach (Match mA in mcA)
{
try
{
string nextUrl = mA.Groups[].Value;
if (nextUrl.IndexOf("javascript") == -)
{
if (nextUrl.IndexOf("http") == )
{
if (GetHost(url) == host)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object obj)
{
try
{
Crawling(nextUrl, host);
m_CompletedCount++;
}
catch { }
}));
}
}
else
{
if (GetHost(url) == host)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object obj)
{
try
{
Crawling(host + nextUrl, host);
m_CompletedCount++;
}
catch { }
}));
}
}
}
}
catch { }
}
}
} //end Crawling方法 /// <summary>
/// 获取主机
/// </summary>
private string GetHost(string url)
{
Regex regHost = new Regex(@"(?:http|https)://[a-z0-9\-\.:]+", RegexOptions.IgnoreCase);
Match mHost = regHost.Match(url);
return mHost.Value + "/";
} //计时器事件
private void timer1_Tick(object sender, EventArgs e)
{
int workerThreads;
int completionPortThreads;
ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
if (workerThreads == && m_CompletedCount > )
{
lblMsg.Text = "已结束";
}
else
{
lblMsg.Text = "正在爬取图片…";
}
} /// <summary>
/// 获取图片宽度或高度
/// </summary>
private int GetImageWidthOrHeight(string imageTagString, bool isWidth)
{
string tag = isWidth ? "width" : "height";
Regex reg = new Regex(string.Format(@"{0}=""([\d\.]+)""", tag), RegexOptions.IgnoreCase);
Match match = reg.Match(imageTagString);
if (match.Success)
{
return (int)Convert.ToDouble(match.Groups[].Value);
}
else
{
reg = new Regex(string.Format(@"{0}[\s]*:[\s]*([\d\.]+)[\s]*px[\s]*;", tag), RegexOptions.IgnoreCase);
match = reg.Match(imageTagString);
if (match.Success)
{
return (int)Convert.ToDouble(match.Groups[].Value);
}
}
return int.MaxValue;
} } //end Form1类 /// <summary>
/// 跨线程访问控件的委托
/// </summary>
public delegate void InvokeDelegate();
}
截图:
C#实现网页爬虫的更多相关文章
- cURL 学习笔记与总结(2)网页爬虫、天气预报
例1.一个简单的 curl 获取百度 html 的爬虫程序(crawler): spider.php <?php /* 获取百度html的简单网页爬虫 */ $curl = curl_init( ...
- c#网页爬虫初探
一个简单的网页爬虫例子! html代码: <head runat="server"> <title>c#爬网</title> </head ...
- 网页爬虫--scrapy入门
本篇从实际出发,展示如何用网页爬虫.并介绍一个流行的爬虫框架~ 1. 网页爬虫的过程 所谓网页爬虫,就是模拟浏览器的行为访问网站,从而获得网页信息的程序.正因为是程序,所以获得网页的速度可以轻易超过单 ...
- 网页爬虫的设计与实现(Java版)
网页爬虫的设计与实现(Java版) 最近为了练手而且对网页爬虫也挺感兴趣,决定自己写一个网页爬虫程序. 首先看看爬虫都应该有哪些功能. 内容来自(http://www.ibm.com/deve ...
- Python 网页爬虫 & 文本处理 & 科学计算 & 机器学习 & 数据挖掘兵器谱(转)
原文:http://www.52nlp.cn/python-网页爬虫-文本处理-科学计算-机器学习-数据挖掘 曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开 ...
- [resource-]Python 网页爬虫 & 文本处理 & 科学计算 & 机器学习 & 数据挖掘兵器谱
reference: http://www.52nlp.cn/python-%e7%bd%91%e9%a1%b5%e7%88%ac%e8%99%ab-%e6%96%87%e6%9c%ac%e5%a4% ...
- 网页抓取:PHP实现网页爬虫方式小结
来源:http://www.ido321.com/1158.html 抓取某一个网页中的内容,需要对DOM树进行解析,找到指定节点后,再抓取我们需要的内容,过程有点繁琐.LZ总结了几种常用的.易于实现 ...
- Java正则表达式--网页爬虫
网页爬虫:其实就一个程序用于在互联网中获取符合指定规则的数据 爬取邮箱地址,爬取的源不同,本地爬取或者是网络爬取 (1)爬取本地数据: public static List<String> ...
- 从robots.txt開始网页爬虫之旅
做个网页爬虫或搜索引擎(下面统称蜘蛛程序)的各位一定不会陌生,在爬虫或搜索引擎訪问站点的时候查看的第一个文件就是robots.txt了.robots.txt文件告诉蜘蛛程序在server上什么文件是能 ...
- Python网页爬虫(一)
很多时候我们想要获得网站的数据,但是网站并没有提供相应的API调用,这时候应该怎么办呢?还有的时候我们需要模拟人的一些行为,例如点击网页上的按钮等,又有什么好的解决方法吗?这些正是python和网页爬 ...
随机推荐
- 不插网线,看不到IP的解决办法
在Windows中,如果不插网线,就看不到IP地址,即使这个块网卡已经绑定了固定IP,原因是操作系统开启了DHCP Media Sense功能,该功能的作用如下: 在一台使用 TCP/IP 的基于 W ...
- python sorted排序
python sorted排序 Python不仅提供了list.sort()方法来实现列表的排序,而且提供了内建sorted()函数来实现对复杂列表的排序以及按照字典的key和value进行排序. s ...
- 跟我一起云计算(3)——hbase
hbase HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Go ...
- MySQL—FOREIGN KEY
作用:保持数据一致性,完整性.实现一对一或一对多关系.(学习的过程中,老师说,实际的生产中,一般不使用物理上的外键约束的,都是使用逻辑上的外键约束) 要求: 父表与子表的存储引擎必须相等,而且只能是I ...
- 2015 年最受 Linux 爱好者欢迎的软硬件大盘点
Linux 爱好者都喜欢用哪些硬件,哪些发行版呢?近日 OpenBenchmarking.org 做了一个 2015 年度数据的统计和梳理,Linux Story 特意整理了一下,分享给大家. 转载于 ...
- Atitit.java c#这类编程语言的设计失败点attilax总结
Atitit.java c#这类编程语言的设计失败点attilax总结 1. Npe1 2. Api粒度过小而又没有提供最常用模式1 3. checked exception(jeig n jyejy ...
- Atitit hsv转grb 应该优先使用hsv颜色原则 方便人类
Atitit hsv转grb 应该优先使用hsv颜色原则 方便人类 1.1. 1.1.hsv色卡1 1.2. 从 HSV 到 RGB 的转换1 1.3. HSVtoRGBColorV22 1.1. ...
- JS---DOM操作有哪一些
一 DOM对象有哪一些 1 windos 1.属性 opener 2.方法 open(),close() 例:<script langguage="javascript&qu ...
- vb6里面dim和set的区别
dim是作用于变量 声明变量并分配存储空间 set作用于对象 将对象引用赋给变量或属性 例子: dim A as collection set A=new collection 等效于 di ...
- 学习ASP.NET MVC(九)——“Code First Migrations ”工具使用示例
在上一篇文章中,我们学习了如何使用实体框架的“Code First Migrations ”工具,使用其中的“迁移”功能对模型类进行一些修改,同时同步更新对应数据库的表结构. 在本文章中,我们将使用“ ...