社区活跃度或者贡献愈来愈受到重视,每每会做为得到工做或者承接项目的加分项。为了方便用户展现本身的社区资料,雨点儿网中增长了一个社区爬虫功能。html
当前只爬取了用户主页上一些简单的信息,若是有需求请提到咱们的项目议题中java
效果以下:python
代码放在了github上,源码git
如图所示,在以前的架构上(http://segmentfault.com/a/1190000003808733),我增长了橙色虚线框
内的部分,包括:github
scrapy是一个python爬虫框架,想要快速实现爬虫推荐使用这个。chrome
能够参考以下资料自行学习:json
一个简单明了的入门博客,注意:博客中scrapy的安装步骤能够简化,直接使用 pip install scrapy
,安装过程当中可能会缺乏几个lib,ubuntu使用 apt-get install libffi-dev libxml2-dev libxslt1-dev -y
mongo很是适合存储爬虫数据,支持异构数据。这意味着你能够随时改变爬虫策略抓取不一样的数据,而不用担忧会和之前的数据冲突(使用sql就须要蛋疼的修改表结构了)。
经过scrapy的pipline来集成mongo,很是方便。
安装mongo
apt-get install mongodb pip install pymongo
在编写爬虫的过程当中须要使用xpath表达式来提取页面数据,在chrome中可使用XPath Helper来定位元素,很是方便。使用方法:
打开XPath Helper插件
鼠标点击一下页面,按住shift键,把鼠标移动到须要选取的元素上,插件会将该元素标记为黄色,并给出对应的xpath表达式,以下图:
在爬虫程序中使用这个表达式selector.xpath(..../text()").extract()
编写好爬虫后,我门能够经过执行scrapy crawl spidername
命令来运行爬虫程序,但这还不够。
一般咱们经过手动或者定时任务(cron)来执行爬虫,而这里咱们须要经过web应用来触发爬虫。即,当用户更新绑定的社交帐号时,去执行一次爬虫。来分析一下:
爬虫执行过程当中会阻塞当前进程,为了避免阻塞用户请求,必须经过异步的方式来运行爬虫。
可能有多个用户同时更新资料,这就要求可以同时执行多个爬虫,而且要保证系统不会超载。
能够扩展成分布式的爬虫。
鉴于项目当前的架构,准备使用celery来执行异步爬虫。可是碰到了两个问题:
scrapy框架下,须要在scrapy目录下执行爬虫,不然没法获取到settings,这个用起来有点别扭,不过还能解决。
celery中反复运行scrapy的爬虫会报错:raise error.ReactorNotRestartable()
。缘由是scrapy用的twisted调度框架,不能够在进程中重启。
stackoverflow上有讨论过这个问题,尝试了一下,搞不定,放弃这个方案。若是你有解决这个问题的方法,期待分享:)
scrapy文档中提到了可使用scrapyd来部署,scrapyd是一个用于运行scrapy爬虫的webservice,使用者可以经过http请求来运行爬虫。
你只须要使用scrapyd-client将爬虫发布到scrapyd中,而后经过以下命令就能够运行爬虫程序。
$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=spider2 {"status": "ok", "jobid": "26d1b1a6d6f111e0be5c001e648c57f8"}
这意味什么:
爬虫应用和本身的web应用彻底解耦,只有一个http接口。
因为使用http接口,爬虫能够放在任何可以被访问的主机上运行。一个简易的分布式爬虫,不是吗?
scrapyd使用sqlite队列来保存爬虫任务,实现异步执行。
scrapyd能够同时执行多个爬虫,最大进程数可配,防止系统过载。
欢迎使用咱们的爬虫功能来收集社交资料。
成为雨点儿网用户,进入用户主页,点击编辑按钮
填写社交帐号,点击更新按钮
爬虫会在几秒内完成工做,刷新我的主页就能看到你的社区资料了,你也能够把我的主页连接附在电子简历中哟:)