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)

我现在就成功通过我们的代码获得了离线小说.是不是很有成就感?今天就先这样了, 开心以下先.存在的问题我们明天再说.

posted @ 2020-02-10 21:01  CYHua  阅读(250)  评论(0编辑  收藏  举报