一个C#写的爬虫程序
CodeProject上看见的感兴趣的文章,先研究着,有空翻译一下:
网页爬虫(也被称做蚂蚁或者蜘蛛)是一个自动抓取万维网中网页数据的程序.网页爬虫一般都是用于抓取大量的网页,为日后搜索引擎处理服务的.抓取的网页由一些专门的程序来建立索引(如:Lucene,DotLucene),加快搜索的速度.爬虫也可以作为链接检查器或者HTML代码校验器来提供一些服务.比较新的一种用法是用来检查E-mail地址,用来防止Trackback spam.
在这篇文章中,我将介绍一个用C#写的简单的爬虫程序.这个程序根据输入的目标URL地址,来有针对性的进行网页抓取.用法相当简单,只需要输入你想要抓取的网站地址,按下"GO"就可以了.
这个程序提供三种状态查看:
- 抓取线程列表
- 每个抓取线程的详细信息
- 查看错误信息
线程查看
线程列表查看显示所有正在工作中的线程.每个线程从URI队列中取出一个URI,进行链接.
Host: www.cnn.com
Connection: Keep-Alive
Date: Sun, 19 Mar 2006 19:39:05 GMT
Content-Length: 65730
Content -Type: text/ html
Expires: Sun, 19 Mar 2006 19:40:05 GMT
Cache-Control: max-age=60, private
Connection: keep - alive
Proxy-Connection: keep- alive
Server: Apache
Last-Modified: Sun, 19 Mar 2006 19:38:58 GMT
Vary: Accept-Encoding,User- Agent
Via: 1.1 webcache (NetCache NetApp/6.0 .1P3)
Found: 356 ref (s)
http://www.cnn.com/
http://www.cnn.com/search/
http:// www.cnn.com/linkto/intl.html
这个程序提供一些参数的设置,包括:
- MIME types
- 存储目的文件夹
- 最大抓取线程数
- 等等...
文件类型
爬虫支持的下载下来的文件类型,用户可以添加MIME类型,支持可下载的文件包括一个默认类型用来用户可添加,编辑和删除MIME类型. 用户可以选择让所有MIME类型为下列数字.
输出
输出设定包括下载文件夹, 而请求的数目应保持在要求查看复审请求细节.
连接
连线设定包含:
- Thread count: 多个并行工作的线程爬虫;
- Thread sleep time when refs queue empty: 当时每个threadsleeps当refs队列空;
- Thread sleep time between two connection: 时间,每一线程睡眠后处理的任何请求, 这是非常重要的参考价值,以防止主机堵爬虫由于沉重的负荷.
- Connection timeout: 代表连接超时的时间;
- Navigate through pages to a depth of: 代表深度;
- Keep same URL server: 限制爬行的过程中,以同样的主机了原来的URL.
- keepconnectionalive:手段不断Socket连接打开以后请避免reconnect时间.
高级
高级设置:
代码页编码的文本下载页面列出了用户定义列表限制词,让用户 防止任何坏页面列出了用户定义列表限制主机分机以免堵塞这类主机 名单一使用者定义限制档案清单分机避免paring非文字资料
兴趣要点
保持活动连接:
保持活动连接是一种形式,要求客户端和服务器保持连接打开后,反应完毕后, 可以通过添加一个HTTPheader的请求到服务器,在以下要求:
Host: www.cnn.com
Connection: Keep - Alive
Date: Sun, 19 Mar 2006 19:38:15 GMT
Content-Length: 29025
Content -Type: text/ html
Expires: Sun, 19 Mar 2006 19:39:15 GMT
Cache-Control: max-age=60, private
Connection: keep - alive
Proxy-Connection: keep- alive
Server: Apache
Vary: Accept-Encoding,User- Agent
Last-Modified: Sun, 19 Mar 2006 19:38:15 GMT
Via: 1.1 webcache (NetCache NetApp/6.0 .1P3)
Date: Sun, 19 Mar 2006 19:38:15 GMT
Content-Length: 29025
Content -Type: text/ html
Expires: Sun, 19 Mar 2006 19:39:15 GMT
Cache-Control: max-age=60, private
Connection: Close
Server: Apache
Vary: Accept -Encoding,User- Agent
Last-Modified: Sun, 19 Mar 2006 19:38:15 GMT
Via: 1.1 webcache (NetCache NetApp/6.0 .1P3)
WebRequest and WebResponse 问题:
WebResponse response = request.GetResponse();
Stream streamIn = response.GetResponseStream();
BinaryReader reader = new BinaryReader(streamIn, TextEncoding);
byte[] RecvBuffer = new byte[10240 ];
int nBytes, nTotalBytes = 0 ;
while((nBytes = reader.Read(RecvBuffer, 0, 10240)) > 0 )
{
nTotalBytes += nBytes;
}
reader.Close();
streamIn.Close();
response.Close();
MyWebResponse response = request.GetResponse();
byte[] RecvBuffer = new byte[10240 ];
int nBytes, nTotalBytes = 0 ;
while((nBytes = response.socket.Receive(RecvBuffer, 0, 10240, SocketFlags.None)) > 0 )
{
nTotalBytes += nBytes;
if(response.KeepAlive && nTotalBytes >= response.ContentLength && response.ContentLength > 0)
break;
}
if(response.KeepAlive == false )
response.Close();
刚刚更换getresponsestream与直接获取套接字会员mywebresponse阶层. 这样做,我做了简单的伎俩,使socket读明年开始后的头回答, 读一字节的时间告诉header完成,如下列代码:
Header = "" ;
byte[] bytes = new byte[10 ];
while(socket.Receive(bytes, 0, 1, SocketFlags.None) > 0 )
{
Header += Encoding.ASCII.GetString(bytes, 0, 1);
if(bytes[0] == '/n' && Header.EndsWith("/r/n/r/n"))
break;
}
因此,用户myresponse类只会继续接收从第一位置的页面. 线程管理:线索数目的履带式是指用户通过设置. 它的默认值是10线程,但它可改变的设置选项连接. 履带代码处理这种改变的财产threadcount如下列代码:
{
get { return nThreadCount; }
set
{
Monitor.Enter(this.listViewThreads);
for(int nIndex = 0; nIndex < value; nIndex ++)
{
if(threadsRun[nIndex] == null || threadsRun[nIndex].ThreadState != ThreadState.Suspended)
{
threadsRun[nIndex] = new Thread(new ThreadStart(ThreadRunFunction));
threadsRun[nIndex].Name = nIndex.ToString();
threadsRun[nIndex].Start();
if(nIndex == this.listViewThreads.Items.Count)
{
ListViewItem item = this.listViewThreads.Items.Add((nIndex+1).ToString(), 0);
string[] subItems = { "", "", "", "0", "0%" };
item.SubItems.AddRange(subItems);
}
}
else if(threadsRun[nIndex].ThreadState == ThreadState.Suspended)
{
ListViewItem item = this.listViewThreads.Items[nIndex];
item.ImageIndex = 1;
item.SubItems[2].Text = "Resume";
threadsRun[nIndex].Resume();
}
}
nThreadCount = value;
Monitor.Exit(this.listViewThreads);
}
}
{
Monitor.Enter(queueURLS);
try
{
queueURLS.Enqueue(uri);
}
catch(Exception)
{
}
Monitor.Exit(queueURLS);
}
而每个线程可以取出第一url在排队,要求它在以下部分代码:
{
Monitor.Enter(queueURLS);
MyUri uri = null;
try
{
uri = (MyUri)queueURLS.Dequeue();
}
catch(Exception)
{
}
Monitor.Exit(queueURLS);
return uri;
}
一个C#写的爬虫程序相关推荐
- 先给自己定个小目标,比如写个爬虫程序
今天要写的是一个最简单的爬虫. ##目标: 理工新闻栏目--下面的所有文章,抓取到,并且保存起来,今天是用文件的形式保存下来的,也可以直接存到数据库里. 下面介绍开发需要的东西: 1.node.js ...
- 一个简单的python爬虫程序
#简介 在每次论文被拒再投的过程中,都需要查询最近的与自己论文相关的会议列表.每到这种情况,我一遍采用的是遍历会伴www.myhuiban.com的网站,然后逐个查看会议,关注的有三点,投稿日期,cc ...
- 一月集 一个会写诗的程序员2019
冬至 ,昼与惆怅最短,夜与思念最长,愿你一切都好. --光剑 任何年龄的爱情都是合情合理的.心灵的爱情在腰部以上,肉体的爱情在腰部往下.任何年龄段的女人,都有她在那个年龄阶段所呈现出来的无法复刻的美. ...
- 二零一九第二天 文/一个会写诗的程序员
今天是二零一九年 第二天 天气依然阴冷 而我感觉 这新的一年开始 也并没有什么不同 而是,变得更加 凄凉萧条 孤寂寒冷了 "我相信会变,但只是更糟" 一个会写诗的程序员 杭州 20 ...
- 听心 文/一个会写诗的程序员
听心 这温暖在我心间 伴随我想你的每天 那一刻沉重的心 此刻感到从没有的轻盈 你千万要认真对待 一个敏感脆弱的诗人 那颗柔弱的心 它一遇到伤害 就立马化成石块 不过我这颗心没事 我是铁石心肠 也会柔情 ...
- 雪夜游西湖记 文/一个会写诗的程序员
雪夜游西湖记 黯淡冬月夜,天上飘细雪,乘兴游西湖. 风雪湛清,碧波万顷. 断桥边池,败荷零落,枯桐掩映. 残雪亭旁,竟有粉花绽放,白雪映衬,甚是美丽. 望远山,蜿蜒綿亙,曲线似少女峰. 高楼立矗,万家 ...
- 《拾叶集》一个会写诗的程序员 二零一八年十月八日
图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 又是一个秋夜 我在听秋虫鸣 夜渐深了 我在听秋虫鸣 人睡到忘记这个真实世界的时候 就会有另外一个虚假 ...
- python编写爬虫的步骤-python学习: 写网络爬虫程序的三个难点
写爬虫,是一个非常考验综合实力的活儿.有时候,你轻而易举地就抓取到了想要的数据:有时候,你费尽心思却毫无所获. 好多Python爬虫的入门教程都是一行代码就把你骗上了"贼船",等上 ...
- 不喜欢写测试的朋友看过来,与你分享写测试的经验 做一个爱写测试的程序员...
自从掌握了单元测试的要领之后,经常写测试,做测试,也非常喜欢做单元测试.我的文章<数据采集:完美下载淘宝Ip数据库 简单的程序节省60元人民币而不必购买数据库>中的代码,也是个测试方法,源 ...
最新文章
- python使用matplotlib可视化、移除可视化图像坐标轴的刻度线和标签( remove the default axis ticks and labels)
- Python之Numpy数组拼接,组合,连接
- MongonDB 知识
- transformer bert 入门
- sql中的indexof,函数介绍
- Laravel 5.5 使用 Jwt-Auth 实现 API 用户认证以及无痛刷新访问令牌
- Python的MySQLdb模块安装
- 解决Windows 10 CPU占用高风扇吵问题
- 运用递归将两个链表进行连接
- 【论文党福利】如何提取图像中的数据
- Linux入门学习(八)
- WPF中radiobutton 的 data binding方法
- 小米蓝牙键盘怎么连接_【米物蓝牙双模键盘使用总结】连接|操作|按键_摘要频道_什么值得买...
- leo-校园文化户口管理系统
- python怎么变成动图_python 生成动图
- 怎样快速实现两台电脑硬盘文件共享?
- # android移动开发——第十三章——个人理财通案例(Eclipse版)
- python|爬虫|爬取豆瓣自己账号下的观影记录并可视化
- 海报设计之色彩搭配与均衡构图
- linux中swi指令,ARM中的SWI指令(转)
热门文章
- 计算机颜色管理器,Windows7色彩管理显示器ICC设置方法
- 随机抽奖系统 Random类
- nodejs+express解决微信公众号token验证失败
- 计算机操作系统(八)——并发程序设计
- 解决:AWVS(Acunetix)激活频繁失效(仅供学习)
- HarmonyOS荣耀8x,不忘老机型 荣耀9X系列被曝今年将升级HarmonyOS
- Opencv Python图像处理进阶教程②
- sUploadDir
- uni-app使用Hbuilder X如何安卓APP打包、发布、运行
- JZOJ.4377[GDOI2016模拟3.10]习用之语 解题报告