当前位置: 首页 > news >正文

Python 爬虫入门教程:Requests 和 BeautifulSoup 实战

引言:什么是网络爬虫?

在之前的所有章节中,我们都假设数据是以整洁的 CSV 文件形式存在的。但在现实世界中,大量有价值的数据都以非结构化的形式存在于网页上。当没有现成的文件下载或官方 API 可用时,网络爬虫(Web Scraping) 就成了我们获取数据的利器。

网络爬虫,或称网络抓取,是一个自动化的过程,它通过程序访问网站并从中提取所需信息。Python 因其简洁的语法和强大的第三方库,是实现网络爬虫的首选语言。本篇将介绍两个最核心、最基础的爬虫库:requestsBeautifulSoup

爬虫的伦理与法律

在编写任何爬虫代码之前,我们必须首先讨论伦理和法律问题。技术能力不应凌驾于规则和尊重之上。一个负责任的爬虫开发者(或称“好机器人”)应遵循以下基本原则:

  • 检查 robots.txt 文件: 这是网站所有者与爬虫程序沟通的“君子协定”。每个网站的根目录下(如 domain.com/robots.txt)通常都有这个文件,它明确规定了哪些页面允许爬虫访问,哪些禁止访问 (Disallow)。虽然它没有法律强制性,但遵守它是爬虫伦理的首要原则。
  • 阅读服务条款 (Terms of Service): 网站的服务条款通常会说明是否允许自动化访问和数据抓取。违反服务条款可能会导致你的 IP 地址被封禁,甚至面临法律风险。
  • 不要对服务器造成过大压力: 过于频繁的请求会给网站服务器带来巨大负担,影响正常用户的访问,甚至可能导致网站瘫痪。在你的爬虫代码中,必须加入延迟(如 time.sleep(1)),以模拟人类的访问速度,这是最基本的礼貌。
  • 优先使用 API: 如果网站提供 API (Application Programming Interface),那它就是获取数据的官方、合法且高效的途径。爬虫应该是没有 API 时的备用方案。
  • 明确你的身份: 在发送请求时,通过设置 Headers 中的 User-Agent 来表明你的爬虫身份,而不是伪装成浏览器。

爬虫工具箱:requests 与 BeautifulSoup

我们的入门级爬虫工作流分为两步,分别由两个库完成:

  1. requests: 用于向目标网站发送 HTTP 请求,并获取网页的 HTML 源代码。它就像一个浏览器,但只负责下载内容,而不负责渲染。
  2. BeautifulSoup: 用于解析 requests 获取到的 HTML 源代码。它将杂乱的 HTML 字符串转换成一个结构化的、可以轻松导航和搜索的 Python 对象树,让我们能够方便地提取所需信息。

首先,安装这两个库:

pip install requests beautifulsoup4

步骤一:使用 requests 获取网页内容

requests 库使得发送 HTTP 请求变得异常简单。最常用的请求是 GET 请求,用于从服务器获取数据。

import requestsurl = 'http://quotes.toscrape.com/'
response = requests.get(url)# 检查请求是否成功 (状态码 200 表示成功)
if response.status_code == 200:html_content = response.text# print(html_content[:500]) # 打印前500个字符看看
else:print(f"请求失败,状态码: {response.status_code}")

response.text 包含了整个页面的 HTML 源代码字符串。

步骤二:使用 BeautifulSoup 解析 HTML

直接处理 HTML 字符串是繁琐且易错的。BeautifulSoup 可以将这个字符串解析成一个易于操作的对象。

from bs4 import BeautifulSoup# 使用 html.parser 解析器创建 BeautifulSoup 对象
soup = BeautifulSoup(html_content, 'html.parser')

步骤三:查找元素

这是爬虫的核心。BeautifulSoup 提供了强大的查找功能,最常用的是 find()find_all()

  • find(tag, attributes): 返回第一个匹配的元素。
  • find_all(tag, attributes): 返回一个包含所有匹配元素的列表。

我们可以根据以下条件查找元素:

  • 标签名 (Tag name): soup.find_all('p') 会找到所有 <p> 标签。
  • CSS 类名 (CSS class): soup.find_all('div', class_='quote') 会找到所有 class 属性为 quote<div> 标签。注意,因为 class 是 Python 的关键字,所以这里用 class_
  • ID: soup.find(id='main-content') 会找到 idmain-content 的元素。

找到元素后,我们可以提取其内容:

  • .text.get_text(): 获取标签内的所有文本内容。
  • element['attribute_name']: 获取标签的属性值,如 link_tag['href'] 获取链接地址。

实战项目:抓取名人名言

让我们结合所学,完成一个完整的迷你项目:从网站 http://quotes.toscrape.com/ 抓取第一页的所有名言及其作者,并存入 Pandas DataFrame

通过浏览器“检查元素”功能,我们可以发现每条名言都包含在一个 class="quote"<div> 中。名言本身在 class="text"<span> 内,作者在 class="author"<small> 内。

import requests
from bs4 import BeautifulSoup
import pandas as pd# 1. 获取网页内容
url = 'http://quotes.toscrape.com/'
response = requests.get(url)# 2. 解析 HTML
soup = BeautifulSoup(response.text, 'html.parser')# 3. 查找所有名言容器
quotes_data = []
quote_elements = soup.find_all('div', class_='quote')# 4. 遍历每个容器,提取信息
for element in quote_elements:text = element.find('span', class_='text').textauthor = element.find('small', class_='author').textquotes_data.append({'quote': text, 'author': author})# 5. 存入 DataFrame 并展示
df_quotes = pd.DataFrame(quotes_data)
print(df_quotes.head())

输出:

                                               quote           author
0  “The world as we have created it is a process...  Albert Einstein
1  “It is our choices, Harry, that show what we...     J.K. Rowling
2  “There are only two ways to live your life. O...  Albert Einstein
3  “The person, be it gentleman or lady, who has...      Jane Austen
4. “Imperfection is beauty, madness is genius an...   Marilyn Monroe

总结

在本篇中,我们学习了网络爬虫的基础知识,强调了伦理先行。我们掌握了使用 requests 库获取网页,以及使用 BeautifulSoup 解析和提取数据的核心流程。通过一个完整的实例,你已经具备了从静态网页中抓取结构化信息的能力。

这仅仅是爬虫世界的冰山一角。更复杂的网站可能会使用 JavaScript 动态加载内容,这时就需要 Selenium 等更高级的工具来模拟浏览器行为。但 requests + BeautifulSoup 的组合已经足以应对大量的爬虫任务,是你数据工具箱中一个非常有价值的补充。

至此,我们“Python 数据分析与机器学习入门”系列博客圆满结束。希望这个系列能为您打开数据世界的大门,祝您在未来的学习和探索中一帆风-顺!

http://www.lqws.cn/news/588547.html

相关文章:

  • 设置方法区内存的大小
  • Linux 系统管理:自动化运维与容器化部署
  • 深入理解指针(3)
  • 【甲方安全建设】敏感数据检测工具 Earlybird 安装使用详细教程
  • httpd-devel 与服务无关
  • BERT 模型详解:结构、原理解析
  • AI编程实战:Cursor黑科技全解析
  • RocketMQ第五节(springboot整合MQ)
  • 计算机网络中那些常见的路径搜索算法(一)——DFS、BFS、Dijkstra
  • 从性能优化赛到社区Committer,走进赵宇捷在Apache Fory的成长之路
  • 条件运算符和逗号运算
  • 重头开始学ROS(8)---LVI-SLAM复现与实机部署Ubuntu20.04
  • Flutter视频压缩插件video_compressffmpeg_kit_flutter_new
  • C#索引和范围:简化集合访问的现代特性详解
  • 【Springai】 2指定模型的三种方式(Ollama)
  • 【算法】动态规划:1137. 第 N 个泰波那契数
  • (12)python+playwright自动化测试-iframe-中
  • torchvision中的数据使用
  • vue常见问题:
  • RNN中张量参数的含义与应用
  • stm32达到什么程度叫精通?
  • 如何用废弃电脑变成服务器搭建web网站(公网访问零成本)
  • 【知识图谱构建系列7】:结果评价(1)
  • JavaScript异步编程的五种方式
  • git 冲突解决
  • Android Fragment的生命周期(经典版)
  • 详解 Blazor 组件传值
  • Spring Boot + ONNX Runtime模型部署
  • 【机器学习】感知机学习算法(Perceptron)
  • 安卓面试之红黑树、工厂模式图解