用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探索之旅的记录。

广告
将在 10 秒后关闭
bannerAds