【Python爬虫】爬取名人名言页面并进行简单的数据清洗(入门级)

目录

资源链接

一、网站选择

二、数据爬取要求

三、数据清洗要求

四、实现代码

1.数据采集

2.数据清洗


资源链接

下面有笔者所放的源码下载链接,读者可自行下载:

链接:https://pan.baidu.com/s/1YmTdlnbSJLvLrrx92zz6Qg

提取码:wkk6

一、网站选择

scrapy官方提供的网站:Quotes to Scrape

二、数据爬取要求

使用requests库,获取1-10页的名人名言页面,获取名人名言和作者两项信息,结果存放到"名人名言.csv"文件中,并将文件保存在data目录下,如果目录不存在,则先创建目录.

三、数据清洗要求

读取"名人名言.csv",数据列名为"名言"和"姓名",删除数据项为空的数据,删除重复数据,增加"时间"列,数据为"2023-06",结果存放到"清洗结果.csv"中,保存在data目录。

四、实现代码

1.数据采集

python 复制代码
import requests  # 导入用于发送HTTP请求的库
from bs4 import BeautifulSoup  # 导入用于解析HTML的库
import csv  # 导入用于处理CSV文件的库
import os  # 导入用于进行操作系统相关操作的库

# 定义函数 get_html,用于获取网页内容
def get_html(url, time=10):
    try:
        # 发送HTTP GET请求
        re = requests.get(url, timeout=time)
        # 设置编码
        re.encoding = re.apparent_encoding
        # 如果请求返回状态码不是200,抛出异常
        re.raise_for_status()
        return re.text  # 返回网页内容
    except Exception as error:
        print(error)  # 输出错误信息

# 定义函数 parser,用于解析HTML内容并提取数据
def parser(html):
    soup = BeautifulSoup(html, "lxml")  # 使用BeautifulSoup解析HTML
    out_list = []  # 初始化存储结果的列表
    # 遍历所有符合条件的元素
    for row in soup.select(".quote"):
        text = row.select_one(".text").get_text(strip=True)  # 提取名言文本
        author = row.select_one(".author").get_text(strip=True)  # 提取作者名字
        out_list.append([text, author])  # 将结果添加到列表
    return out_list  # 返回结果列表

# 定义函数 save_csv,用于将数据保存到CSV文件中
def save_csv(item, path):
    directory = os.path.dirname(path)  # 获取文件目录路径
    if not os.path.exists(directory):  # 如果目录不存在
        os.makedirs(directory)  # 创建目录

    # 以追加模式(a+)打开CSV文件
    with open(path, 'a+', newline='', encoding='utf-8') as f:
        csv_write = csv.writer(f)  # 创建CSV写入对象
        csv_write.writerows(item)  # 写入数据

# 主程序
if __name__ == "__main__":
    # 遍历前10页
    for i in range(1, 11):
        url = "http://quotes.toscrape.com/page/{0}/".format(i)  # 构造URL
        html = get_html(url)  # 获取HTML内容
        out_list = parser(html)  # 解析HTML并提取数据
        save_csv(out_list, "data/名人名言.csv")  # 保存数据到CSV文件

print("名人名言已保存到:data/名人名言.csv")  # 输出提示信息

代码解释:

从一个名言网站 http://quotes.toscrape.com/ 爬取名言数据,并保存到本地的 CSV 文件中:

  1. 导入必要的库

    • requests 用于发送HTTP请求
    • BeautifulSoup 用于解析HTML
    • csv 用于处理CSV文件
    • os 用于处理文件和目录
  2. 定义 get_html 函数

    • 接受一个URL和超时时间参数,发送GET请求获取网页内容
    • 请求成功则返回网页内容,否则打印错误信息
  3. 定义 parser 函数

    • 接受HTML内容,使用BeautifulSoup解析HTML
    • 从HTML中提取包含名言和作者信息的元素,存储在一个列表中并返回
  4. 定义 save_csv 函数

    • 接受要保存的数据和目标文件路径
    • 检查并创建存储目录(如果不存在)
    • 以追加模式打开CSV文件,将数据写入文件
  5. 主程序执行部分

    • 遍历前10页,构造每个页面的URL
    • 获取每个页面的HTML内容,解析并提取数据
    • 将提取的数据保存到指定的CSV文件中
  6. 输出提示信息

    程序结束后,输出提示信息,告知数据已保存到特定位置

2.数据清洗

python 复制代码
import pandas as pd  # 导入用于数据处理的Pandas库

# 定义函数 clean_data,用于清洗数据
def clean_data(input_path, output_path):
    # 读取CSV文件并指定列名为"名言"和"姓名",不使用文件的头部信息作为列名
    df = pd.read_csv(input_path, names=["名言", "姓名"], header=None, encoding='utf-8')
    
    # 删除包含缺失值的行
    df.dropna(inplace=True)
    
    # 删除重复的行
    df.drop_duplicates(inplace=True)
    
    # 添加新列"时间",赋值为固定时间"2023-06"
    df["时间"] = "2023-06"
    
    # 将处理后的数据保存到CSV文件中,不保存索引信息
    df.to_csv(output_path, index=False, encoding='utf-8')

# 主程序执行部分
if __name__ == "__main__":
    input_file = "data/名人名言.csv"  # 输入文件路径
    output_file = "data/清洗结果.csv"  # 输出文件路径
    clean_data(input_file, output_file)  # 调用clean_data函数进行数据清洗
    print("清洗后的数据已保存到:data/清洗结果.csv")  # 输出提示信息

代码解释:

对输入的CSV文件进行处理后保存为新的CSV文件。

  1. 导入必要的库

    pandas 用于数据处理

  2. 定义 clean_data 函数

    • 该函数接受输入文件路径和输出文件路径作为参数
    • 使用Pandas读取CSV文件,指定列名为"名言"和"姓名",不使用文件头部信息作为列名
    • 删除包含缺失值的行和重复行
    • 添加新列"时间",所有行的值都设为"2023-06"
    • 将清洗后的数据保存到输出文件中,不保存索引信息
  3. 主程序执行部分

    • 指定输入文件和输出文件的路径
    • 调用 clean_data 函数,对数据进行清洗操作
    • 输出提示信息,告知清洗后的数据已保存到特定位置
相关推荐
hccee10 分钟前
C# IO文件操作
开发语言·c#
hummhumm15 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
杜小满19 分钟前
周志华深度森林deep forest(deep-forest)最新可安装教程,仅需在pycharm中完成,超简单安装教程
python·随机森林·pycharm·集成学习
J老熊25 分钟前
JavaFX:简介、使用场景、常见问题及对比其他框架分析
java·开发语言·后端·面试·系统架构·软件工程
zmd-zk39 分钟前
flink学习(2)——wordcount案例
大数据·开发语言·学习·flink
好奇的菜鸟43 分钟前
Go语言中的引用类型:指针与传递机制
开发语言·后端·golang
Alive~o.01 小时前
Go语言进阶&依赖管理
开发语言·后端·golang
花海少爷1 小时前
第十章 JavaScript的应用课后习题
开发语言·javascript·ecmascript
手握风云-1 小时前
数据结构(Java版)第二期:包装类和泛型
java·开发语言·数据结构
databook1 小时前
『玩转Streamlit』--布局与容器组件
python·机器学习·数据分析