最近腾讯在播放我最喜欢的玄幻小说之一《诛仙》的动漫,我也想重读一下诛仙,所以想把诛仙下载下来,现在微信读书平台很不错,不过上面的热门小说很多要收费,我就想着自己抓下来读一下。说干就干,我百度了一下,找到了一个网站可以在线阅读诛仙,好了,这个就是我的目标了。
https://www.93xscc.com/zhuxian/
由于每一章都有一个单独的链接,所以我首先要获取每一章链接和标题,打开F12查看网页源代码,可以很清晰的看到源代码,
目录
OK,那下面我只要把这些链接抓下来存在一个列表中,循环遍历这个列表,去获取文章内容就可以了。
我们发现每章的链接和标题都是在<ul>下面的<li>节点中的,那我首先要获取到这个大块的内容,我通过正则表达式
'全文阅读.?<ul>(.?)</ul>'
获取到“全文阅读”之后的<ul>块中的内容,也就是那一堆的<li>节点,之后通过正则表达式
<a href="(.?)" title="(.?)">
获取到每一章的链接地址和标题。代码如下:
import re
url_home = 'https://www.93xscc.com/zhuxian/'
page = requests.get(url_home).content.decode()
# 获取目录
mulu = re.search('全文阅读.*?<ul>(.*?)</ul>', page, re.S).group(1)
link_list = re.findall('<a href="(.*?)" title="(.*?)">', mulu, re.S)
link_list
每一章的链接和标题
可以看到,获取了每一章的链接信息和标题。
接下来,我要根据这些链接去获取文章的正文。打开第一章的正文链接,查看正文的源代码:
正文页面
正文源代码
可以看到,每一章开头都有一句话:“如果被/浏/览/器/强/制进入它们的阅/读/模/式了,阅读体/验极/差请退出转/码阅读.”,那我就用这句话来作为获取内容的起始标志,结尾节点是一个</div>
for link in link_list:
url = 'https://www.93xscc.com'+link[0]
content = requests.get(url).content.decode()
text = re.search('码阅读.*?<p>(.*?)</div>', content, re.S).group(1)
#print(text.replace("</p><p>","\n"))
text = text.replace("</p><p>","\n")
os.makedirs('诛仙', exist_ok=True)
#如果没有“诛仙”文件夹,就创建一个,如果有,则什么都不做
with open(os.path.join('诛仙','诛仙.txt'),'a',encoding='utf-8') as f:
f.write(link[1]+"\n"+text+"\n\n")
所以,我们可以构建一个正则表达式来获取正文的内容
码阅读.?<p>(.?)</div>
这样获取的正文有个问题,文章中的段落都是通过HTML的<p>来分割的,所以需要把文章中的连续的</p><p>手动替换为换行符\n,然后把最后一章的</p>替换为空白字符串,以及尾声中的<p>也替换为空白字符串。这样,我就获取到每一章的正文。
最后,我只需要把这些结果拼接起来就行了。我创建一个《诛仙》的word文档,并把每一章的内容添加到其中,这里我采用python操作word的第三方库python-docx包,把每一章的标题作为word的标题格式,设置为3号标题,小说名设置为0号标题。
import docx
import os
doc = docx.Document()
doc.add_heading('诛仙',0)
for link in link_list:
url = 'https://www.93xscc.com'+link[0]
content = requests.get(url).content.decode()
text = re.search('码阅读.*?<p>(.*?)</div>', content, re.S).group(1)
#print(text.replace("</p><p>","\n"))
text = text.replace("</p><p>","\n") ## 将</p><p>替换为换行符
text = text.replace("</p>", "") ## 去除最后一个</p>
text = text.replace("<p>", "") ## 去除尾声中的<p>
os.makedirs('诛仙', exist_ok=True)
doc.add_heading(link[1], 3)
doc.add_paragraph(text)
doc.save(os.path.join('诛仙','诛仙.docx'))
搞定,得到了离线的《诛仙》小说了。
image.png
网友评论