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文件,把它的外衣一层层的剥开
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库的基本用法和常用函数。
让我们一起向更优秀的自己前进。