[转]Hitokoto.us(一言)的 API 爬虫 | 祭夜博客
  • 欢迎光临,这个博客颜色有点多

[转]Hitokoto.us(一言)的 API 爬虫

其他 msojocs 来源:Hitokoto.us(一言)的 API 爬虫 8年前 (2017-02-06) 6158次浏览 已收录 8个评论 扫描二维码

爬虫一向都很有意思,当你把想要的内容从网络中抓取并保存下来的时候,一定会得到“占有”它的满满的幸福感 (๑´ڡ`๑)

大部分爬虫是很繁琐的,需要手动写出许多规则来过滤大部分的无效内容;有些就很简单了,可以通过网站提供的 API 来获取信息,这也是为开发者们提供的便利。本文主要记录爬取 一言 – ヒトコト 站点 API 的过程。

爬虫目标

爬取通过 API 能够得到的所有内容,基于 Node.js 。

内容存取

使用 MongoDB 存储数据,mongoose 操作数据。

代码主体

首先访问一次 API 地址:http://api.hitokoto.us/rand ,看看它到底提供了哪些数据:(手动格式化了一下)

 

{
  "hitokoto": "我从小就害怕虫子",
  "cat": "g",
  "author": "firo",
  "source": "小小闲",
  "like": 9,
  "date": "2012.07.22 12:02:01",
  "catname": "其他",
  "id": 1342929721000
}

随后就能组织写入数据库的数据结构了,与上述 json 数据格式保持一致,保存并命名为 hitokoto.js:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

// 新建 Schema
var hitokotoSchema = new Schema({
  hitokoto: String,
  cat: String,
  author: String,
  source: String,
  like: Number,
  date: String,
  catname: String,
  _id: Number
});

// 导出 model
module.exports = mongoose.model('Hitokoto', hitokotoSchema);

然后新建 index.js 文件,导入上面的数据模型,获取 API 信息并根据已经组织好的数据结构写入数据库:

var Hitokoto = require('./hitokoto');
var mongoose = require('mongoose');
var http = require('http');

// 连接数据库,首先确保已在本地运行 mongod
mongoose.connect('mongodb://localhost/hitokoto');
mongoose.connection.on('error', function () {
  console.log('mongodb connection error');
});

// 循环发送 GET 请求
// 不用 setTimeout,任性,可能造成的问题暂时不管了 XD
setInterval(function () {
  http.get('http://api.hitokoto.us/rand', function (res) {
    res.on('data', function (chunk) {
      // 以 JSON 格式取得数据
      data = JSON.parse(chunk);
      // 查询获取到的数据是否已经写入数据库
      Hitokoto.find({_id: data.id}, function (err, current) {
        if (err) return console.log(err);

        // 是则立即返回,进行下一次读取
        if (current.length != 0) return;
        // 否则将新数据写入数据库
        var hitokoto = new Hitokoto({
          hitokoto: data.hitokoto,
          cat: data.cat,
          author: data.author,
          source: data.source,
          like: data.like,
          date: data.date,
          catname: data.catname,
          _id: data.id
        });

        hitokoto.save(function (err) {
          if (err) return console.log(err);
          console.log(data.id + ' saved!');
        });
      });
    });
  }).on('error', function (err) {
    console.log(err);
  })
}, 1500); // 读取时间间隔1.5秒

最后应该就可以正常运行了,保存成功的 id 值会在终端进行输出:

id值 saved
用的的指令
npm install mongoose
node index.js

截止到目前为止,共获取到 491 条一言的数据,可能还有几条,也可能没有了,不知道有没有办法知道是否全部爬完,或者有更高效的方法进行爬取?

博主成果

[转]Hitokoto.us(一言)的 API 爬虫

其实本想把一言这么好玩的东西放进博客的,无奈审美太渣,感觉放哪儿都不好看,还是不破坏主题了,就放小人那儿,就这样吧 233


以上


祭夜の咖啡馆 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:[转]Hitokoto.us(一言)的 API 爬虫
喜欢 (5)
[1690127128@qq.com]
分享 (0)
发表我的评论
取消评论
OwO表情
贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(8)个小伙伴在吐槽
  1. 精彩精彩,内容很丰富,博主很用心,有空的话到我的网站看看吧,挽回爱情 www.wanhui120.com
    穆木2017-07-25 11:33 回复 Windows 7 | Chrome 55.0.2883.87
  2. 对了 使用这个脚本抓完数据,我导出的json文件无法使用。第一行是这样的,不知道问题出在哪里?{ "_id" : 1318722458000, "hitokoto" : "一句话,不足以讲述一个故事,却可以让我们回味那些个动人的瞬间。", "cat" : "e", "author" : "Sai", "source" : "", "like" : 25, "date" : "2011.10.16 07:47:38", "catname" : "原创", "__v" : 0 }
    Kay2017-02-14 18:59 回复 Windows 7 | Chrome 56.0.2924.87
    • 这个json文件和我写的那个格式不一样!这两个是分开的。
      祭夜ゐ2017-02-15 15:29 回复 Windows XP | Chrome 50.0.2661.102
      • 那抓完的数据应该通过何种方式变成你的格式
        Kay2017-02-15 17:45 回复 Windows 7 | Chrome 56.0.2924.87
      • 请问抓完的数据应该通过何种方式变成你的格式QAQ
        Kay2017-02-18 14:28 回复 Windows 7 | Chrome 56.0.2924.87
      • http://lvmoo.com/api/hitokoto/test.json能看看我的json文件为啥不能使用么~
        Kay2017-03-02 12:25 回复 Windows 7 | Chrome 56.0.2924.87
  3. 正在找有没有类似的爬虫,厉害了,这个我拿走啦!
    Kay2017-02-11 17:18 回复 Windows 7 | Chrome 56.0.2924.87
    • 拿去吧 :smile: 欢迎再来哦 :mrgreen:
      祭夜ゐ2017-02-11 17:26 回复 Windows 10 | Chrome 56.0.2924.76