近期找工做略不顺。技术无用。晚上写下了这点东西。css
首先说下最近在找工做的x的大概相关技术加点路线。py 3年+,linux平常熟练,限于不擅web、手机app开发,一直无太好的可展现的东西。前段时间从一家小公司离职。年前投下,没啥的话,年后再看下。先投的py爬虫的,没合适的再看运维和py相关其余。java
正文开始前略吐槽下,我以前工做的小公司,在我去以前,仍是多线程urllib爬正则解析,网页编码解析从GBK,UTF8依次猜。他有点强让我走了。node
我开始大量使用scrapy时,scrapy已经是0.16版。这个版本相对比较成熟,该版本持续了近一年时间,13年夏发布0.18版。在网上搜scrapy资料,中文的相对较少,为数很少的几篇也多写于scrapy较早的版本(提醒看资料注意发布时间)。从旧资料看,早期的scrapy,尚未dns解析缓存,url去重等功能。到0.16时,scrapy已基本成型,差的几个功能(如HTTP长链接,仿浏览器缓存机制(RFCXXXX)的CACHE)陆续在0.18,0.20里面上实现了。Scrapinghub(写scrapy的人搞得公司)上的产品也更丰富了。python
scrapy的优势在于成熟完善,定制开发快。linux
scrapy对比其余我所知的定制爬虫解决方案。主要对比python内的几个方案。git
JAVA:nutch,hetrix...etc。这几个更适合作通用爬虫或少许的定制爬虫,相对scrapy优势是资料比较多,成熟。不过用java系的写大量定制爬虫应该比较痛苦。github
Ruby:不了解,仅据说ruby有个爬虫库。web
Node.js:遇到有个初创团队用node.js写的,负责人有scrapy(<0.16),gevent经验。不了解。面试
python:gevent及其余py的爬虫框架。稍后会详细描述这部分。redis
对于gevent上写爬虫的各位,我只能说大家有实力,大家为什么要造轮子,大家确定有本身的理由的,推荐参考下scrapy造轮子。gevent写爬虫大概的方案是gevent+requests+一个队列库(redis,beanstalk.etc.)。须要注意的点和坑有以下一些。
0,gevent使用协程,monkey_patch后一些调试方法不可用。
1,requests的编码检测是不符标准的,他有两个编码,一个是http head里面的编码,另外一个是依据网页body的编码。标准是网页内容声明的编码优先于http头的编码,requests没有作这个考虑,老是使用head里面的编码。在head和body编码声明不一致时可能出现编码错误。
2,gevent的同步机制略少,某些状况下协程同步效率低。这个是我在写http代理调度器(相似Crawlera)的东西时遇到的。http代理调度器我下面会说起。
3,其余各类细节。太多。如requests开gzip,requests链接池等等。太多太多。
gevent相对于scrapy的优势有:
1,若是涉及到底层定制 ,gevent比scrapy所用的twisted简单。我曾想给scrapy嵌一个http代理调度功能,发现略难,须要很了解twisted。
2,若是你只须要不多的几个简单爬虫,你可能以为gevent用着更顺手(但scrapy也很容易)。对于纯下载网页,用gevent实现比scrapy快,毕竟scrapy还有其余功能,但这有个前提,你有很高很高的带宽,要先达到scrapy的下载页面速率上限。
python还有其余几个爬虫框架,我都大体看过源码。有个框架有个让你人工输验证码的demo(名字忘了)。其余没什么特别的了。
scrapy经验,资料
资料:官方文档,http权威指南,一些博文。
看文档时仔细点,不少功能都有。
scrapy github帐号的各种repo(https://github.com/scrapinghub)有不少好东西,如:
1,scrapyjs,splash:爬虫遇到的js问题的解决方法(JS解析会在下面说起)
2,webstruct...etc:机器学习,模糊匹配等用来解析网页内容的。
3,etc...
scrapy有个SEP相似PEP的,能够一看,也在github的仓库。
留意scrapy的博客http://blog.scrapinghub.com/
wiki:https://github.com/scrapy/scrapy/wiki
scrapy公司(http://scrapinghub.com/)的产品:
1,定制爬虫(让scrapy公司帮你写爬虫而后交付你)
2,scrapy cloud(提供跑爬虫的服务器(scrapyd))
3,autoscraping(点击须要内容便可实现爬取)
4,crawlera,解决爬网站的ip限制问题(我有一个相似功能的本地版http代理调度器及大量代理)。
一些常见问题,经验:
0,了解scrapy已经作过的功能,优化等。。。防止重复造轮子,如,去重,编码检测,dns缓存,http长链接,gzip等等。
1,JS相关。
这个是被问的最多的。看具体状况解决。可模拟相关js执行、绕过,或直接调浏览器去访问。本身用一个JS引擎+模拟一个浏览器环境难度太大了(参见V8的DEMO)。
调浏览器有不少方法。难以细说,关键字以下,selenium,phantomjs,casperjs,ghost,webkit,scrapyjs,splash。一些细节如关掉CSS渲染,图片加载等。只有scrapyjs是彻底异步的,相对是速度最快的,scrapyjs将webkit的事件循环和twisted的事件循环合在一块儿了。其余的方案要么阻塞,要么用多进程。简单的js需求(对效率要求不高)随意选,最优方案是scrapyjs+定制webkit(去掉不须要的功能)。调浏览器开页面是比较耗资源的(主要是cpu)
2,内容解析。
XPATH就能够了,感兴趣能够看下pyquery,css选择器。
若是想得到网页对应的txt,能够调浏览器,有个相似plain_txt的接口能够获取网页保存成txt。
模糊匹配参考scrapy github里面几个库,机器学习不必定好用(效果问题,人工问题-须要训练)。还有写些正则去模糊匹配。
新闻相似的正文提取有readability,boilerplate。
3,分布式。
首先考虑按任务(目标)切分,而后让不一样目标的爬虫在不一样机器上跑
彻底的对等分布式(多爬虫爬一个目标),把任务队列替换掉爬虫改改便可。github里面有几个现有的实现参考。
分布式需求多是伪命题。想清楚为什么要分布式。硬件够不够,像什么拿一个不支持持久化的url队列的爬虫说量大须要分布式的,我只能默念,你为什么这么吊。
4,部署,调度
部署推荐scrapyd。这也是官方推荐的方法。
大量爬虫的调度,这个目前(13-10)没有现成的合适方法,指望是实现爬虫的某些配置放数据库,提供web后台 ,而后按配置周期、定时运行爬虫,终止,暂停爬虫等等。能够实现,但要本身写很多东西。
5,ip限制问题
买的起大量ip的可买(买大量同网段爬可能致使整网段被封)。
找大量免费的开放http代理,筛选可用的,免费开放代理不可靠,写个调度机制,自动根据成功次数,延迟等选择合适代理,这个功能难以在scrapy内实现,参考scrapinghub的crawlera,我完成了一个本地版。
6,url去重。
若是有千万级的URL须要去重,须要仔细看下scrapy的去重机制和bloom filter(布隆过滤器)。bloomfilter有个公式能够算须要多少内存。另bloomfilter + scrapy在github有现有实现能够参考。
7,存储。
mongodb,mongodb不知足某些功能时考虑hbase,参考http://blog.scrapinghub.com/2013/05/13/mongo-bad-for-scraped-data/
8,硬件扛不住别玩爬虫。。。曾在I3 4G 1T上跑爬虫。卡在磁盘io(量大,磁盘io差,内存低),出现内存占用飙升。很难调试(调试爬虫看实际跑耗时较长),初步觉得是爬虫有问题内存占用高致使数据库卡。调试结果确认为,配置低量太大,致使数据库慢,数据库慢以后爬虫任务队列占满内存并开始写磁盘,又循环致使数据库慢。
9,爬虫监控
scrapyd自带简单的监控,不够的话用scrapy的webservice本身写,暂无(13.10)现成的
9,=。=想到再补充。
最后说个故事。
面试的时候注意点到为止。几个雕坐在一个地方问了ban一下午的爬虫相关各类问题、方案、细节,还准备让我写个DEMO,加来回快一天了。