【和小安一起学·Python爬虫】(二)管他的,先爬本小说试试

541 阅读4分钟

01、前言

小伙伴们大家好,这里是 【和小安一起学·Python爬虫】系列栏目的第二期 管他的,先爬本小说试试,在上一篇文章中,我们简单了解了Python爬虫需要的基础知识,知道了Python爬虫实际上是,通过URL得到HTML进而得到自己想要的资源的过程,下面让我们一起来爬一本网络小说,学习requests库和BeautifulSoup库的基础应用。

02、管他的,先爬本小说试试

我们先来分析一下我们要爬的小说所在页面的HTML文件,看看我们想爬取的小说文字到底在什么地方,然后通过requests库请求,得到HTML文件,再使用BeautifulSoup库处理文件,得到小说文字,并存储。

1、小说文本在哪里

我们先找到一本自己喜欢的小说,点开任意一个章节,然后鼠标右键,选择检查(不同浏览器可能不一样,Chrome是“检查”),就会得到与下图一样的页面。 小说 点击页面下面部分左上角的类似鼠标的按钮,然后点击小说的文字,我们找到了小说文字到底存储在HTML文件的什么地方。 小说标签 我们可看到,小说的主体内容,被包裹在** </div id='content'> <//div> **之间。

接下来,我们先使用requests库来获取这个HTML文件。

import requests
target = 'http://www.xbiquge.la/18/18446/9844101.html' #小说url
req = requests.get(url = target) #常用requests库方法,返回请求得到的文件
req.encoding = 'utf-8' #设置文件的编码方式,避免乱码
print(req.text) #输出得到的文件

html

然后让我们来处理这个HTML文件,把它的外衣一层层的剥开

2、没有用的东西都滚开

还是先把BeautifulSoup库下载了,安装好后,我们还需要安装 html5lib,这是解析 HTML 需要用到的依赖,正如我们在上一篇文章中所了解的一样,浏览器处理HTML文件然后展示给我们多姿多彩的页面,而html5lib就是模拟浏览器处理HTML文件的方式的一个解析HTML文件的库。

pip install BeautifulSoup
pip install html5lib

我们想要爬取的内容就在HTML页面的层层包裹之下,所以我们要使用BeautifulSoup这样的库来处理得到的HTML文件。

from bs4 import BeautifulSoup 
bs = BeautifulSoup(html, 'html5lib')  #以HTML文件,生成BeautifulSoup对象
texts = bs.find('div', id='content')   #处理BeautifulSoup对象,得到小说文本
print(texts.text.strip().split('\xa0'*4)) #观察得到文本,发现每段开头有4个空格,所以以四个空格为分割,生成数组

简单讲一下,bs.find() 吧,这个函数是BeautifulSoup中我们最常用的函数之一,主要用于寻找某一个指定标签的内容,第一个参数代表标签名,后面的的参数一一对应标签参数,如果找到第一个对应标签,则会返回其内容。

然后是texts.text.strip().split(),.text()得到字符串,.strip()消除换行,.split()以指定字符分割字符串。

小说数组

3、总不可能只下一章吧

我们已经得到了某一章小说的全部内容,但是我们的想法是一次性下一本呀,所以来看看怎么一次性下很多章吧。

很自然的想到,我们应该先在目录处得到所有章节的URL。 目录 和上面一样,我们先找到目标内容所在的标签,然后把所有的URL存入一个数组。 目录标签 万事具备,把前文所有的代码整合一下,我们就可以开始爬取这本小说了。

import requests
import time
from tqdm import tqdm
from bs4 import BeautifulSoup
 
def get_content(target):
    req = requests.get(url = target)
    req.encoding = 'utf-8'
    html = req.text
    bs = BeautifulSoup(html, 'html5lib')
    texts = bs.find('div', id='content')
    content = texts.text.strip().split('\xa0'*4)
    return content
 
if __name__ == '__main__':
    server = 'http://www.xbiquge.la'
    book_name = '从姑获鸟开始.txt'
    target = 'http://www.xbiquge.la/18/18446/'
    req = requests.get(url = target)
    req.encoding = 'utf-8'
    html = req.text
    chapter_bs = BeautifulSoup(html, 'lxml')
    chapters = chapter_bs.find('div', id='list')
    chapters = chapters.find_all('a')
    for chapter in tqdm(chapters):
        chapter_name = chapter.string
        url = server + chapter.get('href')
        time.sleep(1)
        content = get_content(url)
        with open(book_name, 'a', encoding='utf-8') as f:
            f.write(chapter_name)
            f.write('\n')
            f.write('\n'.join(content))
            f.write('\n')

总结 关于time.sleep(),顾名思义,该函数的作用是让程序停止1秒,因为在一定时间内过多的请求某网站,可能会触发完站的反爬机制,让网站拒绝你的请求。

03、总结

快乐的时光总是短暂的,本文到这里也就结束了。

在这篇文章中,我们应用我们学习到知识,爬了一本小说,了解了BeautifulSoup库的基本使用。

在下一篇文章中,我将会和大家一起来讨论,BeautifulSoup库的基本用法和常用函数

让我们一起向更优秀的自己前进。