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

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

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

赛博行者发布于 2025/2/6更新于 2026/10/2297 浏览
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. 总结与注意事项

更多推荐文章

查看全部
  • Java 分治算法实战:快速排序与归并排序
  • Python 实现微信公众号文章批量爬取与数据导出
  • 千笔 AI 学术写作工具核心功能解析
  • AI 大模型深度学习指南:从理论基础到应用实践
  • AIGC 已落地:2025 年六大发展趋势
  • 网络安全应急响应:常见系统敏感目录排查指南
  • Coze 打造励志图文智能体应用实战
  • GitHub 学生认证操作指南与注意事项
  • OpenClaw 实战:构建具备自主执行能力的 AI 数字替身
  • SparkAi 渐进式 AIGC 系统:多模型集成与私有化部署
  • 预训练语言模型核心原理与 BERT 实战
  • Docker 实战:修改 docker0 网桥默认 IP 地址
  • JavaScript 正则表达式详解
  • Python+ROS2 通用智能系统工业级通信框架
  • Python 泛型(Generics)详解
  • 元气 AI 与 OpenClaw 深度对比:功能、架构与选型指南
  • MySQL 基本查询与增删改查实战指南
  • Python 语言核心特性、应用场景及学习价值解析
  • 深入理解 HTML5 Web Workers:提升网页性能的关键技术
  • 深度确定性策略梯度算法 (DDPG) 详解与实现

相关免费在线工具

  • 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