Python从零开始写爬虫-5 获得离线小说
Python从零开始写爬虫-5 获得离线小说
经过全面的学习, 我们已经掌握了如何使用python获取小说的目录页, 并且获得各个章节的链接以及标题, 也学会和如何通过章节链接获得符合我们要求的正文,那么下面我将要正式开始抓取网页了.
首先获取目录, 然后安装链接抓取就看可以了.
url = 'http://www.biquger.com/biquge/12928/'
contents = getContents(url)
for url, title in contents:
text = parse(url)
with open('novel\\' + title + '.txt', 'w') as file_object:
file_object.write(text)
看起来好像很简单的样子, 运行以下.在上述代码运行之前,请先确定novel
这个目录存在, 否则会出错.发现什么问题了没有,程序一直在运行, 但是我们却不知道程序运行到哪里了.我们强制停止程序运行.命令行: ctrl+c
, ide的话, 有停止按钮.
这个时候我们打开novel
目录, 发现里面已经有很多存在的章节了.
效果好像还不错, 加上print(url, title)
查看以下程序运行状态.
这个时候我们就可以看到命令行窗口输入的提示,可以看出程序正在抓取那些章节.
但是有一个问题, 一章一章的抓取,会不会太慢了, 能不能使用多线程同时抓取呢? 答案当然使可以的.
首先将抓取和保存整理成一个函数:
def craw(url, title):
print(url, title)
text = parse(url)
with open('novel\\' + title + '.txt', 'w') as file_object:
file_object.write(text)
然后运行:
url = 'http://www.biquger.com/biquge/12928/'
contents = getContents(url)
i = 1
for url, title in contents:
threading.Thread(name='t1', target=craw, args=(url, title)).start()
i = i + 1
if i % 100 == 0: time.sleep(10)
这样我就以10秒100章的速度下载小说,不用两分钟,就可以下载好了, 当然也可以用更高的并发数, 下载速度会更快, 这个视网络而定.
这样我们就获得全部的章节了, 再把他整理成一个txt
文件, 就得到离线小说了.
def merge(dir, name):
p = Path(dir)
if not p.is_dir():
return False
x = list(p.iterdir())
x.sort()
target = open(name + '.txt', 'a')
for i in x:
fp = open(i, 'r')
text = fp.read()
target.write(i.name[:-4] + '\n') #写入标题
target.write(text)
fp.close()
target.close()
merge('novel', name)
我现在就成功通过我们的代码获得了离线小说.是不是很有成就感?今天就先这样了, 开心以下先.存在的问题我们明天再说.