From c464ef5967f283a07a478c0704a841fd880110f5 Mon Sep 17 00:00:00 2001 From: Henry Wang Date: Fri, 22 Mar 2019 09:11:59 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=99=8E=E5=97=85=E7=BD=91=E6=96=87?= =?UTF-8?q?=E7=AB=A0=E5=85=A8=E6=96=87=E6=8F=90=E5=8F=96=20(#1803)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 逻辑复用,我爱全文。 --- docs/README.md | 4 ++-- lib/routes/huxiu/author.js | 30 ++------------------------ lib/routes/huxiu/search.js | 38 +++++++++++++-------------------- lib/routes/huxiu/tag.js | 35 ++++++++++++------------------- lib/routes/huxiu/utils.js | 43 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 75 deletions(-) create mode 100644 lib/routes/huxiu/utils.js diff --git a/docs/README.md b/docs/README.md index 5258983592..780eb08e58 100755 --- a/docs/README.md +++ b/docs/README.md @@ -3073,9 +3073,9 @@ board 和 build 可在[这里](http://api.ineal.me/tss/status)查看 ### 虎嗅 - + - + diff --git a/lib/routes/huxiu/author.js b/lib/routes/huxiu/author.js index 5f8d536278..35b5372241 100644 --- a/lib/routes/huxiu/author.js +++ b/lib/routes/huxiu/author.js @@ -1,12 +1,10 @@ const axios = require('../../utils/axios'); const cheerio = require('cheerio'); -const url = require('url'); -const date = require('../../utils/date'); +const utils = require('./utils'); module.exports = async (ctx) => { const { id } = ctx.params; const link = `https://www.huxiu.com/member/${id}.html`; - const host = 'https://www.huxiu.com'; const response = await axios({ method: 'get', url: link, @@ -25,32 +23,8 @@ module.exports = async (ctx) => { .get() .map((e) => $(e).attr('href')); - const items = await Promise.all( - list.map(async (e) => { - const itemUrl = url.resolve(host, e); + const items = await utils.ProcessFeed(list, ctx.cache); - const single = await ctx.cache.tryGet( - itemUrl, - async () => { - const response = await axios.get(itemUrl); - const $ = cheerio.load(response.data); - $('.neirong-shouquan, .neirong-shouquan-public').remove(); - return { - title: $('.t-h1') - .text() - .trim(), - link: itemUrl, - description: $('.article-img-box').html() + $('.article-content-wrap').html(), - pubDate: date($('.article-time').text(), 8), - author, - }; - }, - 2 * 24 * 60 * 60 - ); - - return Promise.resolve(single); - }) - ); const authorInfo = `虎嗅网 - ${author}`; ctx.state.data = { title: authorInfo, diff --git a/lib/routes/huxiu/search.js b/lib/routes/huxiu/search.js index b023998665..c081e37d51 100644 --- a/lib/routes/huxiu/search.js +++ b/lib/routes/huxiu/search.js @@ -1,41 +1,33 @@ const axios = require('../../utils/axios'); const cheerio = require('cheerio'); +const utils = require('./utils'); module.exports = async (ctx) => { const { keyword } = ctx.params; - const url = `https://www.huxiu.com/search.html?s=${encodeURIComponent(keyword)}&sort=dateline:desc`; + const link = `https://www.huxiu.com/search.html?s=${encodeURIComponent(keyword)}&sort=dateline:desc`; + const response = await axios({ method: 'get', - url, + url: link, headers: { - Referer: url, + Referer: link, }, }); const data = response.data; const $ = cheerio.load(data); - const list = $('.search-wrap-list-ul > li') - .map((index, elem) => { - const $elem = $(elem); - const $link = $elem.find('a').eq(0); - const title = $link.text(); - const time = $elem.find('.time').text(); - const link = $link.attr('href'); - const description = $elem.find('.mob-summay').text(); - return { - title, - link: `https://www.huxiu.com${link}`, - description, - pubDate: new Date(time).toUTCString(), - }; - }) - .get(); + const list = $('.search-wrap-list-ul > li > h2 > a') + .get() + .map((e) => $(e).attr('href')); + const items = await utils.ProcessFeed(list, ctx.cache); + + const info = `虎嗅网 - ${keyword}`; ctx.state.data = { - title: `虎嗅-${keyword}`, - link: url, - description: $('meta[name="description"]').attr('content'), - item: list, + title: info, + link, + description: info, + item: items, }; }; diff --git a/lib/routes/huxiu/tag.js b/lib/routes/huxiu/tag.js index 9020fcbc1d..9df04a541b 100644 --- a/lib/routes/huxiu/tag.js +++ b/lib/routes/huxiu/tag.js @@ -1,40 +1,31 @@ const axios = require('../../utils/axios'); const cheerio = require('cheerio'); +const utils = require('./utils'); module.exports = async (ctx) => { const { id } = ctx.params; - const url = `https://www.huxiu.com/tags/${id}.html`; + const link = `https://www.huxiu.com/tags/${id}.html`; const response = await axios({ method: 'get', - url, + url: link, headers: { - Referer: url, + Referer: link, }, }); const data = response.data; const $ = cheerio.load(data); - const list = $('.related-article li') - .map((index, elem) => { - const $elem = $(elem); - const $link = $elem.find('a'); - const title = $link.text(); - const time = $elem.find('.time').text(); - const link = $link.attr('href'); + const list = $('.related-article li a') + .get() + .map((e) => $(e).attr('href')); - return { - title, - link: `https://www.huxiu.com${link}`, - description: title, - pubDate: new Date(time).toUTCString(), - }; - }) - .get(); + const items = await utils.ProcessFeed(list, ctx.cache); + const info = `虎嗅 - ${$('.tag-title').text()}`; ctx.state.data = { - title: `虎嗅-${$('.tag-title').text()}`, - link: url, - description: $('meta[name="description"]').attr('content'), - item: list, + title: info, + link, + description: info, + item: items, }; }; diff --git a/lib/routes/huxiu/utils.js b/lib/routes/huxiu/utils.js new file mode 100644 index 0000000000..efa1fcbffc --- /dev/null +++ b/lib/routes/huxiu/utils.js @@ -0,0 +1,43 @@ +const cheerio = require('cheerio'); +const date = require('../../utils/date'); +const axios = require('../../utils/axios'); +const url = require('url'); + +const ProcessFeed = async (list, cache) => { + const host = 'https://www.huxiu.com'; + + const items = await Promise.all( + list.map(async (e) => { + const link = url.resolve(host, e); + + const single = await cache.tryGet( + link, + async () => { + const response = await axios.get(link); + + const $ = cheerio.load(response.data); + $('.neirong-shouquan, .neirong-shouquan-public').remove(); + + return { + title: $('.t-h1') + .text() + .trim(), + description: $('.article-img-box').html() + $('.article-content-wrap').html(), + pubDate: date($('.article-time').text(), 8), + author: $('.article-author .author-name').text(), + link, + }; + }, + 2 * 24 * 60 * 60 + ); + + return Promise.resolve(single); + }) + ); + + return items; +}; + +module.exports = { + ProcessFeed, +};