爬虫基础(9)数据存储之文件存储

本文介绍了Python爬虫中数据存储的三种方式:TXT文本存储、JSON文件存储和CSV文件存储。详细讲解了每种方式的基本实例、打开方式及相关操作,包括如何写入和读取数据,提供了具体的代码示例。
摘要由CSDN通过智能技术生成

一. 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 = {
   
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值