python爬取「笔趣看」全部小说

836次阅读
没有评论

共计 2867 个字符,预计需要花费 8 分钟才能阅读完成。

提醒:本文最后更新于 2019-06-14 16:19,文中所关联的信息可能已发生改变,请知悉!

需求分析

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

爬取目标

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

准备工作

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

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

爬取分析

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

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)

打印内容如下:

python 爬取「笔趣看」全部小说
网页内容

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

 通过谷歌浏览器的开发者工具(按 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)

打印结果为:

python 爬取「笔趣看」全部小说
改进后的结果

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

python 爬取「笔趣看」全部小说
小说主页

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

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

python 爬取「笔趣看」全部小说
章节信息

 我们发现所有章节信息在 

下的自定义列表

中。接下来我们来获取章节名和每章的链接。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)

打印结果为:

python 爬取「笔趣看」全部小说
章节信息

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

  1. # -*- 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/!

总结

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

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

正文完
 0
水东柳
版权声明:本站原创文章,由 水东柳 于2018-06-23发表,共计2867字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)