更新 7月16日18点
现在不会自己写代码调用API的同志们可以直接访问咯
地址 datastack.cc/design
更新一张预览图:
更新 7月16日12点
现在我们可以愉快的使用了,flask API和后台服务已经部署在了服务器上(新加坡)!!!
恩,更新一下,目前已经可以在HTML页面进行数据展示了:
我在说什么
声明:
1.我不是一个标题党
2.我一般只提供干货
事实上,我实在干这样一件事,他大概分为如下几个步骤:
一、获取一些优秀的设计素材的数据
二、存储和筛选这些数据
三、编写一套API提供数据
四、编写一个网页调用API 展现数据
五、编写iso和android客户端展现数据
应用场景:
当你在闲暇的时候,打开手机或者网页,查看一下最近有没有什么好的设计素材或者比较感兴趣的HTML页面。
恩,你可能看到很多,突然发现一个让你眼前一亮的,然后你手藏了他。
有一天你正在写一个HTML页面或者设计产品原型,突然,你的脑子里闪过一些东西,于是你打开了你的手机查看了一下收藏夹......
接下来,我们就来看看,如何实现:
数据获取
首先,数据主要是从各大免费的设计素材资源网站拿到的,这需要用到python爬虫。
其次,这类网站大量的使用了JS来加载内容,我选择selenium+phantomJS渲染JS。
最后,从爬取到的内容内获取想要的,我选择用pyquery来获取html节点(不要问为什么,因为我习惯用jquery!)
存储数据
数据结构
数据结构很简单,我不过就是想获取一张预览图,一个预览地址(或者下载地址),还有标题!
一条数据大概会是这样:
{
"download": "http://www.doooor.com/thread-2762-1.html",
"preview": "http://img.doooor.com/img/forum/201404/16/173909sczpof6sf26eckcf.jpg.thumb.jpg",
"title": "STARS TOUCH 完全扁平化网页设计"
}
数据持久化
我们对数据的存储要求不是很高,因为最近在学习redis,所以就用redis,利用快照持久化!
爬虫的框架
一、我不懂什么框架,而且总体来说,要爬取得网站就那几个。自己编写一下规则就好了。
二、避免重复工作,用redis来存储待爬和爬过的url。
三、分布式? 哈哈,也许,可能大概是支持的吧。
四、效率?使用了selenium和phantomJS,貌似不用谈效率了,不过有些优化的小知识啦!
五、我是怎么实现的:
首先,我定义了一个爬虫服务 service.py,主要作用是连接redis,开始爬取工作,记录工作内容和工作结果。
然后,我写了一个爬虫工具 servicetools.py, 主要作用是模拟浏览器访问url,查找需要的元素和内容。
service.py 管理者-劳动者模式 (管理者Master发布任务,劳动者Work进行具体工作.)
管理者维护一个Redis 的 List 按照先进先出的模式, 每次发布一个url出去
劳动者接收到管理者的url,开始执行网页爬取工作,工作完成后 管理者pop掉这个url
劳动者如果获取的数据是url,则封装成list 提交给管理者, 管理者挨个push url.
servicetools.py(具体的网页爬取工作)
使用phantomJS和selenium结合,使用pyquery进行节点和内容的获取,不同的网站需要不同的规则。
目前实现的功能 和存在问题:
总体来说,运行良好,效率足够(根本不是实时系统嘛)!
额,比较费内存,可以在晚上睡觉之前执行,偶尔会出现假死,主要是phantomJS的优化没做!
如果程序异常推出,再次启动依旧能够继续工作,且不重复之前工作!
API的实现
上面的爬虫运行半个小时之后,大概就会有500多条有效数据,这些数据全部被存在redis里面(hset)。
可以参见我之前的文章快速入门 基于Flask实现Restful风格API,比较详细的介绍了如何使用flask来实现一个restful的API。
这里的flask程序需要从redis拿数据,我自己定义了一个数据源(连接redis分发数据)。
目前已经完成的工作
目前已经基本实现API获取数据,爬虫还正在努力的运行,稳定以后,将会设置系统任务,在每天半夜3点开始,五点结束。
看一张效果图吧:
下一步的工作
继续发现和修补爬虫的bug
增加用户系统和认证机制,这样大家就可以收藏了
租一个云主机(求有需求的伙伴打赏)
编写客户端
公开源代码
最后,如果你对这个项目感兴趣,请发我简信,或者直接在下面评论!
还有,服务器好贵,真希望有人能打赏,让我早点把API公开。