Python爬虫实例之——小说下载

这是小詹关于爬虫的第②篇文章!

第一篇关于爬虫中介绍了一些基本的术语和简单的操作,这里不重复叙述了,直接放链接,不记得的自己在文章末尾点击前期链接补补~

本篇开始要进入实操啦,今天第一篇先从简单的爬起~先爬一爬文本格式的数据吧,以小说为例。大致流程为:获取HTML信息,解析HTML信息,将HTML信息中选择感兴趣的保存~

首先上篇还没有说到requests库的使用,这是一个十分强大的库,现列举几个基础方法:(官方中文教程地址:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html)

网络小说在青年人群体中还是很受欢迎的,笔趣看是一个盗版小说网站,其更新速度稍滞后于正版小说的更新速度,但是都免费阅读。并且该网站只支持在线浏览,不支持小说打包下载。小说网站-笔趣看:URL:http://www.biqukan.com/

随便以一篇小说《复兴之路》为例,其第一章URL:http://www.biqukan.com/11_11745/4321123.html

现在我们先利用前篇内容获取html信息试试看。

# -*- coding:UTF-8 -*-
import requests
if __name__ == '__main__':
    target = 'http://www.biqukan.com/11_11745/4321123.html'
    req = requests.get(url=target)
    print(req.text)

其结果的确获取了所要的html信息,然而多了很多我们不需要的数据,实际上多的这些数据时div、br等html标签,我们并不care这些,所以我们需要将正文提取出来,也就是在获取了html信息之后将其解析,提取我们需要的信息。

提取的方法中很牛逼的正则表达式暂时不涉及,用一个简单的BeautifulSoup,其安装同requests一样,pip install 即可~

根据上一讲的方法,可以通过审查元素发现文章所有内容都存放在div标签下

"content", class="showtxt"> 

观察不同标签发现class属性为showtxt的div标签只有一个!这个标签里面存放的内容,是我们需要的小说正文。于是利用beautifulsoup提取内容代码如下:

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests
if __name__ == "__main__":
     target = 'http://www.biqukan.com/11_11745/4321123.html'
     req = requests.get(url = target)
     html = req.text
     bf = BeautifulSoup(html)
     texts = bf.find_all('div', class_ = 'showtxt') 
     print(texts)

在解析html之前,我们需要创建一个Beautiful Soup对象。BeautifulSoup函数里的参数就是我们已经获得的html信息。然后我们使用find_all方法,获得html信息中所有class属性为showtxt的div标签。find_all方法的第一个参数是获取的标签名,第二个参数class_是标签的属性。

最后我们还是发现多了其他的一些标签不是我们想要的。find_all匹配的返回的结果是一个列表。提取匹配结果后,使用text属性,提取文本内容,滤除br标签。随后使用replace方法,剔除空格,替换为回车进行分段。 在html中是用来表示空格的。replace(‘\xa0’*8,’\n\n’)就是去掉下图的八个空格符号,并用回车代替:

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests
if __name__ == "__main__":
     target = 'http://www.biqukan.com/11_11745/4321123.html'
     req = requests.get(url = target)
     html = req.text
     bf = BeautifulSoup(html)
     texts = bf.find_all('div', class_ = 'showtxt') 
     print(texts[0].text.replace('\xa0'*8,'\n\n'))

这时候我们得到了想要的结果:

但是但是!!!重点是如果我们想整本书下载下来呢?同样通过审查元素发现全书各个章节存放在了class属性为listmain的div标签下,各章之间差别就在于这些章节的【href】属性不一样,而且其属性正好对应着每一章节URL后半部分,那这样,我们就可以根据标签的href属性值获得每个章节的链接和名称了。如下图:

所以再次利用find_all方法获取所有目录:

#encoding=utf-8
import requests,sys
from bs4 import BeautifulSoup
if __name__ == "__main__":
     target = 'http://www.biqukan.com/11_11745/'
     req = requests.get(url = target)
     html = req.text
     div_bf = BeautifulSoup(html)
     div = div_bf.find_all('div', class_ = 'listmain')
     print(div[0])

得到如下结果:

再接着提取章节名和章节文章:

#encoding=utf-8
import requests,sys
from bs4 import BeautifulSoup
if __name__ == "__main__":
     server = 'http://www.biqukan.com/'
     target = 'http://www.biqukan.com/11_11745/'
     req = requests.get(url = target) 
     html = req.text
     div_bf = BeautifulSoup(html)
     div = div_bf.find_all('div', class_ = 'listmain')
     a_bf = BeautifulSoup(str(div[0]))
     a = a_bf.find_all('a')
     for each in a:
          print(each.string, server + each.get('href'))

结果如下:

将上边的代码进行整合,于是得到如下完整代码:

#encoding=utf-8
from bs4 import BeautifulSoup
import requests, sys
"""
类说明:下载《笔趣看》网小说《复兴之路》
Parameters:
    无
Returns:
    无
"""
class downloader(object):
    def __init__(self):
        self.server = 'http://www.biqukan.com/'
        self.target = 'http://www.biqukan.com/11_11745/'
        self.names = []            #存放章节名
        self.urls = []            #存放章节链接
        self.nums = 0            #章节数
    """
    函数说明:获取下载链接
    Parameters:
        无
    Returns:
        无
    """
    def get_download_url(self):
        req = requests.get(url = self.target)
        html = req.text
        div_bf = BeautifulSoup(html)
        div = div_bf.find_all('div', class_ = 'listmain')
        a_bf = BeautifulSoup(str(div[0]))
        a = a_bf.find_all('a')
        self.nums = len(a[14:])                                #剔除不必要的章节,并统计章节数
        for each in a[14:]:
            self.names.append(each.string)
            self.urls.append(self.server + each.get('href'))
    """
    函数说明:获取章节内容
    Parameters:
        target - 下载连接(string)
    Returns:
        texts - 章节内容(string)
    """
    def get_contents(self, target):
        req = requests.get(url = target)
        html = req.text
        bf = BeautifulSoup(html)
        texts = bf.find_all('div', class_ = 'showtxt')
        texts = texts[0].text.replace('\xa0'*8,'\n\n')
        return texts
    """
    函数说明:将爬取的文章内容写入文件
    Parameters:
        name - 章节名称(string)
        path - 当前路径下,小说保存名称(string)
        text - 章节内容(string)
    Returns:
        无
    """
    def writer(self, name, path, text):
        write_flag = True
        with open(path, 'a', encoding='utf-8') as f:
            f.write(name + '\n')
            f.writelines(text)
            f.write('\n\n')
if __name__ == "__main__":
    dl = downloader()
    dl.get_download_url()
    print('《复兴之路》开始下载:')
    for i in range(dl.nums):
        dl.writer(dl.names[i], '复兴之路.txt', dl.get_contents(dl.urls[i]))
        sys.stdout.write("  已下载:%.3f%%" %  float(i/dl.nums) + '\r')
        sys.stdout.flush()
    print('《复兴之路》下载完成')

其运行后会自动下载此小说《复习之路》,你的又一个爬虫实践成功finish啦~

原文发布于微信公众号 - 小小詹同学(xiaoxiaozhantongxue)

原文发表时间:2018-03-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿人谷

Unix下c程序内存泄露检测工具

Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。 Valgrind的最初作者是Julian Seward,他于2006年由于在开发V...

2167
来自专栏软件测试经验与教训

LR windows计数器

2744
来自专栏岑玉海

hbase源码系列(六)HMaster启动过程

  这一章是server端开始的第一章,有兴趣的朋友先去看一下hbase的架构图,我专门从网上弄下来的。   按照HMaster的run方法的注释,我们可以了解...

5689
来自专栏代码世界

AJAX

先了解JSON 什么是JSON? JSON 指的是JavaScript对象表示法(JavaScript Object Notation) JSON 是轻量级的文...

4307
来自专栏iOS技术

YYCache 源码剖析:一览亮点

YYCache 作为当下 iOS 圈最流行的缓存框架,有着优越的性能和绝佳的设计。笔者花了些时间对其“解剖”了一番,发现了很多有意思的东西,所以写下本文分享一下...

4635
来自专栏Spark学习技巧

Kafka源码系列之分组消费的再平衡策略

一,Kafka消费模式 从kafka消费消息,kafka客户端提供两种模式: 分区消费,分组消费。 分区消费对应的就是我们的DirectKafkaInputDS...

9276
来自专栏kalifaの日々

python多线程爬虫爬取顶点小说内容(BeautifulSoup+urllib)

思路 之前写过python爬取起点中文网小说,多线程则是先把爬取的章节链接存到一个列表里,然后写一个函数get_text每次调用这个函数就传一个章节链接,那么就...

3749
来自专栏坚毅的PHP

[node.js]开放平台接口调用测试

遇到的问题:Node.js JSON parsing error,syntax error unexpect end of input 测试代码 //测试/st...

4256
来自专栏重庆的技术分享区

如何用Beautiful Soup爬取一个网址

Beautiful Soup是一个Python库,它将HTML或XML文档解析为树结构,以便于从中查找和提取数据。它通常用于从网站上抓取数据。

1.6K3
来自专栏我的技术专栏

Socket编程(4)TCP粘包问题及解决方案

1153

扫码关注云+社区

领取腾讯云代金券