目录
资源链接
下面有笔者所放的源码下载链接,读者可自行下载:
链接: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 文件中:
-
导入必要的库:
requests
用于发送HTTP请求BeautifulSoup
用于解析HTMLcsv
用于处理CSV文件os
用于处理文件和目录
-
定义
get_html
函数:- 接受一个URL和超时时间参数,发送GET请求获取网页内容
- 请求成功则返回网页内容,否则打印错误信息
-
定义
parser
函数:- 接受HTML内容,使用BeautifulSoup解析HTML
- 从HTML中提取包含名言和作者信息的元素,存储在一个列表中并返回
-
定义
save_csv
函数:- 接受要保存的数据和目标文件路径
- 检查并创建存储目录(如果不存在)
- 以追加模式打开CSV文件,将数据写入文件
-
主程序执行部分:
- 遍历前10页,构造每个页面的URL
- 获取每个页面的HTML内容,解析并提取数据
- 将提取的数据保存到指定的CSV文件中
-
输出提示信息:
程序结束后,输出提示信息,告知数据已保存到特定位置
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文件。
-
导入必要的库:
pandas
用于数据处理 -
定义
clean_data
函数:- 该函数接受输入文件路径和输出文件路径作为参数
- 使用Pandas读取CSV文件,指定列名为"名言"和"姓名",不使用文件头部信息作为列名
- 删除包含缺失值的行和重复行
- 添加新列"时间",所有行的值都设为"2023-06"
- 将清洗后的数据保存到输出文件中,不保存索引信息
-
主程序执行部分:
- 指定输入文件和输出文件的路径
- 调用
clean_data
函数,对数据进行清洗操作 - 输出提示信息,告知清洗后的数据已保存到特定位置