当前位置:首页 > 文章列表 > 文章 > python教程 > Python爬虫实战:requests与BeautifulSoup教程

Python爬虫实战:requests与BeautifulSoup教程

2025-08-06 18:51:46 0浏览 收藏

**Python爬虫教程:requests+BeautifulSoup实战** 想要快速掌握Python网页爬虫技术?本文将带你从零开始,利用requests库和BeautifulSoup库构建高效、灵活的爬虫程序。requests负责发起HTTP请求,轻松获取网页数据,而BeautifulSoup则专注于解析HTML,精准提取所需内容。我们将深入探讨如何应对常见的反爬机制,如User-Agent检测、请求频率限制,以及如何使用Session管理登录状态。此外,还将介绍CSV、JSON文件以及SQLite数据库等多种数据存储方式,助你有效管理爬取到的数据。更重要的是,本文强调爬虫的合法合规性,教你遵守robots.txt协议,尊重服务器负载,确保你的爬虫项目安全稳定运行。

使用Python实现网页爬虫的核心流程包括:发起请求、获取响应、解析HTML、提取数据;2. 选择requests和BeautifulSoup组合的原因是其学习曲线平缓、功能强大且灵活,requests库封装了HTTP请求的复杂性,BeautifulSoup能高效解析不规范的HTML结构;3. 应对反爬机制的方法包括:设置浏览器User-Agent头模拟真实访问、使用time.sleep()控制请求频率以避免IP被封、利用requests.Session()管理登录状态和Cookies;4. 爬取数据的存储方式根据需求选择:小规模结构化数据可保存为CSV或JSON文件,大规模或需复杂查询的数据推荐使用SQLite等数据库;5. 数据管理还需遵守robots.txt协议、控制请求频率以尊重服务器负载,并确保符合相关法律法规,保障爬虫合法合规运行。

Python如何实现网页爬虫?requests+BeautifulSoup

Python实现网页爬虫,利用requests库负责发送HTTP请求,获取网页的原始数据,而BeautifulSoup库则专注于解析这些数据,从中精准地提取所需内容。这个组合可以说是我个人在日常数据抓取任务中的“瑞士军刀”,兼顾效率与灵活性。

解决方案

要用Python实现网页爬虫,核心流程其实并不复杂,它通常包括这几步:发起请求、获取响应、解析HTML、提取数据。

我们先引入必要的库:

import requests
from bs4 import BeautifulSoup
import time # 用于设置延时,做个有礼貌的爬虫

接着,以一个简单的例子来说明:抓取某个网页的标题和所有段落文本。

url = 'https://example.com' # 替换成你要抓取的网页URL

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
} # 模拟浏览器访问,这是个好习惯

try:
    response = requests.get(url, headers=headers, timeout=10) # 设置超时,避免无限等待
    response.raise_for_status() # 如果状态码不是200,抛出HTTPError异常

    # 使用BeautifulSoup解析HTML内容
    soup = BeautifulSoup(response.text, 'html.parser')

    # 提取标题
    title = soup.title.string if soup.title else '无标题'
    print(f"网页标题: {title}")

    # 提取所有段落文本
    paragraphs = soup.find_all('p')
    print("\n所有段落内容:")
    for p in paragraphs:
        print(p.get_text())

except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")
except Exception as e:
    print(f"解析或处理数据时发生错误: {e}")

time.sleep(1) # 简单延时,给服务器一点喘息时间

这段代码展示了最基础的抓取逻辑。requests.get()负责发出请求,拿到响应后,BeautifulSoup(response.text, 'html.parser')则将HTML文本转换为一个可供查询的对象。你可以用soup.find()soup.find_all()soup.select()等方法,通过标签名、CSS选择器等方式定位元素,再用.get_text()['attribute']来提取数据。

为什么选择requests和BeautifulSoup组合进行网页抓取?

我经常被问到,Python里有那么多爬虫库,为什么你偏爱requestsBeautifulSoup?其实原因很简单,这个组合提供了一个极佳的平衡点:学习曲线平缓、功能强大且灵活。

requests库,在我看来,是Python处理HTTP请求的最佳实践。它的API设计得极其人性化,发送GET、POST请求,处理Cookies、Session、自定义Headers,甚至文件上传,都变得异常简洁。你不需要关心底层的socket操作,它已经帮你封装得妥妥当当。比如,处理登录状态,requests.Session()就能让你轻松维护会话,避免了每次请求都重新登录的麻烦。对于大多数中小规模的爬取任务,requests的性能和易用性都绰绰有余。

BeautifulSoup,则像是一位精通HTML和XML语法的“翻译官”。它能把那些结构混乱、标签闭合不规范的网页内容,整理成一个易于遍历和查询的树形结构。这对于真实世界中那些“不太规矩”的网页来说,简直是救星。你可以用类似CSS选择器的方式(soup.select('div.content a'))来定位元素,也可以通过标签名、属性值来查找。它的容错性很好,即使遇到一些破损的HTML,也能尽力解析,这在实际工作中非常实用。

当然,如果你需要处理JavaScript动态加载的内容,或者进行大规模、高并发的爬取,可能就需要考虑SeleniumPlaywright这类无头浏览器,或者像Scrapy这样更专业的爬虫框架了。但对于大部分初学者和日常的数据抓取需求,requestsBeautifulSoup无疑是性价比最高的选择。它们能让你快速上手,并且足以应对绝大多数静态网页的抓取任务。

在实际爬取过程中,如何处理常见的反爬机制?

在实际操作中,网页并不是总那么“友好”,它们会设置一些障碍来阻止自动化程序抓取数据,也就是我们常说的“反爬机制”。这些机制形形色色,有些很简单,有些则相当复杂。

最常见的一个是User-Agent检测。很多网站会检查你的请求头,如果发现User-Agent是Python的默认值(比如python-requests/X.Y.Z),就会直接拒绝你的访问。所以,在发起请求时,模拟一个常见的浏览器User-Agent是基本操作,就像我前面代码里展示的那样。

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)

另一个常见的反爬是请求频率限制。如果你在短时间内发送了大量请求,服务器可能会认为你是恶意行为,从而暂时或永久地封禁你的IP。应对这种机制,最直接有效的方法就是设置请求间隔,也就是在每次请求之间加入time.sleep()。这虽然会降低爬取效率,但能大大提高爬虫的稳定性。至于间隔多久合适,这需要你根据目标网站的响应速度和反爬策略来摸索,没有一个固定答案。

import time
# ... (your scraping code) ...
time.sleep(random.uniform(1, 3)) # 每次请求后随机等待1到3秒,更自然

还有一些网站会通过Cookie和Session来管理用户状态,或者要求登录才能访问数据。requests库的Session对象能很好地处理这种情况。它会自动帮你管理和维护会话期间的Cookies,让你像一个真正的用户一样浏览网站。

session = requests.Session()
# 模拟登录,获取session
login_data = {'username': 'your_user', 'password': 'your_password'}
session.post('https://example.com/login', data=login_data)

# 登录后,使用session对象访问需要权限的页面
response = session.get('https://example.com/protected_page')

对于更复杂的反爬,比如JavaScript动态渲染内容、验证码、字体反爬、参数加密等,requestsBeautifulSoup的组合就显得力不从心了。这时你可能需要引入SeleniumPlaywright来模拟浏览器行为,或者进行逆向工程分析JS代码。但对于大多数入门级和中等难度的爬取任务,掌握好User-Agent、请求间隔和Session管理,就已经能解决大部分问题了。保持耐心,仔细观察目标网站的请求行为,往往能找到突破口。

爬取到的数据如何有效存储与管理?

辛辛苦苦爬取到的数据,如果不能妥善存储和管理,那之前的所有努力就白费了。选择合适的数据存储方式,取决于你数据的规模、结构以及后续的用途。

最简单也是最常用的方式,是将数据保存为CSV文件JSON文件

CSV (Comma Separated Values) 适用于结构化、表格型的数据。每一行代表一条记录,列之间用逗号分隔。它的优点是简单、通用,可以用Excel等工具直接打开查看。

import csv

# 假设你爬取到了这样的数据列表
data_to_save = [
    {'title': '文章A', 'author': '张三', 'date': '2023-01-01'},
    {'title': '文章B', 'author': '李四', 'date': '2023-01-02'}
]

# 写入CSV文件
csv_file = 'articles.csv'
fieldnames = ['title', 'author', 'date'] # 定义列名

with open(csv_file, 'w', newline='', encoding='utf-8') as f:
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader() # 写入表头
    writer.writerows(data_to_save) # 写入数据

print(f"数据已保存到 {csv_file}")

JSON (JavaScript Object Notation) 格式则更适合半结构化或嵌套结构的数据。它以键值对的形式存储,可读性好,并且与Python的字典和列表天然对应,非常方便数据交换。

import json

# 假设你爬取到了这样的数据
data_to_save = [
    {'id': 1, 'name': '产品A', 'details': {'price': 100, 'stock': 50}},
    {'id': 2, 'name': '产品B', 'details': {'price': 200, 'stock': 30}}
]

# 写入JSON文件
json_file = 'products.json'
with open(json_file, 'w', encoding='utf-8') as f:
    json.dump(data_to_save, f, ensure_ascii=False, indent=4) # indent参数让输出更美观

print(f"数据已保存到 {json_file}")

当数据量较大,或者你需要进行复杂的查询、更新、关联操作时,将数据存储到数据库会是更好的选择。Python有成熟的库来连接各种数据库,比如sqlite3(轻量级,无需安装服务器)、psycopg2(PostgreSQL)、PyMySQL(MySQL)或pymongo(MongoDB)。

以SQLite为例,它是一个文件型数据库,非常适合本地存储和测试:

import sqlite3

# 连接到SQLite数据库(如果文件不存在则创建)
conn = sqlite3.connect('my_scraped_data.db')
cursor = conn.cursor()

# 创建表
cursor.execute('''
    CREATE TABLE IF NOT EXISTS articles (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT NOT NULL,
        author TEXT,
        date TEXT
    )
''')
conn.commit()

# 插入数据
article_data = ('新文章标题', '作者甲', '2023-03-15')
cursor.execute("INSERT INTO articles (title, author, date) VALUES (?, ?, ?)", article_data)
conn.commit()

# 查询数据
cursor.execute("SELECT * FROM articles")
rows = cursor.fetchall()
for row in rows:
    print(row)

conn.close() # 关闭数据库连接
print("数据已存储并查询完毕。")

除了技术层面的存储,数据管理还涉及到一些伦理和法律问题。在爬取数据前,务必检查网站的robots.txt文件,它会告诉你哪些页面允许爬取,哪些不允许。尊重网站的意愿,不要给服务器造成过大负担,这不仅是道德要求,也能避免你的IP被封禁。同时,要了解你所在地区以及目标网站所在地的法律法规,特别是关于数据隐私和版权的规定。合法合规地进行数据抓取,才能让你的爬虫项目走得更远。

文中关于数据存储,Requests,beautifulsoup,Python爬虫,反爬机制的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Python爬虫实战:requests与BeautifulSoup教程》文章吧,也可关注golang学习网公众号了解相关技术文章。

Golang防DDoS:限流与连接池实战解析Golang防DDoS:限流与连接池实战解析
上一篇
Golang防DDoS:限流与连接池实战解析
JavaScript回调函数详解与使用技巧
下一篇
JavaScript回调函数详解与使用技巧
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 千音漫语:智能声音创作助手,AI配音、音视频翻译一站搞定!
    千音漫语
    千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
    117次使用
  • MiniWork:智能高效AI工具平台,一站式工作学习效率解决方案
    MiniWork
    MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
    113次使用
  • NoCode (nocode.cn):零代码构建应用、网站、管理系统,降低开发门槛
    NoCode
    NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
    129次使用
  • 达医智影:阿里巴巴达摩院医疗AI影像早筛平台,CT一扫多筛癌症急慢病
    达医智影
    达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
    121次使用
  • 智慧芽Eureka:更懂技术创新的AI Agent平台,助力研发效率飞跃
    智慧芽Eureka
    智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
    126次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码