Ruby 想用 epoll 做个高并发爬虫,有好的开源代码推荐学习下吗?

nameofhsw · June 29, 2015 · Last by yqwoe replied at May 01, 2020 · 3588 hits

想利用 eventmachine 做一个 http 的高并发爬虫程序,但是没有太多头绪 所以想看看大家有没有开源的软件可以推荐我学习一下。

或者简单的如下是否可行:

def http_oper(rul)
   f = Fiber . current
   http = EventMachine :: HttpRequest . new ( url , : connect_timeout = > 10 , : inactivity_timeout = > 20 ) . get 
   http . callback { f . resume ( http ) }
   http . errback    { f . resume ( http ) }

   Fiber . yield

   if http . error
     p [ : HTTP_ERROR , http . error ]
   end

   http 
end

EM.run {
       while 1
           url = get_url        ## 一个获取目标url的接口,具体实现没写
           Fiber .new{
                  data = http_oper(url)
           }.resume 
       end
       EM.stop
}

哇,这代码排版是按照什么语言规范?(反正不是 Ruby)

我觉得这不是很好的方式。实现复杂,扩展能力有限。

用个 Sidekiq 之类的队列就好了,一般来说一台机器开个几十个 processor 那速度就已经刷刷刷的快了。

真需要非常多并发的的时候多开几台机器(Openstack 动态加 nodes 启动 instances)

#2 楼 @hjleochen 因为机器性能有限,而且还有很多时候需要对收到的数据做解析。 现在在多进程和多线程模式下同步访问对系统压力太大,所以想试试现在这种模式是否能够在保证访问效率的同时,对资源利用进行优化 eventmachine 没看到很多关于客户端的介绍,很郁闷。

那应该用 golang 啊

正在用 gevent 做爬虫的表示:有一天我开了 1000 个协程去爬一个 bbs,对方网站直接 mysql 超出连接数挂了。

然后又爬了个新闻网站,直接被封 IP 了

我代码里到处加上 sleep(2),打断点,浪费了 n 天时间把频率控制下来,调试稳定了,最后发现,尼玛还不如直接同步阻塞爬完一个再爬另一个。。这样对方才不会挂掉。。。。。

要做高并发也不是不可以,你可以多找一些网站来同步爬

EventMachine 已经好久没更新了,建议看看 Celluloid

#5 楼 @est 我不是针对一个网站来爬,是针对 N 个目标来爬

#6 楼 @ylt Celluloid 是多线程框架? 比起自己写的多线程有什么优势?

#8 楼 @nameofhsw Celluloid 是基于 fiber 的 actor 编程模型,方便写高并发的程序

#9 楼 @ylt 我去学习下,感谢

fiber 不能并发执行,根本不能在 IO 阻塞时出让控制权,另外 EventMachine 已经 out 了,不推荐 最简单可以用这个 Parallel 实现 https://github.com/grosser/parallel

require 'parallel'
require 'open-uri'

Parallel.each(urls){|url| open(url).read } 

// 我做过测试,确认可以并发执行。 或者用 beanstalkd 自己来实现,我以前在一个项目中用过 http://www.oschina.net/code/snippet_170216_11284

不过,后来我发现 ruby 爬还是很慢,换 golang 重写了,速度稳定性都爽歪歪。

其实爬虫写不太难写,就是从爬取结果中获取内容的匹配太复杂了,ruby-readability 这样的还是对某些网站无解

写爬虫要啥高并发啊…… 直接同步 fork 得了……

爬虫是一个 IO 侧重应用,占满网络带宽就可以了,数据采集和分析分离去做 IO 利用率就上去了,采集多个网站用多进程模型就行了吧

#14 楼 @jasl 说的对。一台服务器 极限资源 带宽 CPU,进程起再多也没用,再 epoll 也没用。网速不快,网速成为瓶颈。网速太快 cpu 成为瓶颈。用满一个就够了。

用的 sidekiq kimurai

You need to Sign in before reply, if you don't have an account, please Sign up first.