我们先来选定爬取目标,我爬取的网站是https://www.17k.com/ ,一些大型的网站(如起点、豆瓣等)做了反爬虫的部署,这会大大增加我们抓取的难度,所以尽量还是选一些不那么热门的网站。
爬虫的第一步,也是最重要的一步,就是分析网页的结构,定位到我们想要抓取的内容。首先点开一本书的某一章节,这里以小说《第九特区》的第一章《初来乍到》为例展开(https://www.17k.com/chapter/3038645/38755562.html),分析某一章的页面内容结构。
首先来看标题,这个非常简单,标题直接存在于<h1>标签中,我们指导html中<h1>通常是用来标记主标题的,那么理所当然<h1>标签应该只有一个,所以直接放心的用BeautifulSoup的select()方法将找到的第一个<h1>标签找到即可,里面的文本内容就是这一章的标题。主要代码如下:
title = bs.select('h1')[0]
得到了标题,我们再来看正文。
不难发现,所有的文章正文都被包裹在了一个class为“p"的<div>标签里,这个div应该就是用来封装所有正文内容的。所以,我们通过select方法找到CSS类名为”p“的<div>标签,在将里面所有的<p>标签找到,提取出文本内容即可。主要代码如下:
body = bs.select('div.p')[0]
paragraphs = body.find_all('p')
content = []
for p in paragraphs:
content.append(p.text)
content.append("\n")
这里用了一个列表来存储所有的段落,并且在每一段后面手动添加了换行"\n"。这样操作的好处是,后面保存文件的时候可以一次性写入,节省了IO的时间。
基于以上的核心代码,再配合上文件读写,url请求等常见操作,我们就可以写出得到一个章节的全部内容并保存的代码getASection,代码如下