爬取专栏文章标题保存到 CSV 文件中
目标
从一个网页上抓取数据,并保存到一个 CSV 文件中。
具体是爬取 微机系统与接口上机实验_TD PITE型 专栏里的所有 文章标题 并 保存到 csv 文件 中。
分析网页
网址:https://blog.csdn.net/xiaoyuting999/category_12222173.html
打开浏览器开发人员工具:
方法一:点击浏览器(以 Edge 浏览器为例)右上角三个点 ⋯ \cdots ⋯ -> 更多工具 -> 开发人员工具,
方法二:在网页右键,检查,
方法三:windows 直接快捷键 fn(若有) + f12,
打开页面如下:
按照如下图操作,
可以看到,我们定位到了 h2
标签,也就是说该页面中的 文章标题所在的元素 都是 应用了 h2
标签,所以我们需要 提取出该页面所有的 h2
标签,然后 再提取出 h2
标签的 text
内容即文章标题。
代码及理解
# 导入 requests 库和 BeautifulSoup 库
import requests
from bs4 import BeautifulSoup
# 定义要抓取数据的网页 URL
url = "https://blog.csdn.net/xiaoyuting999/category_12222173.html"
# 发送 GET 请求到网页,获取响应对象
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76'
}
response = requests.get(url, headers = headers)
# 从响应对象中解析出 HTML 内容
html = response.text
# 用 BeautifulSoup 库解析 HTML 内容,创建一个 soup 对象
soup = BeautifulSoup(html, "html.parser")
# 从 soup 对象中找到所有的 h2 标签,它们包含了文章标题
h2_tags = soup.find_all("h2")
# 创建一个空列表,用来存储文章标题
titles = []
# 遍历所有的 h2 标签,提取出它们的文本内容(即文章标题),并添加到列表中
for tag in h2_tags:
title = tag.text.strip()
titles.append(title)
# 导入 csv 库
import csv
# 定义要保存数据的 CSV 文件名
csv_file = "article_titles.csv"
# 以写入模式打开 CSV 文件,创建一个 csv.writer 对象
with open(csv_file, "w") as file:
writer = csv.writer(file)
# 遍历标题列表,把每个标题写入到 CSV 文件中
for title in titles:
writer.writerow([title])
# 打印提示信息,表示程序运行结束
print("Article titles scraped and saved to CSV file.")
# 以下代码是防止爬取的内容存储到 csv 文件中出现乱码
# 用 Python 代码来检测和转换文件的编码,使用 chardet 库来检测文件的编码,然后使用 codecs 库来转换文件的编码
# 导入 chardet 和 codecs 库
import chardet
import codecs
# 定义要检测和转换的 csv 文件名
csv_file = "article_titles.csv"
# 以二进制模式打开 csv 文件,读取文件内容
with open(csv_file, "rb") as file:
data = file.read()
# 使用 chardet 库检测文件的编码
encoding = chardet.detect(data)["encoding"]
# 打印文件的编码
print(f"The encoding of {csv_file} is {encoding}")
# 如果文件的编码不是 UTF-8,就转换为 UTF-8
if encoding != "utf-8":
# 使用 codecs 库以原始编码打开 csv 文件,读取文件内容
with codecs.open(csv_file, "r", encoding) as file:
content = file.read()
# 使用 codecs 库以 UTF-8 编码写入 csv 文件,覆盖原始内容
with codecs.open(csv_file, "w", "utf-8") as file:
file.write(content)
# 打印提示信息,表示转换成功
print(f"The encoding of {csv_file} has been converted to UTF-8")
代码可以分为三个小部分,
- 第一部分是 从网页中提取出文章标题;
- 需要知道 待爬取的网页的
URL
;- 使用
requests
库对URL
对应的网页进行 抓取;- 使用
BeautifulSoup
库对抓取的网页进行 解析。
- 第二部分是将提取出的文章标题 存储到 CSV 文件中,
- 第三部分是 防止 CSV 文件出现乱码而做的工作。
代码段一
# 发送 GET 请求到网页,获取响应对象
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76'
}
response = requests.get(url, headers = headers)
这段代码使用 requests
库发送一个 GET
请求到目标网页,通过设置请求头信息来模拟浏览器发送请求。
-
这里使用
requests.get()
函数发送GET
请求时,创建了一个字典类型的变量 h e a d e r s headers headers,其中包含了 请求头信息。 -
请求头信息是 向服务器发送请求时传递的一些额外信息,用于告诉服务器请求的详细情况。在这段代码中,设置了
User-Agent
字段,这是一个常见的请求头字段,用于 标识客户端的浏览器类型和版本。 -
请求头信息并非必须设置,但在实际应用中,设置适当的请求头信息可以提高请求的成功率,并模拟特定的客户端类型来获取更好的响应。
以下是一些常见的请求头信息(详细内容见 准备篇(五)开发人员工具):
User-Agent
(用户代理):用于 标识客户端的浏览器类型和版本。
例如:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
Accept
(接受内容类型):用于 告诉服务器客户端能够接受的内容类型。
例如:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer
(来源页面):用于 指示当前请求的来源页面地址。
例如:
Referer: https://www.example.com
Cookie
(Cookie 信息):用于 在请求中发送 HTTP Cookie。
例如:
Cookie: sessionid=××××××; username=×××
Authorization
(授权信息):用于 在需要身份验证的请求中发送认证凭据。
例如:
Authorization: Bearer your_token_here
代码段二
# 创建一个空列表,用来存储文章标题
titles = []
# 遍历所有的 h2 标签,提取出它们的文本内容(即文章标题),并添加到列表中
for tag in h2_tags:
title = tag.text.strip()
titles.append(title)
title = tag.text.strip()
:对于每个 h2
标签,使用 .text
属性获取其文本内容,然后使用 .strip()
方法去除文本内容两端的空格和换行符,将处理后的标题文本赋值给变量
t
i
t
l
e
title
title。
titles.append(title)
:将处理后的标题添加到
t
i
t
l
e
s
titles
titles 列表中。
最终, t i t l e s titles titles 列表中存储了从 HTML 页面中提取的所有文章标题。
成果展示
该专栏所有的文章标题都提取到 article_titles.csv
文件中,并且没有乱码。