管道的概念
pineline(管道)是linux/Unix系统中最了不起的概念。
所谓管道,就是一个先进先出的数据流,可以从一个程序流向另一个程序。
通过管道,linux/unix的若干小工具——有的简单到就像c语言的库函数调用一样,就可以完成复杂的功能。
实习
陶陶没有给我念力兵械的文本,所以我也只有从起点上提取。下面的过程,就是提取全部念力兵械文本的过程,使用了curl, tr, vim, sed, awk, pandoc, wp-cli等工具,以及linux 脚本编程。
算是闹着玩的示范项目。
顺便说一下,现在开始用markdown写博客,主要是为了显示代码加亮。
其实,什么东西听起来很高大上,实际用了很快就掌握了。
程序
-
打开《念力兵械》,提取起点的链接地址:
-
用 curl 下载目录文件:
[bash] curl https://book.qidian.com/info/3497385#Catalog > catalog [/bash] -
在vim中将所有软回车
^M
替换为硬回车\r
:s/[CTRL-V]CTRL-M]/\r/g
保存修改后的文件。
-
研究文件格式,寻找需要的正则表达式:
序章
从这段html代码可以发现,书名的索引是
Nh12LfXhZPM1
。
所以,用sed -n -e '/chapter\/Nh12LfXhZPM1\//p' catalog >nlbx.html
提取所有涉及此书的行。
[code lang=html]
<li data-rid=“18”><a href="//read.qidian.com/chapter/Nh12LfXhZPM1/3PAQdV4sMsW2uJcMpdsVgA2" target="_blank" data-eid=“qd_G55” data-cid="//read.qidian.com/chapter/Nh12LfXhZPM1/3PAQdV4sMsW2uJcMpdsVgA2" title=“首发时间:2018-03-04 01:59:35 章节字数:3094”>第十八章 山雨欲来</a>
<li data-rid=“19”><a href="//read.qidian.com/chapter/Nh12LfXhZPM1/vkcifpJc1KBp4rPq4Fd4KQ2" target="_blank" data-eid=“qd_G55” data-cid="//read.qidian.com/chapter/Nh12LfXhZPM1/vkcifpJc1KBp4rPq4Fd4KQ2" title=“首发时间:2018-03-05 01:31:26 章节字数:3100”>第十九章 宿敌激战</a>
<li data-rid=“20”><a href="//read.qidian.com/chapter/Nh12LfXhZPM1/LjfWhlEHxFZMs5iq0oQwLQ2" target="_blank" data-eid=“qd_G55” data-cid="//read.qidian.com/chapter/Nh12LfXhZPM1/LjfWhlEHxFZMs5iq0oQwLQ2" title=“首发时间:2018-03-05 20:40:04 章节字数:3027”>第二十章 胜负已分</a>
<li data-rid=“21”><a href="//read.qidian.com/chapter/Nh12LfXhZPM1/OyYYLrh-QMZOBDFlr9quQA2" target="_blank" data-eid=“qd_G55” data-cid="//read.qidian.com/chapter/Nh12LfXhZPM1/OyYYLrh-QMZOBDFlr9quQA2" title=“首发时间:2018-03-06 00:45:33 章节字数:3050”>第二十一章 百花魔术</a>
[/code]
部分数据如上。
- 为了提取模式,再次采用
sed
命令:
bashcat nlbx.html | sed -n 's/.*href="\/\/\(.*\)"\ target="_blank" data-eid.*章节字数:\([0-9]\+\)".\(.*\).*/\1:\2:\3/p' > chapters
得到所有章节的链接地址,字数和名字:
[code lang=html]
read.qidian.com/chapter/Nh12LfXhZPM1/rAIYVaputdK2uJcMpdsVgA2:3033:第十七章 胜者荣耀
read.qidian.com/chapter/Nh12LfXhZPM1/3PAQdV4sMsW2uJcMpdsVgA2:3094:第十八章 山雨欲来
read.qidian.com/chapter/Nh12LfXhZPM1/vkcifpJc1KBp4rPq4Fd4KQ2:3100:第十九章 宿敌激战
read.qidian.com/chapter/Nh12LfXhZPM1/LjfWhlEHxFZMs5iq0oQwLQ2:3027:第二十章 胜负已分
read.qidian.com/chapter/Nh12LfXhZPM1/OyYYLrh-QMZOBDFlr9quQA2:3050:第二十一章 百花魔术
[/code]
- 用
curl
下载每个章节:
[code lang=bash]
for i in cat chapters
; do
echo $i | sed ’s/^\(.*\):\([0-9]\+\):\(.*\)$/curl https:\/\/\1 |tr -d \’\r\’ | tr -d \’\n\’ | sed \’s/\(.*read-content j_readContent">\)\(.*\)\(admire-wrap.*\)/\2/p\’ | awk \’!seen[$0]++\’ > \2-\3\.txt/p’ | bash
done
[/code]
必须解释一下。
遍历每一章。
for i in ``cat chapters``; do
解析用“:”分割的文件链接,名称和字数
sed 's/^\(.*\):\([0-9]\+\):\(.*\)$
用curl
下载文件。
curl https:\/\/\1
将文本中windows的回车换行符去掉。
|tr -d \'\r\' | tr -d \'\n\' |
获取html文件中的小说正文。
sed \'s/\(.*read-content j_readContent">\)\(.*\)\(admire-wrap.*\)/\2/p\'
去掉重复的行。不知道代码里有什么错误,sed生成的文本有两份一样的,需要去掉一份。
awk \'!seen[$0]++\'
输出。
> \2-\3\.txt/p'
OK,运行试试。成功的话,明天继续用wp-cli自动提交到网站上。
7. 把html转换为markdown
pandoc -s -r html 7570-序章.html -o xuzhang.txt
8. 发布到wordpress.
wp post create ./xuzhang.txt --post_title="念力兵械-序章" --path=/my/wordpress
具体的章节,将在eddyemma.com上陆续发表出来。既然起点不给陶陶签约,老爸就自己来推广好了。