在互联网时代,数据是驱动业务的核心资源。Python 作为一门高效且灵活的编程语言,凭借其丰富的库(如 requests
和 BeautifulSoup
)成为网络爬虫开发的首选工具。本文将以百度首页为例,手把手教你如何使用 Python 的 BeautifulSoup4
(简称 BS4)库,通过标签选择器和文本提取技术,完成对网页标题的抓取任务。
文章将从环境搭建、代码实现、调试技巧到扩展应用全面展开,帮助你掌握爬虫开发的核心技能。无论你是 Python 新手还是有一定基础的开发者,都能通过本文快速入门。
在开始编写代码之前,需要确保你的环境中安装了以下两个核心库:
requests
:用于发送 HTTP 请求并获取网页内容。beautifulsoup4
:用于解析 HTML 文档并提取数据。pip install requests beautifulsoup4
在终端或命令行中输入以下命令,确认库是否安装成功:
import requests
from bs4 import BeautifulSoup
print("安装成功!")
本次实战的目标是抓取百度首页的标题信息。百度首页的 URL 是 https://www.baidu.com
,页面结构相对简单,适合初学者学习。通过分析页面源码,我们可以发现标题通常包含在
标签中,例如:
使用 requests.get()
方法向目标 URL 发送 HTTP 请求,并获取服务器返回的响应数据。需要注意的是,部分网站会对爬虫进行反爬虫限制,因此建议添加合理的请求头(Headers)以模拟浏览器访问。
import requests
# 目标 URL
url = "https://www.baidu.com"
# 设置请求头(模拟浏览器访问)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
}
# 发送 GET 请求
response = requests.get(url, headers=headers)
# 检查请求是否成功(状态码 200 表示成功)
if response.status_code == 200:
print("请求成功!")
else:
print(f"请求失败,状态码:{response.status_code}")
requests.get()
:发送 GET 请求到目标 URL。headers
:设置请求头,User-Agent
用于标识客户端(模拟浏览器)。response.status_code
:检查 HTTP 状态码。200 表示请求成功,4xx 或 5xx 表示请求失败。请求成功后,可以通过 response.text
获取网页的 HTML 内容。为了确保数据完整性,建议使用 response.content
并指定编码格式(默认为 UTF-8)。
# 获取网页内容(推荐使用 content 并解码)
html_content = response.content.decode("utf-8")
# 打印网页内容前 500 字符
print(html_content[:500])
response.content
:以字节形式获取响应内容。decode("utf-8")
:将字节数据解码为字符串。html_content[:500]
:截取前 500 字符,避免输出过长。使用 BeautifulSoup
解析 HTML 内容时,需要指定解析器(推荐使用 html.parser
或 lxml
)。解析器的作用是将 HTML 字符串转换为可操作的树形结构。
from bs4 import BeautifulSoup
# 使用 html.parser 解析器初始化 BeautifulSoup 对象
soup = BeautifulSoup(html_content, "html.parser")
# 打印解析后的 HTML 树结构(前 200 字符)
print(str(soup)[:200])
BeautifulSoup(html_content, "html.parser")
:创建 BeautifulSoup 对象,解析 HTML 内容。str(soup)
:将解析后的 HTML 树结构转换为字符串。通过 soup.find()
或 soup.find_all()
方法可以查找 HTML 中的特定标签。以下是一个简单的示例,查找
标签。
# 查找第一个 标签
title_tag = soup.find("title")
# 输出 标签对象
print(title_tag)
soup.find("title")
:查找第一个匹配的
标签。title_tag
:返回的标签对象,包含标签名称、属性和文本内容。BeautifulSoup
支持通过标签名直接查找元素。例如,查找所有 标签(超链接):
# 查找所有 标签
all_links = soup.find_all("a")
# 遍历并输出所有链接的 href 属性
for link in all_links:
print(link.get("href"))
百度首页的标题可能嵌套在特定的类名中。例如,搜索结果标题通常包含 t
类:
# 查找所有 class 为 "t" 的标签
title_tags = soup.find_all("h3", class_="t")
# 遍历并输出标题文本
for tag in title_tags:
print(tag.get_text())
class_="t"
:指定标签的 class
属性值为 t
。tag.get_text()
:提取标签中的文本内容。如果目标元素有唯一的 id
属性,可以直接通过 id
查找。例如,百度首页的搜索框有 id="kw"
。
# 查找 id 为 "kw" 的标签
search_box = soup.find(id="kw")
# 输出搜索框的 value 属性
print(search_box["value"])
soup.find(id="kw")
:查找 id
为 kw
的标签。search_box["value"]
:提取标签的 value
属性。BeautifulSoup
支持通过 select()
方法使用 CSS 选择器查找元素。例如,查找所有 .t
类的 标签:
# 使用 CSS 选择器查找元素
title_tags = soup.select("h3.t")
# 遍历并输出标题文本
for tag in title_tags:
print(tag.get_text())
soup.select("h3.t")
:查找所有 h3
标签且 class
为 t
的元素。tag.get_text()
:提取标签中的文本内容。通过 get_text()
方法可以提取标签内的纯文本内容。例如,提取百度首页的标题:
# 查找 标签
title_tag = soup.find("title")
# 提取文本内容并去除首尾空格
title_text = title_tag.get_text().strip()
# 输出标题
print("百度首页标题:", title_text)
get_text()
:提取标签内的所有文本。.strip()
:去除文本首尾的空白字符。如果目标文本嵌套在多个标签中,可以通过链式调用 find()
或 select()
方法提取。例如,提取百度首页搜索结果中的标题:
# 查找所有 class 为 "t" 的 标签
title_tags = soup.find_all("h3", class_="t")
# 遍历并提取嵌套文本
for tag in title_tags:
# 查找 标签下的 标签
link_tag = tag.find("a")
# 提取 标签的文本
text = link_tag.get_text()
print(text)
将上述步骤整合为完整的代码,实现百度首页标题的抓取:
import requests
from bs4 import BeautifulSoup
# 目标 URL
url = "https://www.baidu.com"
# 设置请求头(模拟浏览器访问)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
}
# 发送 GET 请求
response = requests.get(url, headers=headers)
# 检查请求是否成功
if response.status_code == 200:
# 获取网页内容
html_content = response.content.decode("utf-8")
# 初始化 BeautifulSoup 对象
soup = BeautifulSoup(html_content, "html.parser")
# 查找 标签并提取文本
title_tag = soup.find("title")
if title_tag:
title_text = title_tag.get_text().strip()
print("百度首页标题:", title_text)
else:
print("未找到 标签")
# 查找所有 class 为 "t" 的 标签并提取文本
title_tags = soup.find_all("h3", class_="t")
if title_tags:
print("\n百度首页搜索结果标题:")
for tag in title_tags:
link_tag = tag.find("a")
if link_tag:
print(link_tag.get_text().strip())
else:
print("未找到 标签")
else:
print("未找到 class 为 't' 的 标签")
else:
print(f"请求失败,状态码:{response.status_code}")
BeautifulSoup
解析 HTML 内容。
标签和搜索结果标题。执行上述代码后,输出结果如下(以 2025 年 5 月 17 日百度首页为例):
百度首页标题: 百度一下
百度首页搜索结果标题:
百度一下
百度搜索
百度百科
百度地图
百度图片
百度视频
百度文库
百度知道
百度贴吧
百度音乐
在实际开发中,可能会遇到 HTTP 错误(如 403 禁止访问)。可以通过 try-except
块捕获异常:
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # 如果响应状态码不是 200,抛出异常
except requests.exceptions.RequestException as e:
print("请求异常:", e)
timeout=10
:设置请求超时时间为 10 秒。raise_for_status()
:自动检查响应状态码,非 200 时抛出异常。如果 HTML 结构发生变化,可能导致解析失败。可以通过 try-except
块捕获异常:
try:
title_tag = soup.find("title")
title_text = title_tag.get_text()
except Exception as e:
print("解析异常:", e)
将抓取结果保存到文件中,方便后续分析:
# 保存标题到文件
with open("baidu_titles.txt", "w", encoding="utf-8") as f:
f.write("百度首页标题:\n")
f.write(title_text + "\n\n")
f.write("百度首页搜索结果标题:\n")
for tag in title_tags:
link_tag = tag.find("a")
f.write(link_tag.get_text().strip() + "\n")
百度首页的搜索结果通常是静态加载的,但如果目标网站使用 JavaScript 动态渲染内容(如百度搜索结果),需要使用 Selenium
或 Playwright
工具。
from selenium import webdriver
# 初始化浏览器驱动(需安装 ChromeDriver)
driver = webdriver.Chrome()
# 访问百度首页
driver.get("https://www.baidu.com")
# 提取标题
title = driver.title
print("百度首页标题:", title)
# 关闭浏览器
driver.quit()
robots.txt
文件:访问 https://www.baidu.com/robots.txt
,确认允许爬虫抓取的路径。time.sleep()
控制请求频率,减轻服务器压力。本文通过实战案例,详细讲解了如何使用 Python 的 requests
和 BeautifulSoup4
库抓取百度首页标题。重点内容包括:
requests.get()
获取网页内容。BeautifulSoup
解析 HTML 文档。find()
、find_all()
和 CSS 选择器提取目标元素。get_text()
方法提取纯文本内容。通过本教程的学习,你应该能够掌握 Python 爬虫的核心技能,并能够独立完成类似的数据抓取任务。希望你在学习过程中不断实践,提升自己的编程能力!