C# 实现对网站数据的采集和抓取
首先大家需要清楚一点的是:任何网站的页面,无论是php、jsp、aspx这些动态页面还是用后台程序生成的静态页面都是可以在浏览器中查看其HTML源文件的。
所以当你要开发数据采集程序的时候,你必须先对你试图采集的网站的前台页面结构(HTML)要有所了解。
当你对要采集数据的网站里的HTML源文件内容十分熟悉之后,剩下程序上的事情就很好办了。因为C#对Web站点进行数据采集其原理就在于“把你要采集的页面HTML源文件下载下来,分析其中HTML代码然后抓取你需要的数据,最后将这些数据保存到本地文件”。
基本流程如下图所示:
1.页面源文件下载
首先引用System.Net命名空间
using System.Net;
此外还需引用
using System.Text; using System.IO;
引用完后实例化一个WebClient对象
private WebClient wc = new WebClient();
调用DownloadData方法将指定网页的源文件下载一组BYTE数据,然后将BYTE数组转为字符串。
//下载页面源文件并将其转换成UTF8编码格式的STRING string mainData = Encoding.UTF8.GetString(wc.DownloadData(string.Format("你要采集的网页地址")));
或则也可以调用DownloadFile方法,先将源文件下载到本地然后再读取其字符串
//下载网页源文件到本地 wc.DownloadFile("你要采集的网页URL","保存源文件的本地文件路径"); //读取下载下来的源文件HTML格式的字符串 string mainData = File.ReadAllText("保存源文件的本地文件路径",Encoding.UTF8);
有了网页HTML格式字符串,就可以对网页分析采集并抓取你所需要的内容了。
2.页面分析采集
页面分析就是要将网页源文件中某个特定或是唯一的字符(串)作为抓取点,以这个抓取点作为开端来截取你想要的页面上的数据。
以博客园为列,比方说我要采集博客园首页上列出来的文章的标题和链接,就必须以"<a class=\"titlelnk\" href=\""作为抓取点,以此展开来抓取文章的标题和链接。
//以"<a class=\"titlelnk\" href=\""作为抓取点开始采集 mainData=mainData.Substring(mainData.IndexOf("<a class=\"titlelnk\" href=\"") + 26); //获取文章页面的链接地址 string articleAddr = mainData.Substring(0,mainData.IndexOf("\"")); //获取文章标题 string articleTitle = mainData.Substring(mainData.IndexOf("target=\"_blank\">") + 16, mainData.IndexOf("</a>") - mainData.IndexOf("target=\"_blank\">") - 16);
注意:当你要采集的网页前台HTML格式变了之后,作为抓取点的字符窜也因做相应地改变,否则是采集不到任何东西的
3.数据保存
当你把需要的数据从网页截取下来后,将数据在程序中稍加整理保存到本地文件(或插入到自己本地的数据库中)。这样整个采集工作就算搞一段落了。
//输出数据到本地文件 File.AppendAllText(CreateFolderIfNot(Settings.Default.OutPath) + articleTitle + ".txt", articleData, Encoding.UTF8);
程序效果如下:
via:http://www.cnblogs.com/youuuu/archive/2011/06/17/2083714.html
相关文章
- C#中线程的使用[Thread in C#]
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
- SELECT INTO和INSERT INTO SELECT的区别 类似aaa?a=1&b=2&c=3&d=4,如何将问号以后的数据变为键值对 C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等) C# MD5 加密,解密 C#中DataTable删除多条数据
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
- ADO.NET 对数据操作 以及如何通过C# 事务批量导入数据
- Word控件Spire.Doc 【页眉页脚】教程(10): 锁定标题以防止在 C# 中编辑 word 文档
- c# .net http Post请求 发送Json数据,经过微信签名测试有效
- C#数据之List
- C#【必备技能篇】从Excel复制数据粘贴到DataGridView的代码实现
- C#,数值计算,矩阵相乘的源代码与数据可视化
- C#基础概念二十五问
- C#串口通信—向串口发送数据,同步接收返回数据
- C#实现局域网UDP广播--
- C# ZIP解压缩 模拟时钟
- C#-获取datatable指定列的数据
- 一种非常巧妙的读取串口数据的方法--C#
- C#-numericUpDown-数字选择---ShinePans
- C# new关键字和对象类型转换(双括号、is操作符、as操作符)
- C# 使用 StreamWriter 写入数据
- C# 使用 StreamWriter 写入数据
- 接口 C# 请求数据 HttpWebRequest 错误总结