计算机+技术+世界我爱编程DataAn

优化爬虫初级篇

2017-08-10  本文已影响214人  陈思煜

优化爬虫初级篇

前记:之所以说是初级篇,是我现在用的爬虫最多也就是十万级数据,数据量还是不大,所以以下内容还是我实际遇到需要优化的内容或者网上看到的一些文章,该文章很多内容来自于网上,主要是做记录和写下个人理解。因为主要是记录,所以大多是只是阐述下有这个方法,具体还需要百度等去了解

1.增加爬行速度

爬虫是需要访问网络的,所以速度会比写入数据还慢,数据量少的话爬虫速度还看不出有多慢,当数据量多起来的时候,少则要几天,多则要几周的时间。

1.1 分布式爬虫

分布式爬虫,简单来说就是本来由一台电脑运行的爬虫任务分给其他电脑一起运作,从而达到提升爬虫速度。
分布式爬虫主要有主从模式和对等模式,两种模式都有对应的缺点。例如主从模式的爬虫速度会因为控制节点的瓶颈限制到速度(因为控制节点上面有URL管理器、数据存储器和控制调度器,而其他爬虫节点只是从调度器那里领取任务再执行任务(这里有一个简单的分布式爬虫主从模式的栗子,书里第7章的内容)),而对等模式会因为当有一台服务器死机或者添加新的服务器,那么所有URL的哈希求余的结果就都要变化。也就是说,这种方式的扩展性不佳,不过对等模式也有进行改进。这两种方案的对比和结果图示可以参考这里
虽然我现在没有那么多电脑/服务器来跑分布式爬虫,但是可以通过一些资料了解到分布式爬虫的存在和大概结构,运行原理。目前网上的资料大多都是采用主从模式的。所以对等式我也只是了解一下,并没有找到案例(网上基本都是Scrapy+Redis的主从分布式爬虫,我试着跑一下,发现数据量还不会造成瓶颈- -估计要上千万的数据量才会有瓶颈吧)

1.2 榨干性能去爬虫

首先先了解几个概念

说了关于异步和爬虫的文章
说了多线程与多进程的
说了协程与线程的
说了为什么要使用进程+协程的方案,很多人都在使用这种方案
附加:
python3下multiprocessing、threading和gevent性能对比
Multiprocessing基础
如果数据量大了,就要把爬虫大概分为URL访问,网页解析,数据库读写等几大类。
像URL访问,数据库读写可以用线程或者协程。网页解析用进程,同时,URL访问应该使用异步IO,网页访问等待的时间大大大于CPU操作的时间
协程是用户自己来编写调度逻辑的,对CPU来说,协程其实是单线程,所以CPU不用去考虑怎么调度、切换上下文,这就省去了CPU的切换开销,所以协程在一定程度上又好于多线程
有些时候线程最多只能开几百个,理论上协程可以开无数个(不过会遇cant watch more than 1024 sockets),如果网速不够的话,其实两个的速度差不多
有时还需要考虑下网络IO电脑配置情况(如CPU核数,内存大小等)

2.解决反爬

爬虫速度上去了,基本都会跟反爬见面了。爬虫与反爬的斗争从有爬虫就开始了,虽然最后都是爬虫的胜利,但也付出了很多代价
要解决反爬虫,需要先了解有哪些反爬措施,反爬措施有以下几种:

了解了一些反爬措施后,我们可以来研究如何解决反爬了。

2.1 解决验证码问题

2.2 ip问题

通常网站都会自行判断同一个IP的访问在一定时间内的访问速度,如果过高时,服务器就会拒绝给这个IP发送信息
解决方法有以下几种:
-Tor 代理
这个可以让你匿名浏览,可以对访问的网站隐藏IP地址,但是他的访问速度比较慢,一般很少人考虑用到

2.3动态页面加载问题

遇到一些需要动态加载的页面可以使用selenium+PhantomJS来解决,不过PhantomJS已经停止维护了,而我经常使用selenium+chrome,听说最近有个Headless Chrome这个网页也有介绍官方文档请点击里(这个网页并没有问题,自行解决)不过我还没了解。。
selenium可以对元素进行选取,可以对页面进行操作等等,几乎我们在页面进行的操作他都可以进行操作,如果要深入了解的建议访问官方文档(英文的)或者可以看看这篇文章了解一下
一般selenium+PhantomJS容易被反爬识别到,不建议使用了。。这种爬取方法可以说比较万能,但是速度有点慢

3数据库选择(非次要)

一开始会总犹豫我爬取的数据放哪里好。现在觉得都无所谓了。
因为前面已经说过了,我现在爬取的数量只是十万级别,用哪个数据库都差不多。随心,不过这里放一下看的一些文章。反正我喜欢用mongoDB,不过要注意NOSQL虽说是非关系数据库,不过不是说没关系。NOSQL是 NOT ONLY SQL的意思,这一点要注意下
介绍了关系型和非关系型数据库的特点
同样是说两大类数据库的区别,不过更详细,推荐看这个
顺便放一个说到倒排索引的文章大型数据读写时可以用到倒排索引。起这名字的人好奇葩,如果翻译为互换位置索引我还是容易理解,翻译为倒排,我以为是从后面数过来- -
这篇文章讲了下关系型数据库的限制以及发展(简述)
最后推荐下MongoDB的中文社区点击这里跳转

我的博客

上一篇 下一篇

猜你喜欢

热点阅读