文章目录
一. TXT 文本存储
1. 基本实例
首先,可以用 requests
将网页源代码获取下来,然后使用 BeautifulSoup
解析库解析,完整代码如下:
import requests
from bs4 import BeautifulSoup
def getHtml(url):
# 获取网页数据
html = requests.get(url)
htmlCode = html.text
# 解析网页
soup = BeautifulSoup(htmlCode,'html.parser')
# 返回解析后的页面内容
return soup
def getTitle(url):
soup = getHtml(url)
title = soup.find('div',class_="book_info").find('h1').string
return title
# 获取各章节所在的网页链接
def getCatalogList(url):
soup = getHtml(url)
# 查找所有章节的链接
listBox = soup.find('div', class_="book_list").find_all('a')
# 新建列表用来储存链接列表中的URL
bookLists = []
for i in listBox:
listUrl = i['href']
bookLists.append(listUrl)
return bookLists
# 获取各章节正文
def getNovelContent(url):
soup = getHtml(url)
# 获得需要的正文内容
content = soup.find('div', class_="contentbox").text
content = content.strip()
contentCut = content.replace("本章未完,点击[ 下一页 ]继续阅读-->>","").replace("本章有错误,我要提交上一章 返回目录 下一章","").replace("小提示:按 回车[Enter]键 返回书目,按 ←键 返回上一页, 按 →键 进入下一页。","")
return contentCut
# 保存文件到本地
def saveNovel(url):
bookLists = getList(url)
title = getTitle(url)
num = 1
with open('%s.txt'%title, 'a' ,encoding='utf-8') as f:
for listUrl in bookLists:
# 拼接完整的每个章节的链接地址
chapterUrl = url + listUrl
chapterContent = getNovelContent(chapterUrl)
f.write(chapterContent)
print('***第{}章下载完成***'.format(num))
num += 1
f.close()
if __name__ == '__main__':
url='http://www.moyanxsw.com/binbianbushihaitanghong/'
saveNovel(url)
上述代码实现小说《鬓边不是海棠红》各章节内容爬取的思路是:
- 首先可以通过目录页面获得小说所有章节的链接地址
- 然后通过第一步获得的链接地址,爬取每一章节的正文内容
- 最后把爬取到的正文保存在本地的 txt 文档中
下面我们分别来说说上面各个函数的功能。
**(1)getHtml():获取网站数据并解析网页 **
先用 requests.get()
方法获取一个HTTP状态码,然后用.text
方法来获取这个结果里的文本信息;最后用 BeautifulSoup4
将复杂的 HTML
文档转换成一个复杂的树形结构(每个节点都是Python对象,之后就可以利用 soup
加标签名轻松地获取这些标签的内容了),并将结果返回。
**(2)getTitle():获得小说标题 **
首先调用getHtml()
获得解析后的 HTML
,然后再获取小说标题所在的标签。标题是放在<div class="book_info">
中的<h1 >
标签里,所以直接用 soup.find('div',class_="book_info").find('h1').string
就可以拿出来了。
(3)getCatalogList():获取章节目录
首先调用getHtml()
获得解析后的 HTML
,然后再获取各章节目录的链接所在的标签。之前我们分析过,在目录页面中,所有的目录链接都放在 < div class="book_list">
中的<a>
标签里,所以我们可以用 soup.find('div', class_="book_list").find_all('a')
来获得所有符合条件的 <a>
标签了;通过上述代码可以获得一个包含所有 <a>
标签的列表,遍历所有的列表元素,获取各个 <a>
标签的 href
属性值,然后保存在 bookLists
中并返回。
**(4)getNovelContent():获取各章节正文 **
首先调用getHtml()
获得各章节内容所在页面解析后的 HTML
。需要注意的是,此时调用该函数时传递的 url
参数是拼接后的各章节正文内容所在的网页链接。由于正文部分是放在各个章节对应的正文页面的 < div class="contentbox">
中的,直接用 soup.find('div', class_="contentbox").text
就可以获得对应 div
中的所有小说正文内容,其中已过滤 HTML
的标签代码。在提取了各章节正文内容之后,用.strip()
方法去掉内容最后不属于小说正文的部分(因为正文底部的控件和文字也都包含在了 < div class="contentbox">
中)。
**(5)saveNovel():爬取小说正文后保存到本地 **
首先调用 getCatalogList(url)
和 getTitle(url)
函数,获得相应的返回内容;然后以追加模式打开一个 TXT 文件,遍历访问每一个 bookLists
中的元素所指向的小说各章节的链接,获取小说各章节的内容,然后将文本写入 TXT 文件中;最后关闭文件。
2. 打开方式
在刚才的实例中, open() 方法的第二个参数设置成了 a
,这样在每次写入文本时不会清空源文件,而是在文件末尾写入新的内容,这是一种文件打开方式。关于文件的打开方式,其实还有其他几种,这里简要介绍一下:
二. JSON 文件存储
JSON ,全称为 JavaScript Object Notation
也就 JavaScript
对象标记,它通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。JSON
格式数据的本质就是字符串。下面我们就来了解如何利用 Python 保存数据到 JSON 文件。
1. 基本实例
我们先来看看下面这个实例中将爬取数据保存为 JSON
数据。
例1:爬取猫眼电影网站上排名前100的电影信息
import re
import requests
import json
from requests.exceptions import RequestException
def get_open_page(url):
try:
headers = {