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

Python 网络爬虫快速入门指南

Python 网络爬虫基础教程涵盖爬虫分类、请求模块 urllib 使用、URL 编码及静态页面抓取实战。内容详解如何构建请求对象、设置 User-Agent 避免封禁、处理中文参数编码,并通过百度贴吧案例演示完整的数据获取与保存流程。强调遵守 robots 协议及法律合规性,适合初学者掌握网页数据采集核心技能。

leon发布于 2025/2/7更新于 2026/7/2548 浏览
Python 网络爬虫快速入门指南

Python 网络爬虫基础教程

网络爬虫分类

  • 通用网络爬虫:搜索引擎使用,通常遵守 robots 协议。
    • robots 协议:网站通过 robots 协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。通用网络爬虫需要遵守 robots 协议(君子协议)。
    • 查看网站的 robots 协议示例:https://www.baidu.com/robots.txt
  • 聚焦网络爬虫:针对特定主题或站点编写的爬虫程序。

爬取数据步骤

  1. 确定需要爬取的 URL 地址。
  2. 由请求模块向 URL 地址发出请求,并得到网站的响应。
  3. 利用解析模块从响应内容中提取所需数据。
    • 保存所需数据。
    • 如果页面中有其他需要继续跟进的 URL 地址,则继续第 2 步去发请求,如此循环。

爬虫入门:urllib 请求模块

基本请求与响应

使用 urllib.request 模块发送 HTTP 请求。

from urllib import request

# 获得响应对象
res = request.urlopen(url='http://www.baidu.com/')

# 获取网页源代码(默认是字节串,需要转为字符串)
html = res.read().decode()

# 获取实际地址(有些网页可能会进行重定向,从而返回另一个地址)
url = res.geturl()

# 返回 http 响应码
code = res.getcode()

print(res)
print('=' * 30)
print(html[:500])  # 仅打印前 500 字符以便阅读
print('=' * 30)
print(url)
print('=' * 30)
print(code)

注意: res.geturl() 返回的是最终的实际地址,因为某些网页会进行重定向。

处理 User-Agent 与反爬

浏览器访问网站时会携带 User-Agent 信息,而 Python 默认的请求头可能包含 python-urllib 标识,容易被服务器识别并拒绝访问。

问题: 直接访问可能被拦截。

解决方案: 在请求头中伪装成浏览器。

from urllib import request

# 1. 定义常用变量
url = 'http://httpbin.org/get'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}

# 2. 包装请求
req = request.Request(url=url, headers=headers)

# 3. 发请求
res = request.urlopen(req)

# 4. 获取响应内容
html = res.read().decode()
print(html)

总结: 设置 User-Agent 可以有效模拟浏览器行为,降低被目标网站屏蔽的风险。

urllib.parse 编码

  • 作用:给 URL 地址中的查询参数进行编码(例如将中文转换为百分号编码)。
  • 导入方式:import urllib.parse 或 from urllib import parse
  • 示例:URL 不能直接识别中文,需要编码转换。
    • 编码前:https://www.baidu.com/s?wd=美女
    • 编码后:https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3

拼接 URL 的三种方式:

  1. 字符串格式化
  2. parse.urlencode
  3. parse.quote

小练习: 编写一个脚本,输入关键字,搜索百度并保存结果。

from urllib import request
from urllib import parse
import time
import random

# 1. 拼接 url 地址
word = input('请输入百度搜索关键字:')
params = parse.urlencode({'wd': word})
url = 'http://www.baidu.com/s?{}'.format(params)
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}

# 2. 发请求获取响应内容
req = request.Request(url=url, headers=headers)
res = request.urlopen(req)
html = res.read().decode()

# 3. 保存到本地文件
filename = word + '.html'
with open(filename, 'w', encoding='utf-8') as f:
    f.write(html)
print(f'搜索结果已保存至 {filename}')

入门实战案例:百度贴吧静态抓取

静态爬取一般步骤

  1. 构造 URL 模板。
  2. 循环生成不同页码的 URL。
  3. 发送请求获取 HTML。
  4. 解析 HTML 提取数据。
  5. 保存数据。

完整代码实现

import random
import time
import re
from urllib import request
from urllib import parse

class BaiduTiebaSpider:
    def __init__(self):
        self.url_template = 'http://tieba.baidu.com/f?kw={}&pn={}'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
        }

    def get_html(self, url):
        req = request.Request(url=url, headers=self.headers)
        try:
            res = request.urlopen(req, timeout=10)
            html = res.read().decode('utf-8')
            return html
        except Exception as e:
            print(f'请求失败:{e}')
            return None

    def parse_html(self, html):
        """解析提取数据的函数"""
        if not html:
            return []
        # 使用正则表达式匹配帖子标题和链接
        pattern = r'<a class="j_th_tit ".*?href="(.*?)".*?>(.*?)</a>'
        matches = re.findall(pattern, html)
        data_list = []
        for link, title in matches:
            data_list.append({'title': title.strip(), 'link': link})
        return data_list

    def save_html(self, filename, html):
        with open(filename, 'w', encoding='utf-8') as f:
            f.write(html)

    def run(self):
        name = input('请输入贴吧名:')
        start = int(input('请输入起始页:'))
        end = int(input('请输入终止页:'))
        params = parse.quote(name)

        for page in range(start, end + 1):
            pn = (page - 1) * 50  # 根据所选贴吧 url 规律计算得出
            url = self.url_template.format(params, pn)
            html = self.get_html(url)
            
            if html:
                filename = '{}_第{}页.html'.format(name, page)
                self.save_html(filename, html)
                
                # 解析并展示部分数据
                data = self.parse_html(html)
                print(f'第{page}页抓取成功,共发现 {len(data)} 个帖子')
                
                # 控制数据抓取的频率,避免被封禁
                time.sleep(random.randint(1, 3))

if __name__ == '__main__':
    test = BaiduTiebaSpider()
    test.run()

运行结果示例:

请输入贴吧名:赵丽颖
请输入起始页:1
请输入终止页:3
第 1 页抓取成功,共发现 30 个帖子
第 2 页抓取成功,共发现 30 个帖子
第 3 页抓取成功,共发现 30 个帖子

注意事项

  1. 法律合规:相关操作一定要在法律允许的范围内进行,尊重版权,不抓取敏感信息。
  2. Robots 协议:请遵守目标网站的 robots.txt 协议,不要恶意爬取。
  3. 频率控制:在代码中加入延时逻辑,避免对服务器造成过大压力。
  4. 异常处理:生产环境中应增加完善的异常捕获机制,确保程序稳定性。

目录

  1. Python 网络爬虫基础教程
  2. 网络爬虫分类
  3. 爬取数据步骤
  4. 爬虫入门:urllib 请求模块
  5. 基本请求与响应
  6. 获得响应对象
  7. 获取网页源代码(默认是字节串,需要转为字符串)
  8. 获取实际地址(有些网页可能会进行重定向,从而返回另一个地址)
  9. 返回 http 响应码
  10. 处理 User-Agent 与反爬
  11. 1. 定义常用变量
  12. 2. 包装请求
  13. 3. 发请求
  14. 4. 获取响应内容
  15. urllib.parse 编码
  16. 1. 拼接 url 地址
  17. 2. 发请求获取响应内容
  18. 3. 保存到本地文件
  19. 入门实战案例:百度贴吧静态抓取
  20. 静态爬取一般步骤
  21. 完整代码实现
  22. 注意事项
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • MySQL 表基础语法:增删查与核心技巧
  • PostgreSQL 安装教程及初始使用
  • LLM 微调实战:使用 Llama-Factory 进行 DPO 训练
  • Linux 线程互斥锁原理与实践封装
  • Telegram Bot 与 Mini-App 开发实践:简介及初始化 window.Telegram.WebApp 对象
  • 家庭药品管理系统:从药品收纳到健康守护的全链路解决方案
  • Python内存管理深潜:从引用计数到GC机制的全面优化实战
  • CCF-GESP 三级 C++ 真题解析:小杨的智慧购物
  • VR/AR/MR 技术解析:三种虚实交互技术的核心区别
  • Antigravity:一款支持多模型的免费 AI 编程工具
  • OpenClaw 安装部署全流程:搭建自托管 AI 助手网关
  • 前端后端与前台中台后台概念区别
  • Windows 10 系统安装 MySQL 9.4.0 教程
  • Java 基础:MapStruct 使用指南与原理剖析
  • AI 全自动科研系统与 AIGC 动画电影的技术突破与架构解析
  • 大模型入门:程序员为什么要学习大模型应用开发
  • Python 使用 MCP 客户端调用高德地图服务查询天气
  • Arduino BLDC 自主巡逻机器人:避障与路径规划实战
  • FastGPT 结合 MCP 协议实现工具增强型智能体构建
  • OpenClaw 技术解析:AI 智能体的能力、局限与安全隐忧

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • 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