用Node.js将最新新闻保存到MongoDB之外的操作
这只是一个简单的笔记,论逻辑结构,但我认为读了就能理解。只要将数据发送到模板中,就可以制作新闻应用程序。
模板
parseXML = require("xml2js").parseString
util = require "util"
http = require "http"
URL = require "URIjs"
mongoose = require "mongoose"
settings = require "./settings"
appId = 'XXXXXXXXXXXXXXXX'
log = (a) ->
if arguments.length isnt 1
return console.log arguments
console.log util.inspect a,
showHidden: false
depth: 2
color: true
return a
-
- xml2js:XMLをjsonに変える。超重要。
-
- util:ログとれる、階層レベルを変えて目当てのデータを見つけるためにlog関数。
-
- mongoose:データ保存、スキーマで必要なデータだけ取る。
-
- settings:ホストとかポートとかの設定情報
-
- appId: ヤフーのAPI使うための認証鍵。
- URL:urlをjsonっぽく投げて作れる。url作るだけです。
雅虎API
我用这个试一试。虽然还有其他的像日语解析或通过纬度和经度来搜索位置等功能,但使用方法是一样的。
从上一页找到请求参数所需的信息,然后根据这些信息编写URL、查询和数据的内容显示。
news =
uri: 'http://news.yahooapis.jp/NewsWebService/V2/topics'
data: # 後でクエリに使う
appid: appId
category: 'domestic'
sort: 'pvindex'
results: 10
res: (data) -> data.ResultSet.Result
请用npm进行URL生成,具体方法请自行搜索。
urler = new URL news.uri
urler.search news.data
我会进行通信。
http.get urler.toString(), (res) ->
body = ''
res.setEncoding 'utf-8'
res.on 'data', (chunk) ->
body += chunk
res.on 'end', (res) ->
parseXML body,
trim: true
explicitArray: false
, (err, data) ->
if err then throw err
log news.res data
.on 'error', (e) ->
log e.message
API的使用方式是怎样的呢?
这样的话,只需要在客户端直接发送请求好像就可以了。
总之这就是API的使用方法。可以尝试使用各种各样的API玩一下!
既然似乎只能使用5000次,那么我们就将其保存在数据库中吧。我会创建一个名为dbSave的函数,将其发送到数据库中,作为log函数的替代。
mongoose = require "mongoose"
mySchema = new mongoose.Schema
NewsUpdateTime: String
Keyword: String
TopicName: String
English: String
Overview: String
Category: String
SubCategory: String
Url: String
PickupCategory: String
PickupOrder: String
PvIndex: String
NewsNum: String
NewsUrl: String
SmartphoneUrl: String
mongoose.model 'yahoonews', mySchema
dbName = "yahoonews"
dbSave = (datas) ->
mongoose.connect "mongodb://" + settings.host + "/" + dbName
News = mongoose.model "yahoonews"
datas.forEach (data) ->
news = new News data
news.save()
对不起,数据库名称和集合名称有点混乱,但我成功保存了。
虽然啊,虽然你已经读到这里了,但是只能获取10条,而且没有新闻的URL,这个API到底是啥?还有限制,真是的^^;
在新闻中也可以,不过这次我想保存汇率信息试试看。那么
尽管我的行为相对保守,但由于看到了一个有趣的标题页面,我决定模仿一下。我尝试从Yahoo财经网页上做一次爬虫。由于访问速度缓慢,练习变得有点困难。
# マーケットの最新情報を得るスクレイピング
jsdom = require "jsdom"
jsdom.env 'http://finance.yahoo.co.jp', ["http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"], (err, window) -> window.$('.yjfinMarquee:first em').each () ->
console.log window.$(this).children('a, strong').text()
在中国,可以用以下方式来表述:
只需要一种选项:
网页爬取本身可以在控制台上使用jquery进行操作。
在本次操作中,我们通过服务器获取HTML并将其转换为DOM,在jquery中进行搜索会变得简单。通过npm搜索的结果如下:
+ jsdom:将HTML转换为DOM
中间有一个选项可以将jquery加载进来,非常方便!
以上是在qiita页面的nodejs版本中的内容。
然而所得到的信息太差劲了!
现在的RSS限制很弱,却充满了大量的信息。既然使用了XML解析器,不如一开始就用RSS吧!
# RSSから最新のマーケット情報を得る。
urler = new URL 'http://jpy.jp.fx-exchange.com/rss.xml'
http.get urler.toString(), (res) ->
body = ''
res.setEncoding 'utf-8'
res.on 'data', (chunk) ->
body += chunk
res.on 'end', (res) ->
parseXML body,
trim: true
explicitArray: false
, (err, data) ->
if err then throw err
log data.rss.channel.item
哇,抓到了。
能不能用狗狗市场应用程序赚笔钱呢。
以上是API探索之旅的记录。