请教网络爬虫模式

  
张高崇  
最近公司要求做一个网络爬虫,现在我采用的是线程池加内存池,并做了3个队列, 一个队列放还没下载的url, 一个放已经下载好的url, 最后放失败的url, 语言是用c作的。没有用别的库。请教大虾们一个问题, 从还没下载的队列中取出一个url后, 线程在生成了一个request后, socket 应该设计成什么模式? 共用一个socket 还是 和线程池一样, 设计一个socket的队列, 每次要发送请求的时候, 从队列中取出一个socket, 然后发送? 搞的我焦头烂额。。谢谢了
  2009年12月2日, 上午10时16分
  
张高崇  
查看个人资料  
 更多选项 2009年12月2日, 上午11时05分

请大家帮帮忙, 在线等

2009/12/2 张高崇 <zhanggc0...@gmail.com>


      
   
  
jrckkyy  
查看个人资料  
 更多选项 2009年12月2日, 上午11时24分

我用的boost,异步io,你可以用select

2009/12/2 张高崇 <zhanggc0...@gmail.com>

> 请大家帮帮忙, 在线等

> 2009/12/2 张高崇 <zhanggc0...@gmail.com>

> 最近公司要求做一个网络爬虫,现在我采用的是线程池加内存池,并做了3个队列, 一个队列放还没下载的url, 一个放已经下载好的url,
>> 最后放失败的url,
>> 语言是用c作的。没有用别的库。请教大虾们一个问题, 从还没下载的队列中取出一个url后, 线程在生成了一个request后, socket
>> 应该设计成什么模式?
>> 共用一个socket 还是 和线程池一样, 设计一个socket的队列, 每次要发送请求的时候, 从队列中取出一个socket, 然后发送?
>> 搞的我焦头烂额。。谢谢了

--

http://hi.baidu.com/jrckkyy

选择百度博客的原因只为更快的CRUD思维上的碎片


      
   
  
xi heng  
查看个人资料  
 更多选项 2009年12月2日, 下午12时19分

最好采用生产者/消费者模式来做
通过生产者提取url
再把url送到消费者那边去爬取
这样有利于做分布式的爬虫,不易被一些自私型网站发现

2009/12/2 jrckkyy <jrck...@gmail.com>

--
blog:http://www.i7xh.com
Twitter:http://twitter.com/i7xh

      
   
  
xi heng  
查看个人资料  
 更多选项 2009年12月2日, 下午12时20分

用c的话
可以去看看libevent的例子
有现成的爬虫

2009/12/2 张高崇 <zhanggc0...@gmail.com>

> 最近公司要求做一个网络爬虫,现在我采用的是线程池加内存池,并做了3个队列, 一个队列放还没下载的url, 一个放已经下载好的url,
> 最后放失败的url,
> 语言是用c作的。没有用别的库。请教大虾们一个问题, 从还没下载的队列中取出一个url后, 线程在生成了一个request后, socket
> 应该设计成什么模式?
> 共用一个socket 还是 和线程池一样, 设计一个socket的队列, 每次要发送请求的时候, 从队列中取出一个socket, 然后发送?
> 搞的我焦头烂额。。谢谢了

--
blog:http://www.i7xh.com
Twitter:http://twitter.com/i7xh

      
   
  
张高崇  
查看个人资料  
 更多选项 2009年12月2日, 下午12时34分

对的, 我现在就是用的 生产者, 消费者的模式来做的, 比如, 一个线程 从队列中取出一个url, 要发一个请求给服务器, 那么 发轻松的socket
该怎么设计呢?
第一:主线程 负责发请求, 也就是说只有一个socket, 主线程收到html后, 唤醒线程池中的一个线程, 进行逻辑处理, 并把html中的url
再次提出, 放到url 队列中。。。如果这样的话 会不会造成线程池的线程一直处于wait 状态。

第2:设计一个socket 队列(不知道可行不可行, 一台电脑), 主线程轮询url 队列, 如果有url, 唤醒线程池中的一个线程,
线程从socket 队列中取出一个 socket, 发请求, 并处理逻辑。把html中的url提出来, 放在url队列中。

请大家帮忙, 如果是第2种, socket 该如何实现。。。谢谢了

2009/12/2 xi heng <ixh.xih...@gmail.com>


      
   
  
xi heng  
查看个人资料  
 更多选项 2009年12月2日, 下午1时17分

我觉得可以不用线程
就用异步的io就可以搞定

2009/12/2 张高崇 <zhanggc0...@gmail.com>

--
blog:http://www.i7xh.com
Twitter:http://twitter.com/i7xh

      
   
  
张高崇  
查看个人资料  
 更多选项 2009年12月2日, 下午1时22分

因为这个程序估计要经常用。。。所以我用的是异步io 和线程都用到了。。异步io 这部分是没有问题了
就是socket 这个问题 。。

2009/12/2 xi heng <ixh.xih...@gmail.com>


      
   
  
张高崇  
查看个人资料  
 更多选项 2009年12月3日, 上午10时07分

请大家帮忙。。。谢谢

2009/12/2 张高崇 <zhanggc0...@gmail.com>


      
   
  
关中刀客  
查看个人资料  
 更多选项 2009年12月3日, 下午1时52分
前阵子正好自己做了一个类似的系统,说说我的架构于实现吧

一整套的框架:一个主要的总控服务器MasterServer,一系列网页爬虫服务器HTTPSpiderServer,一系列网页分析服务器
HTMLFilterServer,一个网页信息管理存储服务器URLServer,一系列索引服务器IndexServer。
网页信息管理存储服务器,使用BDB存储了所有待爬虫的网页,以爬虫但是暂未分析的网页,已经分析提取的网页,每次网页信息管理存储服务器,定时的提取
一批网页通过MasterServer发送给诸多的HTTPSpiderServer来爬虫,并且定时的提取一批网页通过MasterServer发送
给诸多的HTMLFilterServer去分析。URLServer保证网页不会被异常的丢失或者被重复的下载,分析等。所有的Server都是在自
己以前实现的一套库(包含公共代码库和网络处理等,网络是建立在win平台下,IOCP+多线程的异步处理方式)上面开发的,底层都是使用了自己的库,
只需要开发一下上层逻辑即可,很方便。

On 12月3日, 上午10时07分, 张高崇 <zhanggc0...@gmail.com> wrote:


      
   
  
SevenCat  
查看个人资料  
 更多选项 2009年12月3日, 下午2时22分
感觉可以共用一个socket,设计一个发送队列,每次发送请求的时候,把请求打包丢到发送队列中,另一个线程不停的从发送队列中取数据,并发送。

On 12月2日, 上午10时16分, 张高崇 <zhanggc0...@gmail.com> wrote:


      
   
  
jonyare  
查看个人资料  
 更多选项 2009年12月9日, 上午9时36分

crawl - a small and efficient HTTP crawler 用c写的一个 ,Berkeley db 和libevent,自己在
家装没装上http://www.m*onkey*.org/~provos/crawl/<http://www.m%3Ci%3Eonkey%3C/I%3E.org/~provos/crawl/>

2009/12/3 SevenCat <bastet.w...@gmail.com>


      
   
  
femto Zheng  
查看个人资料  
 更多选项 2009年12月9日, 下午12时55分

跑了,问题下载的网页到那去了?只看见一个crawl.db

2009/12/9 jonyare <liufabin66...@gmail.com>


      
   
  
jonyare  
查看个人资料  
 更多选项 2009年12月10日, 下午6时48分

安装成功了??用的Berkeley db 吧
2009/12/9 femto Zheng <femto...@gmail.com>


      
   
  
jyf1987  
查看个人资料  
 更多选项 2009年12月11日, 上午10时05分
频繁开socket是不现实的
要考虑给同一个host的url归到一类来 不关socket访问

On 12月2日, 上午10时16分, 张高崇 <zhanggc0...@gmail.com> wrote:


      
   
  
关中刀客  
查看个人资料  
 更多选项 2009年12月11日, 上午11时15分
那样子是不现实的,尤其是一个分布式的系统中,如果不关闭的话,需要处理很多的事情,例如,每次GET完之后就关闭,那么我的爬虫在收到对方关闭的时
候,就可以认定一个网页完全的接收到了,然后做相应的处理,如果不关闭,自己需要实现很多的事情,有点得不偿失。当然,我在做的时候,每一个爬虫节点服
务器,内存内维护一个近期访问的所有网站对应的ip地址,这样子不需要每次都通过dns来查找,一定时间内没有访问的,自动剔除。

On 12月11日, 上午10时05分, jyf1987 <jyf1...@gmail.com> wrote:


      
   
  
Samuel Ji  
查看个人资料  
 更多选项 2009年12月11日, 下午2时02分

2009/12/11 jyf1987 <jyf1...@gmail.com>

> 频繁开socket是不现实的
> 要考虑给同一个host的url归到一类来 不关socket访问

搭车问一下:对于大规模的爬虫来说,epoll/iocp之类的网络模型也起到跟server一样的作用么?

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值