本来是想把这部分内容放到前一篇《数据抓取的艺术(二):数据抓取程序优化》之中。但是随着任务的完成,我越来越感觉到其中深深的趣味,现总结如下:

(1)时间
     时间是一个与抓取规模相形而生的因素,数据规模越大,时间消耗往往越长。所以程序优化变得相当重要,要知道抓取时间越长,出错的可能性就越大,这还不说程序需要人工干预的情境。一旦运行中需要人工干预,时间越长,干预次数越多,出错的几率就更大了。在数据太多,工期太短的情况下,使用多线程抓取,也是一个好办法,但这会增加程序复杂度,对最终数据准确性产生一定影响。
     所以,千万不能看不起小小的调优,那怕只是0.02秒一次的改进,对于上万乃至千万级别的数据量而言,都可以节省数小时甚至数天的时间,同时也能在某种程度上降低出错的概率。于是,我得出一个原则:“程序优化要力求极致”。
     这是“软”的因素。

(2)效率
      呵呵,效率可以被视为是时间的另一种说辞,虽然这种说法并不全面。在这里我所谓的效率,指的是I/O效率。一旦算法优化已经完善,那么还有什么可以提高效率以缩短程序完成的时间呢?这回抓取,我使用的是SSD硬盘,与实验室的机械硬盘相比(可惜用的是笔记本),速度得到了明显的提升。
     我感觉以后处理大规模数据(或“大数据”),需要使用内存数据库。首先,使用数据库而非Excel就已经能够提高效率,如果再采用内存数据库的话,效率将得到更大幅度的攀升。当然,如果你机器内存足够大的话,可以试试Redis。
     SSD硬盘与内存数据库是特别重要的两个方面。但我们也不能忽略CPU,一个好的CPU就是一颗“强劲的心”,但是笔记本的CPU一般都做过“调优”(想想吧:有限的电力,为了延时,只好吃一口“蓝色小丸药”),我觉得I3处理器性能有些低下,如果不是I5+还不如直接用奔腾双核结构。当然最好是运行在台式机、工作站、服务器甚至云系统中。嘿嘿,下次我要试试Sae。
     这是“硬”的因素。

(3)了解你的对手
     常言道,知己知彼百战不殆。做数据抓取,最重要的就是了解你的对手。这一轮,我很倒霉,我碰到了Google姐,由于我的数据只能从Google上析出,所以没的选择,不过虽说她也把我折腾地够呛,但最终我还是享受到了“神秘的”幸福。
     这是“人”(目标对手)的因素。
     八卦一下我和Google姐一夜大战的六个回合吧。
     第一回合,简单地使用urllib2或其它库是不行的,我的血泪史说明,搜索超不过8个Google就强行和你失去连接了。重新搜这几个还可以,但接着第8个往后走,她就又不干了,还是不能连接。姐姐一脸坏笑地看着我,就这点小把戏,还想过来扒我裤子?我十分汗颜,责怪自己没能正确估计出她那雄壮的腰围。
     第二回合,我开始设计欺骗Google。由于人类访问网站,不会有极短而均匀的点击行为,所以我设计了一个小函数,每次搜索完毕,随机暂停1~3秒,这是在模仿人的访问模式。不幸再次降临到我身上,姐姐的坏笑依旧,我也没能触动到她的一根毫毛。
     第三回合,我生气了。我准备上代理,我的战术很简单,弄一大堆代理站成一队,排得一眼望不到边,失去连接我就换一个代理,再失去就再换,吓死她!结果这条路仍没走通,这种硬碰硬的方式不是好方式,姐姐其实是过来人,从小吓大的,这招没用:一方面是我找到的可用代理IP实在有限,根本不够换的;另一方面,代理的引入大大增加了程序出错的可能性,因为代理本来就不都靠谱。好几次,不是Google断掉的而是代理跑着跑着给断的。
     第四回合,我没气可生了。我开始深入研究,静下心来耐心学习这个领域的知识,仔细欣赏、研究Google这个熟女。功夫不负有心人,我找到了终极解决方案:浏览器。不必再模拟手工行为(Mechanize),咱就直接用浏览器访问,看她还有什么话说。其实这样的方法很多,核心就是使用测试工具。所以你也可以使用selenium或Windmill,也可以使用QT+Webkit等等就不一一列举了。当然,我用的是Selenium+Phantomjs+BeautifulSoup,后来想想也不用BS,直接正则算了,但毕竟BS比较简单哈。
     第五回合,我编写好程序,进行优化,特意选择深夜悄然开始执行。我用的校园网,晚上网速极快,所以嗖嗖地抽取出结果,但有个问题,就是Google对单IP短时持续访问请求是有限制的,这个限制不论是蜘蛛还是人都绕不开,她会证给你一个填写验码的证明页面,上书“不能未婚先孕”,到街道办开了证明才能让你继续。唉,对此,一开始,我太年轻,真没什么办法,只能在程序中识别这个页面,然后保存结果退出。再重新启动继续这个断点接着执行。不过由于每隔70、80个就会因验证码页面停掉一次,我的抓取速度一直不高,因为需要手工干预。
     [虚拟第六回合,我用一个新线程执行抓取,当这个线程遇到验证码时,保存、退出并回馈断点参数,然后带入参数重启一个新的线程。时间原因,还没如此实现。]
     第六回合,较长的抓取时间,我在傻傻等待,时不时断点续抓一次。我受不了了,我开始做点其他的事情,比如浏览新闻、听听音乐、看看电影什么的。终于,我发现,竟然碰不到验证码页面了。这点十分惊喜,仔细研究了这个过程,我得出结论,抓取时其他程序对抓取程序网速的影响,正好让Google认为这似乎就是人在搜索,所以从95个左右开始,到最后的152个的共词搜索,还是那个程序,但由于我的其他休闲活动导致后半程一次都没有遇到验证码。Oh Yeah~神马重启一个新线程,NND都是浮云,一边爬取数据一边轻松生活才是王道。(只是别因下片把网速全占满了,使你的抓取程序一直处于一个等待状态,就像《潜伏》最后一幕一样,翠平抱着孩子一直在等待一个永远不能归来的人)。所以要向普天下的男人们大声说:不要那么直接,一上来就只知道抓,一起多看看电影、多听听歌,效果会更好!难道不是么?

      最后,我站在高岗上,手握着Google的内裤,让它尽情随风舞动......

      这就是技术,这也是生活!

http://blog.chinaunix.net/uid-22414998-id-3696649.html

数据抓取的艺术(三):抓取Google数据之心得的更多相关文章

  1. 数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置

     数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置 2013-05-15 15:08:14 分类: Python/Ruby     数据抓取是一门艺术,和其他软件不同,世界上 ...

  2. python3下应用pymysql(第三卷)(数据自增-用于爬虫)

    在上卷中我说出两种方法进行数据去重自增,第一种就是在数据库的字段中设置唯一字段,二是在脚本语言中设置重复判断再添加(建议,二者同时使用,真正开发中就会用到) 话不多说先上代码 第一步: 确定那一字段的 ...

  3. [转载] Google数据中心网络技术漫谈

    原文: http://www.sdnlab.com/12700.html?from=timeline&isappinstalled=0#10006-weixin-1-52626-6b3bffd ...

  4. 测试必备工具之抓包神器 Charles 如何抓取 https 数据包?

    之前发过一篇文章讲解了Charles抓包工具的基本使用(有需要的小伙伴可以去看上一篇文章),  讲的数据包主要是http协议,大家可以看到数据包并直接显示具体详细的内容: 但是如果抓到的是https的 ...

  5. 使用Fiddler抓取微信饿了么小程序数据

    使用Fiddler抓取微信饿了么小程序数据 准备 一部装载Android 7.0以下的手机:此处使用华为荣耀5x 微信小程序7.0以下版本:此处为6.6.7.此处可通过豌豆荚应用下载. 安装好的Fid ...

  6. scrapy抓取拉勾网职位信息(七)——数据存储(MongoDB,Mysql,本地CSV)

    上一篇完成了随机UA和随机代理的设置,让爬虫能更稳定的运行,本篇将爬取好的数据进行存储,包括本地文件,关系型数据库(以Mysql为例),非关系型数据库(以MongoDB为例). 实际上我们在编写爬虫r ...

  7. Fiddler抓取https请求 & Fiddler抓包工具常用功能详解

    Fiddler抓取https请求 & Fiddler抓包工具常用功能详解   先来看一个小故事: 小T在测试APP时,打开某个页面展示异常,于是就跑到客户端开发小A那里说:“你这个页面做的有问 ...

  8. fiddler抓包工具 https抓取 ios手机端抓取

    fiddler抓包工具 https抓取 ios手机端抓取  转载链接:https://www.cnblogs.com/bais/p/9118297.html   抓取pc端https请求,ios手机端 ...

  9. Heritrix源码分析(九) Heritrix的二次抓取以及如何让Heritrix抓取你不想抓取的URL

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/644396       本博客已迁移到本人独立博客: http://www.yun5u ...

随机推荐

  1. SecurityError: Blocked a frame with origin from accessing a cross-origin frame

    问题描述:浏览器报错I am loading an <iframe> in my HTML page and trying to access the elements within it ...

  2. eclipse Maven 使用记录 ------ 建立app项目

    maven 项目构建工具 , 如今已逐渐取代ant的笨拙配置方式 ,使项目管理更加简单,规范,结构更加清晰,这里记录跟eclipse集成的一些步骤  1.从apache maven项目下下载maven ...

  3. Java后台测试技巧

    [本文出自天外归云的博客园] 问题 很多测试是和后台代码逻辑相关的,比如: 接口测试 接口文档里面包含了接口的url.用途.一些上行参数和下行参数的描述信息. 但是要想知道这些参数取值的来龙去脉,还是 ...

  4. pandas的连接函数concat()函数

        pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,   keys=None, levels=No ...

  5. ActiveMQ入门实例(转)

    转载自:http://www.cnblogs.com/xwdreamer/archive/2012/02/21/2360818.html 1.下载ActiveMQ 去官方网站下载:http://act ...

  6. [Linux基础环境/软件]Linux下安装resin web服务器(涉及gcc、jdk环境部署)

    由于Ubuntu自带是没有jdk和gcc编译器的,而安装resin需要C编译器和jdk的支持,而且resin本身是java写的.另外我本身的网站是zip打包的,所以linux也要安装了gcc.jdk. ...

  7. C语言 · 错误票据

    历届试题 错误票据   时间限制:1.0s   内存限制:256.0MB        锦囊1 排序. 锦囊2 把所有的编号排序,再扫描一遍数组,即可找到重复的和遗漏的.   问题描述 某涉密单位下发 ...

  8. Java并发编程 ReentrantLock 源码分析

    ReentrantLock 一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大. 这个类主要基于AQS(Abst ...

  9. win10老提示系统错误,要注销

    win10老提示系统错误,要注销? 开启user manager 服务(对我没用) 用administrator账户(成功,不提示了) 或者创建一个新账户(未测)

  10. iis7.5 发布mvc出错的解决办法

    发布mvc,配置iis7.5时,遇到这个错误. xxxx'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b ...