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#实现网页爬虫的更多相关文章

  1. cURL 学习笔记与总结(2)网页爬虫、天气预报

    例1.一个简单的 curl 获取百度 html 的爬虫程序(crawler): spider.php <?php /* 获取百度html的简单网页爬虫 */ $curl = curl_init( ...

  2. c#网页爬虫初探

    一个简单的网页爬虫例子! html代码: <head runat="server"> <title>c#爬网</title> </head ...

  3. 网页爬虫--scrapy入门

    本篇从实际出发,展示如何用网页爬虫.并介绍一个流行的爬虫框架~ 1. 网页爬虫的过程 所谓网页爬虫,就是模拟浏览器的行为访问网站,从而获得网页信息的程序.正因为是程序,所以获得网页的速度可以轻易超过单 ...

  4. 网页爬虫的设计与实现(Java版)

    网页爬虫的设计与实现(Java版)     最近为了练手而且对网页爬虫也挺感兴趣,决定自己写一个网页爬虫程序. 首先看看爬虫都应该有哪些功能. 内容来自(http://www.ibm.com/deve ...

  5. Python 网页爬虫 & 文本处理 & 科学计算 & 机器学习 & 数据挖掘兵器谱(转)

    原文:http://www.52nlp.cn/python-网页爬虫-文本处理-科学计算-机器学习-数据挖掘 曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开 ...

  6. [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% ...

  7. 网页抓取:PHP实现网页爬虫方式小结

    来源:http://www.ido321.com/1158.html 抓取某一个网页中的内容,需要对DOM树进行解析,找到指定节点后,再抓取我们需要的内容,过程有点繁琐.LZ总结了几种常用的.易于实现 ...

  8. Java正则表达式--网页爬虫

    网页爬虫:其实就一个程序用于在互联网中获取符合指定规则的数据 爬取邮箱地址,爬取的源不同,本地爬取或者是网络爬取 (1)爬取本地数据: public static List<String> ...

  9. 从robots.txt開始网页爬虫之旅

    做个网页爬虫或搜索引擎(下面统称蜘蛛程序)的各位一定不会陌生,在爬虫或搜索引擎訪问站点的时候查看的第一个文件就是robots.txt了.robots.txt文件告诉蜘蛛程序在server上什么文件是能 ...

  10. Python网页爬虫(一)

    很多时候我们想要获得网站的数据,但是网站并没有提供相应的API调用,这时候应该怎么办呢?还有的时候我们需要模拟人的一些行为,例如点击网页上的按钮等,又有什么好的解决方法吗?这些正是python和网页爬 ...

随机推荐

  1. 一个App完成入门篇(二)-搭建主框架

    通过第一课的学习,你已经掌握了如何通过debug调试器来跟PC上的设计器联调来实时查看UI设计效果.调试代码了,接下来通过一系列的demo开发教学你将很快上手学习到如何开发一个真正的App. 要开发A ...

  2. 【吉光片羽】js横向滚动与浮动导航

    1.横向滚动,这个方法是见过最简洁的了. #demo { background: #FFF; overflow: hidden; border: 1px dashed #CCC; width: 117 ...

  3. windows 8.1 试用感受:蛋疼感大幅降低

    众所周知windows 8 的最大使用感受就是蛋疼. 无论是微软MVP,还是我这样的万年不悔微软小白鼠,普通用户,小白用户,或多或少的都对这款操作系统感到蛋疼. 槽点太多,以至于大家都懒得批判了.好在 ...

  4. http流请求时,被请求站点HttpContext.Current为null?

    我负责运维一个短信接口站点sms.调用上游短信供应商下发短信后,他们会给我们推送发送报告.报告是类似DELIVRD.DI:9432这样的码.为了方便识别,系统里有一个报告码与其描述的关系,一开始是写死 ...

  5. struts2学习笔记之八:Action中方法的动态调用

    方法一:action名称+!+方法名称+后缀 Action类中增加addUser()和delUser()方法, package com.djoker.struts2; import org.apach ...

  6. 带你走近AngularJS - 体验指令实例

    带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...

  7. 理解 Lua 的那些坑爹特性

    按:最近看到了依云的文章,一方面,为Lua被人误解而感到十分难过,另一方面,也为我的好友, 依云没有能够体会到Lua的绝妙和优雅之处而感到很遗憾,因此我写了这篇文章,逐条款地说明了 依云理解中出现的一 ...

  8. atitit.错误:找不到或无法加载主类 的解决 v4 qa15.doc

    atitit.错误:找不到或无法加载主类 的解决 v4 qa15.doc 1.1. 修改此java文件,让他启动编译,还是不能生成了新的class, 1.2. 估计ide调试锁死class ,查看de ...

  9. 12.创建一个Point类,有成员变量x,y,方法getX(),setX(),还有一个构造方 法初始化x和y。创建类主类A来测试它。

    package java1; public class Point { int x; int y; Point(int x,int y) { this.x = x; this.y = y; } pub ...

  10. winform 程序制作自己的数字签名(续)

    在上一篇文章<winform 程序制作自己的数字签名>中我们已经可以得到我们程序定制的数字签名了,但是比较讨厌的是每次编译之后,数字签名需要重新手动添加. 我们需要的是在程序编译时自动添加 ...