博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python爬虫——40行代码爬取「笔趣看」全部小说
阅读量:7066 次
发布时间:2019-06-28

本文共 3110 字,大约阅读时间需要 10 分钟。

需求分析

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

爬取目标

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

准备工作

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

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

爬取分析

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

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

第一章内容

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

打印内容如下:

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

网页内容

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

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

打印结果为:

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

改进后的结果

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

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

小说主页

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

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

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

章节信息

我们发现所有章节信息在
下的自定义列表
中。接下来我们来获取章节名和每章的链接。from requests_html import HTMLSession first_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爬虫——40行代码爬取「笔趣看」全部小说

章节信息

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

# -*- coding:UTF-8 -*- from requests_html import HTMLSession def 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, hrefs def 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('\n' + title + '\n')  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 以及其他编程语言的的可以关注我私信回复【python】获取 500G 学习资料。

转载地址:http://hqxll.baihongyu.com/

你可能感兴趣的文章
接口库设计总结
查看>>
redis查看数据
查看>>
DFS ( 深度优先/回溯算法 ) 一
查看>>
Enum一点使用总结
查看>>
eclipse +VISUALSVN SERVER 创建版本控制器,防止误操作(可视化操作,简单方便,不需要修改配置文件)...
查看>>
一致性hash
查看>>
C++函数的重载
查看>>
Linux查看是否被入侵
查看>>
20170821
查看>>
一言难尽的数据标注
查看>>
Emgucv使用记录-------切忌点一
查看>>
oracle数据查询的基本方法
查看>>
委托与事件的练习
查看>>
Netty源码分析(二):服务端启动
查看>>
nodejs-7.2. CURD数据管理系统小栗子
查看>>
addMusic 和playMusic(AVAudioPlayer)
查看>>
压力测试的轻量级具体做法
查看>>
又一款博客园Android客户端低调推出
查看>>
自定义Property属性动画
查看>>
WPF自定义控件与样式(9)-树控件TreeView与菜单Menu-ContextMenu
查看>>