CodeProject上看见的感兴趣的文章,先研究着,有空翻译一下:

简介
      网页爬虫(也被称做蚂蚁或者蜘蛛)是一个自动抓取万维网中网页数据的程序.网页爬虫一般都是用于抓取大量的网页,为日后搜索引擎处理服务的.抓取的网页由一些专门的程序来建立索引(如:Lucene,DotLucene),加快搜索的速度.爬虫也可以作为链接检查器或者HTML代码校验器来提供一些服务.比较新的一种用法是用来检查E-mail地址,用来防止Trackback spam.
 
爬虫概述
在这篇文章中,我将介绍一个用C#写的简单的爬虫程序.这个程序根据输入的目标URL地址,来有针对性的进行网页抓取.用法相当简单,只需要输入你想要抓取的网站地址,按下"GO"就可以了.
 
      这个爬虫程序有一个队列,存储要进行抓取的URL,这个设计和一些大的搜索引擎是一样的.抓取时是多线程的,从URL队列中取出URL进行抓取,然后将抓取的网页存在指定的存储区(Storage 如图所示).用C#Socket库进行Web请求.分析当前正在抓取的页面中的链接,存入URL队列中(设置中有设置抓取深度的选项)
 
状态查看
这个程序提供三种状态查看:
  1. 抓取线程列表
  2. 每个抓取线程的详细信息
  3. 查看错误信息

线程查看
线程列表查看显示所有正在工作中的线程.每个线程从URI队列中取出一个URI,进行链接.

.
.
请求查看
请求查看显示了所有的最近下载的页面的列表,也显示了HTTP头中的详细信息.
 
每个请求的头显示类似下面的信息:
GET / HTTP/1.0
 Host: www.cnn.com
 Connection: Keep-Alive
Response头显示类似如下信息:
HTTP/1.0 200  OK
 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)
还有一个最近下载的页面的列表

Parsing page 
 Found: 356 ref (s)
 http://www.cnn.com/
 http://www.cnn.com/search/
 http:// www.cnn.com/linkto/intl.html
设置
这个程序提供一些参数的设置,包括:
  1. MIME types
  2. 存储目的文件夹
  3. 最大抓取线程数
  4. 等等...

文件类型

爬虫支持的下载下来的文件类型,用户可以添加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的请求到服务器,在以下要求:

GET /CNN/Programs/nancy.grace/ HTTP/1.0
 Host: www.cnn.com
 Connection: Keep - Alive
 
"连接:保活"告诉服务器不会关闭连接, 但服务器的选择,把它打开或关闭它, 但应回复到客户端socket的决定. 所以服务器可以不断告诉客户,他将它打开了包括"连接: 保活"在他的replay如下:

 HTTP/1.0 200  OK
 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)
或者也可以告诉客户它拒绝如下: 
 
HTTP/1.0 200  OK
 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 问题:

当我开始这篇文章典我所用webrequest类以及webresponse像以下代码:
WebRequest request =  WebRequest.Create(uri);
 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();
本程序运作良好,但它有一个非常严重的问题,因为webrequest类函数getresponse门锁进入 所有其他进程webrequest告诉纳莉反应关闭的最后一道防线,在前面的代码. 等我看到总是一个线程下载,而其他人正等着getresponse. 要解决这个严重的问题,我有我的执行两班mywebrequest和mywebresponse. mywebrequest和mywebresponse使用Socket类来管理连接,而是类似webrequest和webresponse但却支持 并行反应在同一时间. 此外mywebrequest支持建旗keepalive支持keep-alive连接. 所以,我的新的代码whould像:
 request = MyWebRequest.Create(uri, request/**//*to Keep-Alive*/ , KeepAlive);
 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完成,如下列代码:

 /**//* reading response 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如下列代码:

private int  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);
 }
}
如果theadcode增加了用户的代码创建一个新的线程,或暂时中止线程. 其他,树叶制的过程suppending额外的工作线程threads自己如下. 每个工作线程有一个名字等于其指数的线程数组. 如果线程名称值大于threadcount继续其工作,并进入中止模式. 爬行深度:它是深入到履带goes,在航行过程. 每个url已有初步深度相当于母公司深度加一, 在深度为0头url插入的用户. 在成交的URL从任何页都插入后,在年底的URL队列 意思是"先入先出"的行动. 和所有线程可插入排队随时在以下部分代码:
void  EnqueueUri(MyUri uri)
{
 Monitor.Enter(queueURLS);
 try
 {
  queueURLS.Enqueue(uri);
 }
 catch(Exception)
 {
 }
 Monitor.Exit(queueURLS);
}

而每个线程可以取出第一url在排队,要求它在以下部分代码:

MyUri DequeueUri()
{
 Monitor.Enter(queueURLS);
 MyUri uri = null;
 try
 {
  uri = (MyUri)queueURLS.Dequeue();
 }
 catch(Exception)
 {
 }
 Monitor.Exit(queueURLS);
 return uri;
}

一个C#写的爬虫程序相关推荐

  1. 先给自己定个小目标,比如写个爬虫程序

    今天要写的是一个最简单的爬虫​. ##目标: 理工新闻栏目--下面的所有文章,抓取到,并且保存起来,今天是用文件的形式保存下来的,也可以直接存到数据库里. 下面介绍开发需要的东西: 1.node.js ...

  2. 一个简单的python爬虫程序

    #简介 在每次论文被拒再投的过程中,都需要查询最近的与自己论文相关的会议列表.每到这种情况,我一遍采用的是遍历会伴www.myhuiban.com的网站,然后逐个查看会议,关注的有三点,投稿日期,cc ...

  3. 一月集 一个会写诗的程序员2019

    冬至 ,昼与惆怅最短,夜与思念最长,愿你一切都好. --光剑 任何年龄的爱情都是合情合理的.心灵的爱情在腰部以上,肉体的爱情在腰部往下.任何年龄段的女人,都有她在那个年龄阶段所呈现出来的无法复刻的美. ...

  4. 二零一九第二天 文/一个会写诗的程序员

    今天是二零一九年 第二天 天气依然阴冷 而我感觉 这新的一年开始 也并没有什么不同 而是,变得更加 凄凉萧条 孤寂寒冷了 "我相信会变,但只是更糟" 一个会写诗的程序员 杭州 20 ...

  5. 听心 文/一个会写诗的程序员

    听心 这温暖在我心间 伴随我想你的每天 那一刻沉重的心 此刻感到从没有的轻盈 你千万要认真对待 一个敏感脆弱的诗人 那颗柔弱的心 它一遇到伤害 就立马化成石块 不过我这颗心没事 我是铁石心肠 也会柔情 ...

  6. 雪夜游西湖记 文/一个会写诗的程序员

    雪夜游西湖记 黯淡冬月夜,天上飘细雪,乘兴游西湖. 风雪湛清,碧波万顷. 断桥边池,败荷零落,枯桐掩映. 残雪亭旁,竟有粉花绽放,白雪映衬,甚是美丽. 望远山,蜿蜒綿亙,曲线似少女峰. 高楼立矗,万家 ...

  7. 《拾叶集》一个会写诗的程序员 二零一八年十月八日

    图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 又是一个秋夜 我在听秋虫鸣 夜渐深了 我在听秋虫鸣 人睡到忘记这个真实世界的时候 就会有另外一个虚假 ...

  8. python编写爬虫的步骤-python学习: 写网络爬虫程序的三个难点

    写爬虫,是一个非常考验综合实力的活儿.有时候,你轻而易举地就抓取到了想要的数据:有时候,你费尽心思却毫无所获. 好多Python爬虫的入门教程都是一行代码就把你骗上了"贼船",等上 ...

  9. 不喜欢写测试的朋友看过来,与你分享写测试的经验 做一个爱写测试的程序员...

    自从掌握了单元测试的要领之后,经常写测试,做测试,也非常喜欢做单元测试.我的文章<数据采集:完美下载淘宝Ip数据库 简单的程序节省60元人民币而不必购买数据库>中的代码,也是个测试方法,源 ...

最新文章

  1. python使用matplotlib可视化、移除可视化图像坐标轴的刻度线和标签( remove the default axis ticks and labels)
  2. Python之Numpy数组拼接,组合,连接
  3. MongonDB 知识
  4. transformer bert 入门
  5. sql中的indexof,函数介绍
  6. Laravel 5.5 使用 Jwt-Auth 实现 API 用户认证以及无痛刷新访问令牌
  7. Python的MySQLdb模块安装
  8. 解决Windows 10 CPU占用高风扇吵问题
  9. 运用递归将两个链表进行连接
  10. 【论文党福利】如何提取图像中的数据
  11. Linux入门学习(八)
  12. WPF中radiobutton 的 data binding方法
  13. 小米蓝牙键盘怎么连接_【米物蓝牙双模键盘使用总结】连接|操作|按键_摘要频道_什么值得买...
  14. leo-校园文化户口管理系统
  15. python怎么变成动图_python 生成动图
  16. 怎样快速实现两台电脑硬盘文件共享?
  17. # android移动开发——第十三章——个人理财通案例(Eclipse版)
  18. python|爬虫|爬取豆瓣自己账号下的观影记录并可视化
  19. 海报设计之色彩搭配与均衡构图
  20. linux中swi指令,ARM中的SWI指令(转)

热门文章

  1. 计算机颜色管理器,Windows7色彩管理显示器ICC设置方法
  2. 随机抽奖系统 Random类
  3. nodejs+express解决微信公众号token验证失败
  4. 计算机操作系统(八)——并发程序设计
  5. 解决:AWVS(Acunetix)激活频繁失效(仅供学习)
  6. HarmonyOS荣耀8x,不忘老机型 荣耀9X系列被曝今年将升级HarmonyOS
  7. Opencv Python图像处理进阶教程②
  8. sUploadDir
  9. uni-app使用Hbuilder X如何安卓APP打包、发布、运行
  10. JZOJ.4377[GDOI2016模拟3.10]习用之语 解题报告