class C章节(I文档, I章节):
c正文标识名 = "content"
def __init__(self, a地址):
I文档.__init__(self)
I章节.__init__(self)
self.m地址 = a地址
def fg地址(self):
return self.m地址
def fg正文(self):
self.f载入()
v正文元素 = self.m文档.find("div", id = C章节.c正文标识名)
v正文文本 = ""
for v行 in v正文元素.strings:
if "xxxx" in v行: #去除广告
continue
v正文文本 += v行 + "\n"
return v正文文本
修改主函数测试代码是否可用
c章节地址 = "https://www.xxxx.com/xxxx/xxxx.html"
def main():
v章节 = C章节(c章节地址)
print(v章节.fg正文())
从运行结果看,爬到的正文有空行有缩进。虽然没有问题,但是小说最终是要放进阅读器里慢慢看的,并不是所有的阅读器都能正确处理空行和缩进,所以还要在代码里对正文进一步处理。
写一个函数叫 f处理正文,负责处理乱七八糟的空行和缩进
import re
c开头缩进正则 = re.compile(r"^\s")
def f处理正文(a文本):
v正文文本 = a文本
v正文文本 = c开头缩进正则.sub("\n", v正文文本) #清除缩进
v正文文本 = v正文文本.replace("\xa0", "") #清除缩进
v正文文本 = v正文文本.replace("\u3000", "") #清除缩进
v正文文本 = v正文文本.replace("\r", "\n") #
v正文文本 = v正文文本.replace("\n \n", "\n") #清除多余换行
while "\n\n" in v正文文本:
v正文文本 = v正文文本.replace("\n\n", "\n") #清除多余换行
return v正文文本
然后修改 C章节.fg正文,在返回字符串时做一些处理
return f处理正文(v正文文本)
这样看起来好多了。
保存
确认可以爬到目录和正文之后,接下来就是把正文保存到电脑上。
def f一键下载(a小说, a保存路径):
v小说名 = a小说.fg小说名()
#路径
v路径 = pathlib.Path(a保存路径)
v路径 /= v小说名 + ".txt"
v文件名 = str(v路径)
print("保存到: " + v文件名)
v文件 = open(v文件名, "w", encoding = "utf-8")
#循环
for v章节名, v章节 in v小说.fe目录():
v正文 = v章节.fg正文()
v文件.write(v章节名 + "\n" + v正文 + "\n")
time.sleep(1) #访问太频繁会被服务器阻止访问,所以加个等待
print("下载完成")
在实际测试中,网站经常返回503。如果在代码里增加错误重试功能会导致代码变得又臭又长,这里我就不写了。
打开下载下来的文本文件看看。因为网站经常503,只爬了前几章就断掉了,所以没爬完。
结尾
上面的代码可以从一个特定的小说网站下载小说。但是这个网站是盗版小说网站,容易被封掉。或者有各式各样的理由需要从另外一个网站下载小说呢?
由于上面已经写过一些代码了,只需要照葫芦画瓢,重新写个 C小说 和 C章节 就行了。其他什么都不用动。
文章里的代码省略了很多细节,比如HTTP请求头、文档编码处理、异常处理,只保留最重要的爬虫代码。完整代码我发到了github上,见:https://github.com/cflw/cflw_py。
最后请大家以学习研究为目的写爬虫,毕竟爬别人的劳动成果是不好的,请大家多多支持正版。