diff --git a/docs/finance.md b/docs/finance.md index 0e3dd94571..a180c2c0f3 100644 --- a/docs/finance.md +++ b/docs/finance.md @@ -74,6 +74,21 @@ pageClass: routes | autos | banking-insurance | business-technology | consumers | healthcare-pharmaceuticals | mckinsey-global-institute | 全球基础材料 | innovation | macroeconomy | manufacturing | talent-leadership | technology-media-and-telecom | urbanization-sustainability | capital-projects-infrastructure | 交通运输与物流 | + +## 上海证券交易所 + +### 本所业务规则 + + + +将目标栏目的网址拆解为 `http://www.sse.com.cn/lawandrules/sserules/` 和后面的字段,把后面的字段中的 `/` 替换为 `-`,即为该路由的 slug + +如:(最新规则)[http://www.sse.com.cn/lawandrules/sserules/latest] 的网址在 `http://www.sse.com.cn/lawandrules/sserules/` 后的字段是 `latest`,则对应的 slug 为 `latest`,对应的路由即为 `/sse/sserules/latest` + +又如:(设立科创板并试点注册制规则 - 发行上市审核类)[http://www.sse.com.cn/lawandrules/sserules/tib/review] 的网址在 `http://www.sse.com.cn/lawandrules/sserules/` 后的字段是 `tib/review`,则对应的 slug 为 `tib-review`,对应的路由即为 `/sse/sserules/tib-review` + + + ## 世界经济论坛 ### 报告 diff --git a/lib/router.js b/lib/router.js index 43c35a3f4f..7434f13fe6 100644 --- a/lib/router.js +++ b/lib/router.js @@ -3789,6 +3789,9 @@ router.get('/nace/blog/:sort?', require('./routes/nace/blog')); // Caixin Latest router.get('/caixin/latest', require('./routes/caixin/latest')); +// 上海证券交易所 +router.get('/sse/sserules/:slug?', require('./routes/sse/sserules')); + // 游戏葡萄 router.get('/gamegrape/:id?', require('./routes/gamegrape/index')); @@ -3835,4 +3838,5 @@ router.get('/rfa/:language?/:channel?/:subChannel?', require('./routes/rfa/index // booth.pm router.get('/booth.pm/shop/:subdomain', require('./routes/booth-pm/shop')); + module.exports = router; diff --git a/lib/routes/sse/sserules.js b/lib/routes/sse/sserules.js new file mode 100644 index 0000000000..db0a1a3d94 --- /dev/null +++ b/lib/routes/sse/sserules.js @@ -0,0 +1,50 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); + +module.exports = async (ctx) => { + const slug = ctx.params.slug || 'latest'; + + const rootUrl = 'http://www.sse.com.cn'; + const currentUrl = `${rootUrl}/lawandrules/sserules/${slug.replace(/-/g, '/')}`; + const response = await got({ + method: 'get', + url: currentUrl, + }); + + const $ = cheerio.load(response.data); + + const list = $('.sse_list_1 dl dd a') + .slice(0, 15) + .map((_, item) => { + item = $(item); + return { + title: item.text(), + link: `${rootUrl}${item.attr('href')}`, + pubDate: new Date(item.prev().text()).toUTCString(), + }; + }) + .get(); + + const items = await Promise.all( + list.map( + async (item) => + await ctx.cache.tryGet(item.link, async () => { + const detailResponse = await got({ + method: 'get', + url: item.link, + }); + const content = cheerio.load(detailResponse.data); + + item.description = content('.allZoom').html(); + + return item; + }) + ) + ); + + ctx.state.data = { + title: $('title').text(), + link: currentUrl, + item: items, + }; +};