自动提取念力兵械的文本

阅读本文大约需要: <1 分钟

管道的概念

pineline(管道)是linux/Unix系统中最了不起的概念。
所谓管道,就是一个先进先出的数据流,可以从一个程序流向另一个程序。
通过管道,linux/unix的若干小工具——有的简单到就像c语言的库函数调用一样,就可以完成复杂的功能。


实习

陶陶没有给我念力兵械的文本,所以我也只有从起点上提取。下面的过程,就是提取全部念力兵械文本的过程,使用了curl, tr, vim, sed, awk, pandoc, wp-cli等工具,以及linux 脚本编程。
算是闹着玩的示范项目。

顺便说一下,现在开始用markdown写博客,主要是为了显示代码加亮。

其实,什么东西听起来很高大上,实际用了很快就掌握了。


程序

  1. 打开《念力兵械》,提取起点的链接地址:https://book.qidian.com/info/3497385#Catalog
  2. 用 curl 下载目录文件:
    [bash] curl https://book.qidian.com/info/3497385#Catalog > catalog [/bash]

  3. 在vim中将所有软回车^M 替换为硬回车\r
    :s/[CTRL-V]CTRL-M]/\r/g

    保存修改后的文件。

  4. 研究文件格式,寻找需要的正则表达式:
    <li data-rid="1"><a href="//read.qidian.com/chapter/Nh12LfXhZPM1/d5ToTuL1dCRp4rPq4Fd4KQ2" target="_blank" data-eid="qd_G55" data-cid="//read.qidian.com/chapter/Nh12LfXhZPM1/d5ToTuL1dCRp4rPq4Fd4KQ2" title="首发时间:2017-11-03 23:45:10 章节字数:7570">序章</a>

    从这段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]

部分数据如上。

  1. 为了提取模式,再次采用sed命令:
    bash
    cat nlbx.html | sed -n 's/.*href="\/\/\(.*\)"\ target="_blank" data-eid.*章节字数:\([0-9]\+\)".\(.*\)<\/a>.*/\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]

  1. 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上陆续发表出来。既然起点不给陶陶签约,老爸就自己来推广好了。

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.