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和网页爬 ...
随机推荐
- 每周一书-2016年8月15日到21日(bootstrap基础教程)获奖读者公布
本次赠书 由微信昵称为“………….”的网友以10个赞获得. 请这位网友,订阅号回复你的联系方式,明天给你邮递这本书.谢谢!同时感谢<把时间当朋友>的获奖者“永梅”为<bootsrap ...
- [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门
[.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习 ...
- 【面试必备】javascript的原型和继承
原型.闭包.作用域等知识可以说是js中面试必考的东西,通过你理解的深度也就能衡量出你基本功是否扎实.今天来复习一下javascript的原型和继承,虽说是老生常谈的话题,但对于这些知识,自己亲手写一遍 ...
- Unity3D热更新全书-脚本(五) NGUI
让我们实际的研究一下如何将NGUI和C#LightEvil结合起来. 这里使用NGUI2.7,因为他是一个开源的版本,NGUI最新的版本未经作者的许可,是不可以带入我们的开源项目使用的. 这个例子完成 ...
- Android 神兵利器—— Adb 常用命令
总结的Android工具类文章: Android 神兵利器-- Adb 常用命令 Android 神兵利器-- Git 常用命令 Adb的全称为Android Debug Bridge,是管理andr ...
- 解析Visual Studio 2015促进生产力的10个新功能
1 性能提示 Performance Tips 当我们想知道执行一段代码所耗费的时间时,需要借助于.NET 框架的Stopwatch类,像下面这样: class Program { static vo ...
- Topology and Geometry in OpenCascade-Face
Topology and Geometry in OpenCascade-Face eryar@163.com 摘要Abstract:本文简要介绍了几何造型中的边界表示法(BRep),并结合程序说明O ...
- PHP 自制日历
最近的一个项目中,需要将数据用日历方式显示,网上有很多的JS插件,后面为了自己能有更大的控制权,决定自己制作一个日历显示.如下图所示: 一.计算数据 1.new一个Calendar类 2.初始化两个下 ...
- Nodejs学习笔记(四)——支持Mongodb
前言:回顾前面零零碎碎写的三篇挂着Nodejs学习笔记的文章,着实有点名不副实,当然,这篇可能还是要继续走着离主线越走越远的路子,从简短的介绍什么是Nodejs,到如何寻找一个可以调试的Nodejs ...
- 开发人员看测试之运行Github中的JBehave项目
本文要阐述的主要有两点,一是介绍自动化测试框架JBehave,二是介绍如何在Github上拉项目,编译成myeclipse环境中的项目,并最终导入Myeclipse中运行. JBehave是何物? J ...