CLI 应用,对于较复杂的用户定义逻辑,如何处理更优?
场景:爬取小说
完整代码:https://github.com/ForkFG/Ter...
fetch: async(page) => {
page = page ?? args[1]
if (!page) Err("fetch: Page can't be null.")
const srcName = setting.sourceActive, src = setting.sources[srcName]
const _html = await ajax(src.url.replace(/\{page\}/g, page))
let _title = _html.match(/<title>(.*)<\/title>/)[1]
if (_title.match(/^[3-5][01]\d+/))
Err(`fetch: HTTP error code: ${_title}`)
_title = _title.replace(/ - 新笔趣阁.*/, "").replace("-", " @ ")
const _content = _html.match(/<div id="content">(.*)<\/div>/)[1]
.replace(/<br[ ][\/]>/g, "\n")
.replace(/readx\(\);/g, "")
.replace(/&/g, "&")
.replace(/ /g, " ")
div("text", 1, 2)
Log(_title, "\n", _content)
div("arround", 1, 2)
const
_arround = _html.match(/=keypage;([\s\S]*)function keypage/)[1],
_prev = _arround.match(/prevpage="\/(.*).html"/)?.[1],
_next = _arround.match(/nextpage="\/(.*).html"/)?.[1],
arroundJSON =
`{
"prev": ${_prev ? '"' + _prev + '"' : "null"},
"curr": "${page}",
"next": ${_next ? '"' + _next + '"' : "null"},
"title": "${_title}"
}\n`
Log(arroundJSON)
await writeConfig("arround", arroundJSON)
div("EOF", 0, 1)
},
目前的配置文件
{
"sourceActive": "xbqg",
"sources": {
"xbqg": {
"url": "https://www.xsbiquge.com/{page}.html",
"charset": "utf8"
}
}
}
问题在于各个网站中信息的位置不一样,目前用的是正则来获取。
本来想直接用户配置正则就好了,但是有时一个正则不够,每个网站可能还有点别的额外操作要整。
现在我有一些想法,但都不太满意:
- 整一套复杂的配置,用户需要为每个源编写数个正则,填充若干信息
- 用户拿 js 写一个回调,接收爬到的 html,返回需要的信息。这个函数所在文件路径应被写入配置。
- 同 2,但是把函数暴力 serialize,塞进配置,省得我到处加载。
- 同 3,但是闲得没事写个 DSL,用户配置起来方便(?)了许多。并且我懒得为这个 DSL 写文档。
- 用户直接修改 main.js,别配置了
希望大家提供一些思路,感谢!
PS 所谓用户,在该问题发布前仅指我一人
PPS 爬取小说仅为学习所需
PPPS 如问题沉底而无人回答,本人将甚感痛心;如能赏我星星一颗,则不胜感激
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论