当前位置: 首页
AI教程
Python爬虫urllib库状态码异常处理与浏览器伪装设置教程

Python爬虫urllib库状态码异常处理与浏览器伪装设置教程

时间:2026-08-17
转载

基于urllib库构建爬虫,通过try except捕获URLError异常并输出错误代码或原因,识别常见HTTP状态码。利用build_opener添加User-Agent伪装浏览器,通过install_opener全局生效。创建用户袋里池随机选择User-Agent,降低反爬风险,确保程序稳定运行不崩溃。

构建一个具备异常处理和浏览器伪装的 Python 爬虫

本教程将引导你完成一个稳定、抗封的 Python 爬虫。它能够捕获网络请求中的常见错误,并通过伪装浏览器请求头(User-Agent)绕过反爬机制,最终实现自动抓取目标页面内容。

项目目标

编写一个基于 urllib 库的爬虫,具备以下能力:

  • 捕获 URLError 异常,打印错误代码或错误原因,程序不崩溃。
  • 识别常见 HTTP 状态码(301、302、304、400、401、403、404、500、501)。
  • 设置模拟浏览器 User-Agent,避免被服务器拒绝。
  • 通过 install_opener 将伪装设置为全局,使 urlopen() 自动携带伪装头。
  • 实现一个用户袋里池,每次请求随机选择一个 User-Agent,进一步降低被封概率。

最终效果

运行爬虫后,能够正常获取 https://www.qiushibaike.com/ 的首页 HTML(或类似反爬网站),而不会遇到 403 禁止访问错误。如果遇到网络问题或服务器拒绝,程序会输出错误代码或原因,不会崩溃。

技术方案

使用 Python 标准库 urllib.request 和 urllib.error。通过 try/except 捕获 URLError,利用 build_opener 和 addheaders 添加 User-Agent,最后使用 install_opener 全局生效。用户袋里池通过 random.choice 随机选取。

环境与依赖

  • Python 3.x(推荐 3.6+)
  • 不需要安装第三方库,urllib 是标准库。

项目结构

本教程所有代码均保存在一个 Python 文件中,例如 spider.py。你可以按顺序复制各段代码,分别测试效果。

核心实现

1. 了解常见 HTTP 状态码

爬虫运行时遇到不同状态码,有助于快速定位问题:

  • 301:永久重定向
  • 302:临时重定向
  • 304:资源未修改(可使用缓存)
  • 400:非法请求
  • 401:请求未经授权
  • 403:禁止访问(常见反爬)
  • 404:页面不存在
  • 500:服务器内部错误
  • 501:服务器不支持请求功能

2. 异常处理:捕获 URLError

使用 try/except 包裹 urlopen(),当出现异常时,通过 hasattr 检查是否存在 code 或 reason 属性并打印。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib.request
import urllib.error

try:
    # 尝试执行里面的内容
    html = urllib.request.urlopen('http://www.xiaohuar.com/').read().decode("utf-8")
    print(html)
except urllib.error.URLError as e:
    # 如果出现错误
    if hasattr(e,"code"):  # 如果有错误代码
        print(e.code)      # 打印错误代码
    if hasattr(e,"reason"): # 如果有错误信息
        print(e.reason)    # 打印错误信息

运行后,通常返回 403 Forbidden,因为该网站屏蔽了非浏览器请求。

3. 浏览器伪装:设置单个 User-Agent

通过 build_opener 创建请求对象,然后添加 User-Agent 报头。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib.request

url = 'https://www.qiushibaike.com/'
# 抓取页面URL
tou = ('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0')
# 设置模拟浏览器报头
b_tou = urllib.request.build_opener()  # 创建请求对象
b_tou.addheaders=[tou]                 # 添加报头
html = b_tou.open(url).read().decode("utf-8")  # 开始抓取页面
print(html)

注意:这里使用的是 build_opener().open(),而不是 urlopen()。

4. 全局设置:使用 install_opener 让 urlopen 自动携带伪装

通过 install_opener 将报头信息设置为全局,之后调用 urlopen() 也会自动添加报头。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib.request

# 设置报头信息
tou = ('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0')
# 设置模拟浏览器报头
b_tou = urllib.request.build_opener()  # 创建请求对象
b_tou.addheaders=[tou]                 # 添加报头到请求对象

# 将报头信息设置为全局,urlopen()方法请求时也会自动添加报头
urllib.request.install_opener(b_tou)

# 请求
url = 'https://www.qiushibaike.com/'
html = urllib.request.urlopen(url).read().decode("utf-8")
print(html)

此后,所有 urlopen() 调用都会自动携带该 User-Agent。

5. 创建用户袋里池,随机选择 User-Agent

定义一个函数 yh_dl(),内置多个 User-Agent 字符串,使用 random.choice 随机选取一个,然后拼接成报头并全局安装。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib.request
import random  # 引入随机模块文件

def yh_dl():
    # 创建用户袋里池
    yhdl = [
        'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
        'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0',
        'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
        'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
        'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11',
        'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)',
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTra veler 4.0)',
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)',
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)',
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; A vant Browser)',
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
        'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5',
        'User-Agent:Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5',
        'Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5',
        'Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',
        'Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10',
        'Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13',
        'Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1  (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1 ',
        'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)',
        'UCWEB7.0.2.37/28/999',
        'NOKIA5700/ UCWEB7.0.2.37/28/999',
        'Openwa ve/ UCWEB7.0.2.37/28/999',
        'Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999'
    ]
    thisua = random.choice(yhdl)  # 随机获取袋里信息
    headers = ("User-Agent",thisua)  # 拼接报头信息
    opener = urllib.request.build_opener()  # 创建请求对象
    opener.addheaders=[headers]  # 添加报头到请求对象
    urllib.request.install_opener(opener)  # 将报头信息设置为全局

# 请求
yh_dl()  # 执行用户袋里池函数
url = 'https://www.qiushibaike.com/'
html = urllib.request.urlopen(url).read().decode("utf-8")
print(html)

每次运行都会随机选择一个 User-Agent,保证报头信息不一样。

配置说明

本教程无需额外配置文件。所有配置(User-Agent 列表、目标 URL)均写在代码中。你可以根据需要修改或扩展用户袋里池中的字符串,或者替换目标 URL。

运行方法

  1. 将上述代码(例如第5步的完整代码)保存为 spider.py。
  2. 在终端中执行:python spider.py。
  3. 观察输出。如果成功,会打印出目标页面的 HTML 源码。

结果验证

  • 如果输出正常 HTML 且没有报错,说明爬虫已成功伪装并通过反爬检测。
  • 如果出现 HTTP Error 403: Forbidden,说明 User-Agent 仍被识别或目标网站有更严格的反爬策略,可以尝试更换 User-Agent 或增加延迟。
  • 如果出现网络连接错误,会打印 reason 信息,程序不会崩溃。

常见问题

Q:运行第2步代码时返回 403,怎么办?
A:这是正常现象,因为服务器检测到请求没有 User-Agent。继续执行后续步骤即可。

Q:使用 install_opener 后,是否所有 urlopen 都受影响?
A:是的,直到程序退出前,所有 urlopen() 调用都会使用该 opener 的报头。如果需要在同一个程序中切换不同报头,可以重新调用 install_opener。

Q:用户袋里池中的 User-Agent 是否需要定期更新?
A:建议定期检查并更新,因为部分旧版 User-Agent 可能被识别为异常。你可以从最新浏览器中提取 User-Agent 字符串。

后续优化方向

  • 增加请求延迟(如 time.sleep(random.uniform(1,3)))避免访问频率过高。
  • 支持 Cookie 处理,应对需要登录的网站。
  • 使用第三方库(如 requests)简化代码,requests 自带 Session 和更完善的异常处理。
  • 将用户袋里池保存到外部文件,方便维护。

本文转载自:http://www.lqkweb.com

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
CAD零基础入门教程:坐标输入、图层管理与基础绘图命令

CAD零基础入门教程:坐标输入、图层管理与基础绘图命令

本文面向CAD零基础学习者,系统讲解坐标输入、图层管理与基础绘图命令的核心用法。通过分步实操与常见问题排查,帮助新手建立精确绘图习惯,掌握规范出图的基础能力。

时间:2026-09-01 16:53
CAD从入门到项目交付:绘图、标注、图块与实战工作流

CAD从入门到项目交付:绘图、标注、图块与实战工作流

掌握CAD的核心在于建立“画得准、标得清、复用快、交付稳”的工作流。本文提供从环境设置、高频命令组合、标注规范、图块标准化到项目分阶段交付的完整路径,帮助初学者避免常见返工陷阱,独立完成可检查、可复用、可打印的工程图纸。

时间:2026-09-01 16:52
Claude Code 登录指南:个人、Teams 与企业账号区分与授权步骤

Claude Code 登录指南:个人、Teams 与企业账号区分与授权步骤

本文详细解析 Claude Code 登录前的账号类型区分方法,涵盖个人订阅、Teams 席位与企业 Enterprise 席位的授权路径差异。提供终端登录命令、环境变量排查及常见异常处理步骤,帮助用户快速完成正确授权并避免登录路径混淆。

时间:2026-09-01 14:27
Claude Code 文件修改前的权限模式配置与命令审批指南

Claude Code 文件修改前的权限模式配置与命令审批指南

本文详细介绍Claude Code在修改文件前的权限模式配置方法,包括defaultMode可选值、permissions allow与deny规则设置、多层级配置文件管理以及 status验证技巧,帮助开发者安全高效地使用AI编程助手。

时间:2026-09-01 14:12
Claude Code接入VS Code后先测扩展和终端命令

Claude Code接入VS Code后先测扩展和终端命令

在VS Code中接入Claude Code后,建议优先验证扩展面板与集成终端两条入口。本文提供标准检查顺序、关键命令与常见故障排查路径,帮助你快速确认环境就绪,避免后续开发受阻。

时间:2026-09-01 14:10
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜