跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Python 网络爬虫入门与实战指南

Python 网络爬虫主要包含数据抓取、分析与存储三个核心环节。介绍使用 requests 库进行 HTTP 请求,处理 GET/POST 参数及登录验证。涵盖反爬虫应对策略,如代理 IP、请求头伪装及频率控制。讲解使用 BeautifulSoup 解析 HTML 和 JSON 数据,以及通过数据库或文件持久化存储结果。最后简述并发处理机制及爬虫开发的法律伦理规范。

赛博行者发布于 2025/2/6更新于 2026/9/1169 浏览
Python 网络爬虫入门与实战指南

Python 网络爬虫入门与实战指南

Python 爬虫主要分为三大板块:抓取数据、分析数据、存储数据。简单来说,爬虫的目标是通过指定的 URL,直接返回用户所需数据,无需人工一步步操作浏览器获取。

1. 环境准备

在开始之前,请确保已安装 Python 3.x 环境。常用的第三方库可以通过 pip 安装:

pip install requests beautifulsoup4 lxml pandas

2. 抓取数据

一般来说,访问网站 URL 给我们返回两种格式数据:HTML 和 JSON。

2.1 无参请求 (GET)

抓取数据的大多数属于 GET 请求,我们可以直接从网站所在服务器获取数据。在 Python 自带模块中,主要有 urllib 及 urllib.request,推荐使用功能更强大的 requests 库。

import requests

url = 'https://example.com/api/data'
response = requests.get(url)

# 检查状态码
if response.status_code == 200:
    # 获取二进制内容
    content_bytes = response.content
    # 获取文本内容
    content_text = response.text
    # 尝试解析为 JSON
    try:
        data_json = response.json()
        print("JSON Data:", data_json)
    except ValueError:
        print("Response is not JSON")
else:
    print(f"Request failed with status code: {response.status_code}")

2.2 带参请求

此外,还有一种是以带参的形式抓取数据,参数一般附在 URL 结尾,首个参数以 ? 连接,后续参数以 & 连接。使用 params 参数可以让 requests 自动处理编码。

import requests

data = {'data1': 'XXXXX', 'data2': 'XXXXX'}
url = 'https://example.com/search'

# requests 会自动将 dict 转换为 URL 查询字符串
response = requests.get(url=url, params=data)
(response.url)  
print
# 查看最终生成的完整 URL

3. 登录情况处理

许多网站需要登录后才能访问特定资源。

3.1 POST 表单登录

先向服务器发送表单数据,服务器验证后将 cookie 存入响应头,后续请求需携带该 cookie。

import requests

data = {'username': 'user', 'password': 'pass'}
login_url = 'https://example.com/login'

response = requests.post(url=login_url, data=data)

# 保存会话,以便后续请求自动携带 Cookie
session = requests.Session()
session.post(login_url, data=data)

# 后续请求使用 session
profile_url = 'https://example.com/profile'
profile_response = session.get(profile_url)

3.2 使用 Cookie 登录

如果已知有效的 Cookie,可以直接设置到请求头或 Session 中,服务器会认为你是一个已登录用户。

import requests

cookies = {'session_id': 'abc123xyz'}
headers = {'Cookie': 'session_id=abc123xyz'}

response = requests.get('https://example.com/protected', cookies=cookies)

4. 反爬虫机制处理

很多网站实施了反爬虫策略,如 IP 限制、验证码、User-Agent 检测等。

4.1 使用代理 IP

主要用于解决'限制 IP'地址情况。维护一个代理 IP 池,随机选择使用。

proxies = {
    'http': 'http://XX.XX.XX.XX:XXXX',
    'https': 'http://XX.XX.XX.XX:XXXX'
}

try:
    response = requests.get(url='https://example.com', proxies=proxies, timeout=5)
except Exception as e:
    print(f"Proxy error: {e}")

4.2 时间限制

解决频繁访问导致受限问题。加入 sleep 函数放缓频率。

import time
import random

time.sleep(random.uniform(1, 3))  # 随机休眠 1-3 秒

4.3 伪装成浏览器访问

一些网站会检查 User-Agent 和 Referer。加上这些头部信息可模拟真实浏览器。

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',
    'Referer': 'https://www.google.com/'
}

response = requests.get(url=url, headers=headers)

4.4 断线重连

网络波动可能导致请求失败,实现重试机制可提高稳定性。

def fetch_with_retry(session, url, max_retries=3):
    for attempt in range(max_retries):
        try:
            return session.get(url, timeout=10)
        except requests.exceptions.RequestException as e:
            print(f"Attempt {attempt + 1} failed: {e}")
            if attempt == max_retries - 1:
                raise
            time.sleep(2 ** attempt)  # 指数退避
    return None

5. 数据分析

获取的数据通常需要进行清洗和分析。

5.1 HTML 解析

对于 HTML 格式数据,推荐采用 BeautifulSoup 或 lxml。

from bs4 import BeautifulSoup

html_doc = """
<html><head><title>Sample</title></head>
<body><p id="notice">Notice!</p></body></html>
"""

soup = BeautifulSoup(html_doc, 'lxml')
print(soup.title.string)
print(soup.find('p', id='notice').text)

5.2 JSON 处理

JSON 格式数据可直接使用 Python 的 json 模块或 Pandas 处理。

import json
import pandas as pd

data_str = '{"name": "Alice", "age": 25}'
data_dict = json.loads(data_str)

# 转为 DataFrame 方便分析
df = pd.DataFrame([data_dict])
print(df.head())

此外,可以使用 numpy, matplotlib, pyecharts 等模块包做相应的数据分析与可视化展示。

6. 数据存储

数据抓取、分析处理完后,需要持久化存储。常见方式有存入数据库或 Excel 表格。

6.1 SQLite 存储

SQLite 轻量级,适合本地开发。

import sqlite3

conn = sqlite3.connect('crawler_data.db')
cursor = conn.cursor()

cursor.execute('''CREATE TABLE IF NOT EXISTS items
                  (id INTEGER PRIMARY KEY, name TEXT, price REAL)''')

cursor.execute("INSERT INTO items (name, price) VALUES (?, ?)", ('Item A', 10.5))
conn.commit()
conn.close()

6.2 CSV 存储

适合快速导出。

import csv

data = [['Name', 'Price'], ['Item A', 10.5]]
with open('output.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerows(data)

7. 并发处理

当爬取数据量过大时,单线程效率较低。Python 中可使用多线程 (threading) 或多进程 (multiprocessing)。

注意:由于 GIL (全局解释器锁) 的存在,CPU 密集型任务建议使用多进程,IO 密集型任务(如网络请求)多线程即可。

import multiprocessing as mp

def worker_task(item):
    # 模拟耗时任务
    return item * 2

if __name__ == '__main__':
    pool = mp.Pool(processes=4)
    results = pool.map(worker_task, range(10))
    pool.close()
    pool.join()
    print(results)

8. 总结与注意事项

本文介绍了 Python 爬虫的基础流程,包括请求发送、反爬应对、数据解析与存储。在实际开发中,请务必遵守目标网站的 robots.txt 协议,尊重版权与隐私,避免对服务器造成过大压力。合法合规地进行数据采集是爬虫开发的前提。

目录

  1. Python 网络爬虫入门与实战指南
  2. 1. 环境准备
  3. 2. 抓取数据
  4. 2.1 无参请求 (GET)
  5. 检查状态码
  6. 2.2 带参请求
  7. requests 会自动将 dict 转换为 URL 查询字符串
  8. 3. 登录情况处理
  9. 3.1 POST 表单登录
  10. 保存会话,以便后续请求自动携带 Cookie
  11. 后续请求使用 session
  12. 3.2 使用 Cookie 登录
  13. 4. 反爬虫机制处理
  14. 4.1 使用代理 IP
  15. 4.2 时间限制
  16. 4.3 伪装成浏览器访问
  17. 4.4 断线重连
  18. 5. 数据分析
  19. 5.1 HTML 解析
  20. 5.2 JSON 处理
  21. 转为 DataFrame 方便分析
  22. 6. 数据存储
  23. 6.1 SQLite 存储
  24. 6.2 CSV 存储
  25. 7. 并发处理
  26. 8. 总结与注意事项

更多推荐文章

查看全部
  • 本地私有化 AI 知识库搭建指南:Obsidian + OpenCode + MCP Server
  • 硕士论文盲审前降低AI检测率的策略与评审机制分析
  • VR 多相电源架构、选型与设计要点详解
  • OpenClaw 开源 AI 助手安装与配置指南
  • C++ 11/14/17/20/23/26 核心特性学习路线
  • 2026 主流 AI 智能体平台 OpenClaw 厂商产品深度横评
  • MCP 协议详解:与 Function Call 的区别及实战
  • Face Analysis WebUI 效果展示:精准识别年龄性别与关键点
  • 10 款辅助学术写作与降低 AIGC 检测率的工具推荐
  • 使用 TRAE CN 配合 MCP 协议将 MasterGo 设计稿转为前端代码
  • 腾讯云服务器部署 OpenClaw 对接飞书实战
  • MATLAB 实现基于强制导向函数法(PFA)的无人机三维路径规划项目实例
  • HAProxy 负载均衡基础与配置示例
  • 文心大模型 4.5 开源版部署实战与性能优化
  • 基于 vLLM+Open-WebUI 部署 Qwen3-Embedding-4B 实践
  • OpenClaw 架构解析:从 Skills、MCP、RAG、Memory 到 AI Agent
  • 无人机 Remote ID Beacon 帧字段详解
  • GraphHopper 实战:利用开源引擎优化城市物流配送
  • Java 微信机器人框架 WechatRobot 技术解析与实战
  • 无需扩展插件即可在 Copilot 接入第三方 OpenAI 接口

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online