知乎书籍排行网站——建站始末

网站地址books.bigfacewo.com
最近工做去了,感受人也变懒了,一直想写一些关于这个网站东西分享出来。慢慢写吧。
前情提要:对于大神来讲,这个网站使用的技术都是小儿科啦。不过,我想仍是有朋友有这个需求的。这篇文章的内容不必定都是准确的,用的方法也不是最好的,不过我始终相信一句话——兼听者明,偏听则暗。因此看这篇文章的朋友,但愿你能带入本身的思考,同时更但愿可以带给你一些东西。前端

好了,废话很少说了。python


网站是参考了一个外文网站。一时心血来潮,因而当时想,若是拿来分析知乎这个网站,会有什么效果呢。
有一些不同的地方是stackoverflow这个网站开放了api,因此拿到数据是很方便的。知乎并无公开api,只能采起爬虫手段。
因此,很天然地,流程大体分为四个步骤:数据库

  1. 数据获取
  2. 数据分析
  3. 建站数据准备
  4. 建站

1、数据获取

写爬虫要考虑的一些问题:编程

  1. 可靠性。当遇到程序错误或者一些不可抗力因素如断电等形成的程序中止,如何从中止的时刻开始继续爬取;或者说得设计一个状态,该状态保存了已经抓取数据的相关信息,下次抓取任务会忽略已经抓取的信息(这不是废话嘛,哈哈),还有一些须要考虑的问题:api

    • 模拟登录(后续填坑)
  2. 速度。假设一秒钟爬取1条数据,那么600条一个小时,6000000条就须要10000个小时,大概要一年多。这是不能接受的一个速度,单机多线程抓取10条每秒仍是能够接受的。如此,大几率会触发知乎反爬虫系统,因此采起如下方法来回避这个问题:多线程

    • 代理池 。能够找一些免费的代理网站,如西刺,爬一些ip下来用,固然这须要设计一个系统或服务,该服务不断地去获取代理ip,而后验证是否可用,再存起来备用。当遇到爬虫验证页面时应该将该ip移除或者标记为暂时不可用。可是,不少状况下知乎仍是能经过你的请求获得你的真实ip。
    • Cookie。
    • 从新拨号。这个简单并且很是可行,若是是单条宽带,从新拨号会形成短期的爬取中止。
  3. 优先级。其实,并非每条数据都须要的或者说包含了有效信息,若是对要抓取的数据有必定了解,那么咱们能够提取一些特征,优先抓取这部分数据。事实上我也这么作的,这样可以最大限度地节省时间。

当我接触Python以后,就决定用它来写爬虫了,由于实在是太方便了!python爬虫


2、数据分析

从数据中提取书籍信息,有两种办法:编程语言

  1. 提取书名号中的内容。
  2. 先创建书籍信息库,再作匹配。

第二种办法能够作到更精确,可是创建书籍数据库也颇费时间。因此采用了第一种方法。实际上知乎上只要提到书籍几乎都会带上书名号,或者有一些政治隐喻不能提的,固然咱们也不须要这类书的信息。工具

同一本书在每一个回答中最多只能出现一次,将数据汇总后,获得“标签:书名:提到次数”的这样的一个文本。优化

3、建站数据准备

按照个人需求,应该创建如下三张表:

  1. 标签表:存放该书所对应标签,多对多的关系。
  2. 书籍表:存放书籍的信息,以及该书的提到总次数。
  3. 标签-书籍对应关系表:存放该标签下该书籍被提到的次数信息。

将步骤二获得的文本,导入到数据库中去。

为了获得书籍的详细信息,此时还须要将书名放到一些书籍网站,如我去了亚马逊进行搜索,而后将获得的信息写到数据库中去,原理同步骤一。固然,这里也引入了一些偏差,因为是模糊匹配,致使一些书籍的信息错误(后面人工审核了一部分数据)。

到此,建站数据准备好了。

4、建站

建站就比较简单了,后台用Restful风格把接口写好,前端就可使用了。
使用Vue构建了一版单页应用,可是搜索引擎不能抓取,因而又作了一版ssr的,使用了Nuxt.js。

网站差很少4天就写好了,大部分时间都花在了步骤一和步骤二上了。因此,若是你也想作一个相似网站,不妨先从写爬虫开始。


还想作的事情:

  1. 情感分析。一本书被提到,其评价有多是正面的也有多是负面的,但愿加入一个情感分析的功能,而后加权到最终结果。
  2. 提升书籍信息准确度。 原本能够申请亚马逊或者淘宝之类的网站的api,经过api能够获取商品数据,能够利用来查询书籍信息,可是申请很麻烦,最后仍是采用了爬虫+人工的方式。
  3. 移动端优化。 目前网站的排版在移动端表现不是太好。

总结

综上,写的比较简略,固然,不具有直接可操做性,由于不涉及到具体的代码。可是,我想表达的是,整个流程就在这里,你能够用你熟悉的编程语言或者工具来实现它,就算不会Python,你仍然能够利用Java、C#来写爬虫或者作分析;还有一个重要的原则是,尽可能复用别人的东西,如python爬虫相关的库功能很是强大,直接拿来用就能够,同理,使用Java,你须要去调查该语言相关的库,哪些能实现你的目的,而后去使用它吧。另外,一些省略的内容,将后续补充。

相关文章
相关标签/搜索