前一段时间因为一个机会,写了好长一段时间爬虫,不过没有写什么复杂的爬虫,比如说爬微博之类的,主要还是解析HTML。这里主要对我之前的写的东西总结一下。
爬虫说到底其实非常简单,就做两件事情:第一件事情,下载网页;第二件事情,分析下载的网页。当然,如果有其他要求,做起来还是要稍微注意一下的。
开发语言
我一直以来用的是python,因为写起来简单,配置也简单。然后我就用python写了各种各样的简单的爬虫,比如爬新闻标题,爬图片,爬商品信息等等。但是最近我在爬取一个购物网站的时候出现了问题,爬取1W条数据花了1个多小时,太慢了,特别是最后分析html,虽然Bs挺好用的,但是确实太慢了。所以我把python换成了java。
我发现在下载的时候其实语言差别不大,只要线程足够,是能够把IO跑满的,也就是极限了。这块儿用什么语言无所谓。
但是在下载结束后需要缓存下载的页面和分析数据,就有区别了,因为python的全局锁和性能的问题,会发现要多线程分析数据确实写的很蹩脚,前段时间在源创会的时候一个大牛也说到这个,不建议使用python处理大量的CPU并行的业务,效率太低了。
流程
写爬虫的时候我是用了生产者-消费者模型,首先下载网页,把网页丢到队列里面,在用一个线程专门储存这些网页,这样有专门下载页面的,有专门储存网页的,也有专门分析的,完全可以并行来做,可以把网络、硬盘、CPU一起全部利用起来,效率会更高。
当然这里面还是要考虑代价的问题,因为我爬取得数量没有太多,只是1W条左右,所以我的程序把分析放在了最后,等爬取网页结束了再分析,这样程序简单,思路也简单,出错也少。
问题
一般爬取网页都是直接解析网页,当然很多时候有一些问题需要解决,因为有些网页是用js生成的,一般说来用js生成的很多都可以找到API直接解析服务器返回的数据,效率会提升好多。当然也可以用webkit库来模拟浏览器解释js,这样的话难度就加大好多:
- 效率降低了很多,加载html需要时间,解释js运行也需要时间,要慢将近2个数量级
- 多线程多进程使用特别麻烦,因为要多开webkit,并行运行,内存控制很容易出现问题。
- 需要等待js执行,需要调试各种bug。
- 资源利用不能忍受,经常发现跑10个进程CPU和内存就跑慢了,这是不能忍受的。
当然如果时间来得及,是在PC上跑,可以接受,但是放在服务器上,基本可以换方案了。
所以这里推荐在写爬虫之前先抓抓包,看看有没有什么js在和后台通信,也许这个通信的api就是你想要的。
最后
对于爬虫而言,最重要的还是网络环境要好,而且一定要考虑超时的问题,这是爬虫的稳定性所在。当然我也有在想能不能再进一步节省资源,只下载一部分html,这是我下一步可能要做的,如果可以,能够定位,那么性能还会大大提升。
我把我之前的爬虫都放在了Github上了,各位看官有需要的可以自己下载看看。
我的Github