爬虫性能:NodeJs VS Python

早就听说Nodejs的异步策略是多么的好,I/O是多么的牛逼……反正就是各种好。今天我就准备给nodejs和python来做个比较。能体现异步策略和I/O优势的项目,我觉得莫过于爬虫了。那么就以一个爬虫项目来一较高下吧。

爬虫项目

众筹网-众筹中项目 http://www.zhongchou.com/brow…,我们就以这个网站为例,我们爬取它所有目前正在众筹中的项目,获得每一个项目详情页的URL,存入txt文件中。

实战比较

python原始版

实验5次的结果:

python多线程版

实验五次的结果:

这个多线程并没有优势,经过 #① 的注释与否发现,这个所谓的多线程也是按照单线程运行的。

python改进

单线程

首先我们把解析html的步骤改进一下,分析发现

更好,因为它是直接找 a ,而不是先找 div 再找 div 下的 a
改进后实验5次结果如下,可见有进步:

多线程

修改 getItems(urllist)getItems(urllist,thno)
函数起止加入 print thno," begin at",time.clock()print thno," end at",time.clock()。结果:

可见这些线程是真的没有并发执行,而是顺序执行的,并没有达到多线程的目的。问题在哪里呢?原来
我的循环中

两行代码是紧接着的,所以新的线程会等待上一个线程执行完毕才会start,修改为

结果:

反思

上面的的多线是并发了,可是比单线程运行时间长了太多……我还没找出来原因,猜想是不是beautifulsoup不支持多线程?请各位多多指教。为了验证这个想法,我准备不用beautifulsoup,直接使用字符串查找。首先还是从单线程的修改:

实验3次,结果:

然后对多线程进行修改:

实验三次的结果:

可见多线程确实比单线程快好多倍。对于简单的爬取任务而言,用字符串的内置方法比用beautifulsoup解析html快很多。

NodeJs

实验五次的结果:

可见同样是用解析html的方法,nodejs速度完虐python。字符串查找呢?

实验五次的结果:

可见和解析起来的时间是差不多的。

综上

由我自己了解的知识和本实验而言,我的结论是:python用上多线程下载速度能够比过nodejs,但是解析网页这种事python没有nodejs快,毕竟js原生就是为了写网页,而且复杂的爬虫总不能都用字符串去找吧。

1 2 收藏 6 评论

相关文章

可能感兴趣的话题



直接登录
最新评论
  • 笠翁对韵   2016/09/03

    结论错误,用错了html parser,用lxml,比nodejs快

  • Jackeriss   2016/09/04

    错误的比较就不要发了。

    • iPytLab 学生 2016/09/05

      有什么遗漏或者问题欢迎具体指出哈,这样可以共同学习下。毕竟这种比较根据每个人的情况,不可能很全面会有遗漏和考虑不周全的地方。:)

  • xq5he   2016/09/04

    这个对比实验有点粗糙……写文件的时间被计算在总数里了,而且python用的是 append fs 用的是 write;html的parser 不一样;最重要的是计时 python 用的clock which is CPU time…… js用time是 current time since Epoch

  • 韩子迟 web 工程师 2016/09/05

    引了 cheerio 却没有用,也不知道说什么好了。。

  • 然而这次比较完全没有任何结论性成果,只能说明bs4这个纯python包的性能问题,建议用lxml 不过之前看过文章显示nodejs的爬取效率与python用lxml的效率没多大差别,

跳到底部
返回顶部