python爬虫——40行代码爬取「笔趣看」全部小说

需求分析

”笔趣看“ 是一个盗版小说网站,这里有各大知名小说网站的小说,更新速度略慢于正版网站。但是该网站只支持在线浏览,不支持小说下载,对于想要下载下来以防断网或者网速不好时也能看的童鞋来说不太友好。因此,本次练习将爬取该网站所有小说。PS:本次练习仅为学习交流,请各位童鞋支持正版。

爬取目标

本次练习将爬取 “笔趣看” 你想要的任何小说。

准备工作

本次练习将使用 requests 库(python使用最多的库)作者 kennethreitz 今年最新力作 request_html 库。集网页抓取与解析于一体。想了解更多的可以关注我,我将准备将相关文档翻译并与现有库进行对比。

请确保电脑安装了 python3.6 和requests_html。(具体安装方法请自行百度)

爬取分析

我们先随便找一本小说的第一章内容进行分析。


在这里还是要推荐下我自己建的Python开发学习群:304050799,群里都是学Python开发的,如果你正在学习Python ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2018最新的Python进阶资料和高级开发教程,欢迎进阶中和进想深入Python的小伙伴

第一章内容

用代码获取全部文本信息:from requests_html import HTMLSessionurl = 'http://www.biqukan.com/53_53276/20760231.html'session = HTMLSession()res = session.get(url)content = res.html.textprint(content)

打印内容如下:


网页内容

可以看到我们很轻松就获取到所有文本信息。但是有很多信息是我们不需要的,所以我们需要更精确的定位,获取指定信息。

通过谷歌浏览器的开发者工具(按F12)可以发现小说正文全在

标签下的文本信息中。因此我们可以通过res.html.find('#content')来定位(定位方法与 jQuery 选择器一致,对 jQuery 不太熟悉的朋友可以通过‘菜鸟教程’大致了解下),这里我们选择的是通过 id 定位,当然也可以通过 class 定位(res.html.find('.showtxt')),但是 html 中 id 是唯一的,class 不一定是唯一的,有时会造成定位不准。有 id 建议用 id。改进后的代码如下:from requests_html import HTMLSessionurl = 'http://www.biqukan.com/53_53276/20760231.html'session = HTMLSession()res = session.get(url)targets = res.html.find('#content')content = targets[0].textprint(content)

打印结果为:


改进后的结果

可以看到我们获取的全是小说正文内容。下面让我们回到该小说主页。


小说主页

可以看到前面12章全是最新章节,不是我们需要的,后面的正问卷才是所有章节信息。

下面我们来分析该页面信息:


章节信息

我们发现所有章节信息在

下的自定义列表
中。接下来我们来获取章节名和每章的链接。from requests_html import HTMLSessionfirst_url = 'http://www.biqukan.com'target_url = 'http://www.biqukan.com/53_53276/'session = HTMLSession()res = session.get(target_url)targets = res.html.find('.listmain dd')titles = []hrefs = []for i in range(12, len(targets)): titles.append(targets[i].text) hrefs.extend(list(targets[i].links))print(titles)print(hrefs)

打印结果为:


章节信息

可以看到我们获取的章节所有信息。我们可以将上节代码中的 first_url 和 hrefs 中的每个元素进行拼接就能获得每章的正文网址。完整代码

# -*- coding:UTF-8 -*-from requests_html import HTMLSessiondef parse_html(res): targets = res.html.find('.listmain dd') titles = [] hrefs = [] for i in range(12, len(targets)): titles.append(targets[i].text) hrefs.extend(list(targets[i].links)) return titles, hrefsdef get_onepage(first_url, title, href, session, book_name): url = first_url + href res = session.get(url=url) targets = res.html.find('#content') content = targets[0].text with open(book_name + '.txt', 'a', encoding='utf-8') as f: f.write(' ' + title + ' ') f.write(content)def main(): first_url = 'http://www.biqukan.com' session = HTMLSession() targets_url = input('请输入你要下载的小说地址:') res = session.get(url=targets_url) book_name = res.html.find('.info h2')[0].text titles, hrefs = parse_html(res) for i in range(len(titles)): get_onepage(first_url, titles[i], hrefs[i], session, book_name)if __name__ == '__main__': main()

注意:上述代码在 pycharm 上运行时,当你将网址复制到下面提示框按回车键时会直接跳到对应网页。解决办法有两个:

1:直接在命令行运行

2:将url = input('请输入要下载的文库URL地址_')改成url = input('请输入要下载的文库URL地址_'[:-1],在复制的网址后面加一个 感叹号,eg:http://www.biqukan.com/53_53276/!

总结

本次练习我们是先获取一章的信息,然后获取所有章节信息,进而获取所有信息。

注意:本次练习仅为学习交流,请大家支持正版,毕竟大家写小说不容易,不是每个人都能成为大神,大家都要吃饭,你的一个订阅,一次购买就是支持他们前进的动力。如果觉得我的文章对您有所帮助的可以点个关注。最近我的文章可以使用赞赏了,有钱的土豪可以赞赏支持一下,毕竟写作不易,尤其是原创。

福利

想学习 python 以及其他编程语言的的可以关注微信公众号:程序员大牛,获取资料学习。

猜你喜欢

转载自blog.csdn.net/qq_41893518/article/details/80778990