当前位置: 首页 > article >正文

从零开始学Python爬虫:(二)使用基本库urllib(下)

一、异常处理

关于某些情况下,可能会出现异常,如果不处理它们,会发生很多错误。

而urllib库提供了error模块来处理这些异常,该模块包括以下功能:

(1)URLError

该类含有一个属性reason,可以返回错误原因

示例:

from urllib import error,request
try:a=request.urlopen("某个不存在的页面")
except error.URLError as b:print(b.reason)

系统输出:

Not Found

程序未报错,而是直接输出了错误的原因

(2)HTTPError

该类含有三个属性:code(状态码)、reason(错误原因)、headers(请求头)

示例:

from urllib import error,request
try:a=request.urlopen("某个不存在的页面")
except error.HTTPError as b:print(b.code,b.reason,b.headers)

如此,会输出响应的状态码、错误原因、请求头

(注:如果以上两个的网址要找某个存在网址的不存在页面才能输出)

二、网址处理

这里采用urllib库中的parse模块,

包括功能:

(1)urlparse

用于识别和分段url

来看一个例子:

它将一个网址分为了若干部分(注:空为没有)

netloc表示域名、path是访问路径、params是参数、query是查询条件、fragment是锚点(定位页面下拉位置)

当然,以上只是urlparse的一个参数

它的完整形态是:

urlparse(网址,scheme,allow_fragments)

网址就是上面所说的一堆,

scheme则是协议,http还是https

allow_fragments是是否忽略锚点

(2)urlunparse

用于构造url

(注:参数必须包含网址、netloc域名、path访问路径、params参数、query查询条件、fragment锚点这六部分)

示例:


与这两个类似的还有urlsplit、urlunsplit和urljoin,大家可以自行了解。


(3)urlencode

用于构造GET请求参数

举个例子:

首先构建一个字典,存储参数。

然后使用urlencode方法将其转化为真正的参数

就可以看到该参数成功进入了网址中

当然,有字典转化为参数,就有参数转化为字典,这里就可以用parse_qs

(4)quote

将内容转化为URL编码格式

有编码就有解码,解码可以采用unquote方法

三、Robots协议

这个协议通常用来区分,哪些网站可以爬,哪些网站不可以爬。

它通常是一个名为robots.txt的文本文件

在爬虫时,如果访问到存在该文件,就会根据其中规定的范围内爬取

如果没有,则全页面可爬。

(1)样例

User-agent: *

Disallow: /

Allow: /public/

如上便是一个简单样例,

  • public一行表示限定了搜索爬虫只能爬取public目录
  • 其中的 * 一行表示对所有爬虫都有效(如果将 * 改为Baiduspider 则表示只对百度爬虫有效)
  • Disallow则指明了不允许爬取的目录

附:常见爬虫名称及对应网站

  1. Baiduspider
    对应网站:百度(baidu.com)
    说明:Baiduspider 是百度搜索引擎使用的爬虫,用于抓取网站内容并将其索引。

  2. Googlebot
    对应网站:谷歌(google.com)
    说明:Googlebot 是 Google 搜索引擎的爬虫,负责抓取和索引全球范围内的网页内容。

  3. Bingbot
    对应网站:必应(bing.com)
    说明:Bingbot 是微软必应搜索引擎的爬虫,用于抓取和索引互联网上的网页。

  4. Yandexbot
    对应网站:Yandex(yandex.com)
    说明:Yandexbot 是俄罗斯搜索引擎 Yandex 使用的爬虫。

  5. Sogou Spider
    对应网站:搜狗(sogou.com)
    说明:搜狗爬虫用于抓取互联网上的信息,用于搜狗搜索引擎。

  6. 360Spider
    对应网站:360搜索(so.com)
    说明:360Spider 是360搜索引擎的爬虫,负责抓取网站数据。

  7. Yahoo! Slurp
    对应网站:Yahoo(yahoo.com)
    说明:Yahoo! Slurp 是 Yahoo 搜索引擎的爬虫,用于抓取和索引网页。

  8. DuckDuckBot
    对应网站:DuckDuckGo(duckduckgo.com)
    说明:DuckDuckBot 是 DuckDuckGo 搜索引擎使用的爬虫,旨在获取网页内容进行索引。

  9. SeznamBot
    对应网站:Seznam(seznam.cz)
    说明:SeznamBot 是捷克搜索引擎 Seznam 的爬虫,负责抓取网页内容。


(2)使用robotparser

依旧是urllib库里的模块。

常用方法有:

  1. RobotFileParser()

    • 功能:创建一个 RobotFileParser 对象。
  2. set_url(url)

    • 功能:设置 robots.txt 文件的 URL 地址,通常是网站根目录下的 robots.txt
  3. read()

    • 功能:读取并解析指定 URL 的 robots.txt 文件内容。
  4. can_fetch(useragent, url)

    • 功能:判断给定的爬虫用户代理(user-agent)是否可以抓取指定 URL。如果 robots.txt 文件允许抓取该页面,则返回 True,否则返回 False
  5. mtime()

    • 功能:获取 robots.txt 文件的修改时间(如果存在的话)。返回值为时间戳。
  6. modified()

    • 功能:检查 robots.txt 文件是否已被修改。如果文件已经被修改,则返回 True,否则返回 False
  7. default_entry

    • 功能:设置默认条目。如果没有明确的规则匹配某个 user-agent,使用此默认条目进行判断。

举个代码示例来看一下:

from urllib import robotparser
#创建一个对象
a=robotparser.RobotFileParser()#设置网址地址
a.set_url(robots.txt文件的链接)#读取
a.read()#判断
print(a.can_fetch('爬虫名称(如Baiduspider)' ,'要爬取的url'))

然后运行,返回看返回的是True还是False即可判断是否限制爬取。

相关文章:

从零开始学Python爬虫:(二)使用基本库urllib(下)

一、异常处理 关于某些情况下,可能会出现异常,如果不处理它们,会发生很多错误。 而urllib库提供了error模块来处理这些异常,该模块包括以下功能: (1)URLError 该类含有一个属性reason&#x…...

电商分布式场景中如何保证数据库与缓存的一致性?实战方案与Java代码详解

文章目录 一、缓存一致性问题的本质写后读不一致:更新数据库后,缓存未及时失效并发读写竞争:多个线程同时修改同一数据缓存与数据库事务不同步:部分成功导致数据错乱 二、5大核心解决方案与代码实现方案1:延迟双删策略…...

kamailio中Core Cookbook 核心配置手册

Core Cookbook 核心配置手册 版本: Kamailio SIP 服务器 v6.0.x (稳定版) 概述 本教程收集了 Kamailio 核心导出到配置文件的功能和参数。 注意: 本页参数未按字母顺序排列。 结构 kamailio.cfg 的结构可分为三部分: 全局参数模块设置路由块 建议按此顺序排列以保持清晰…...

【嵌入式Linux应用开发基础】read函数与write函数

目录 一、read 函数 1.1. 函数原型 1.2. 参数说明 1.3. 返回值 1.4. 示例代码 二、write 函数 2.1. 函数原型 2.2. 参数说明 2.3. 返回值 2.4. 示例代码 三、关键注意事项 3.1 部分读写 3.2 错误处理 3.3 阻塞与非阻塞模式 3.4 数据持久化 3.5 线程安全 四、嵌…...

一、OpenSM 架构部署及原理详解

目录 一、OpenSM 架构与核心功能 1. InfiniBand 子网管理器(SM)的作用 2. OpenSM 的架构 二、OpenSM 部署步骤(以 Linux 为例) 1. 安装依赖与软件包 2. 配置文件 3. 启动 OpenSM 服务 4. 验证部署 5. 高可用性配置(可选) 三、OpenSM 工作原理详解 1. 拓扑发现(…...

2526考研资料分享 百度网盘

通过网盘分享的文件:01、2026【考研数学】 链接:https://pan.baidu.com/s/1PwMzp_yCYqjBqa7492mP3w?pwd98wg 提取码:98wg--来自百度网盘超级会员v3的分享 通过网盘分享的文件:01、2026【考研政治】 链接:https://pan.baidu.com/s/1PwMzp_yCYqjBqa7492…...

15.1 Process(进程)类

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 通常开发时想要获得进程是比较困难的事,必须要调用CreateToolhelpSnapshot、ProcessFirst、ProcessNext等API或者诸如 Zw…...

事件传递和监控

今天介绍一下UIApplication的函数 - (BOOL)sendAction:to:from:forEvent: - (BOOL)sendAction:to:from:forEvent: 是 UIApplication 类中的一个方法,主要用于发送事件响应链中的动作(action)。它允许应用程序从一个特定的发送者(…...

CentOS 7 企业级Redis 7部署指南

CentOS 7 企业级Redis 7部署指南 目录导航 一、环境准备 1.1 依赖管理 二、离线安装 2.1 源码编译安装2.2 目录结构规范 三、生产配置 3.1 主配置文件3.2 配置生成脚本 四、系统集成 4.1 Systemd服务文件4.2 服务管理命令 五、安全加固 5.1 网络安全配置5.2 审计配置 六、性能…...

Python创建Excel的方式——提供4中方式可供参考

目录 专栏导读库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriter代码4——xlwings总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——>…...

消息中间件深度剖析:以 RabbitMQ 和 Kafka 为核心

在现代分布式系统和微服务架构的构建中,消息中间件作为一个不可或缺的组件,承担着系统间解耦、异步处理、流量削峰、数据传输等重要职能。尤其是在面临大规模并发、高可用性和可扩展性需求时,如何选择合适的消息中间件成为了开发者和架构师们…...

回文数:简单问题中的多种优化思路

回文数:简单问题中的多种优化思路 引言 回文数(Palindrome Number)是一个有趣的问题,在算法竞赛、面试、甚至一些实际应用场景中都会遇到。最直观的方式是将数字转换成字符串,然后反转比较。但仅仅满足“能解”是不够…...

大语言模型简史:从Transformer(2017)到DeepSeek-R1(2025)的进化之路

2025年初,中国推出了具有开创性且高性价比的「大型语言模型」(Large Language Model — LLM)DeepSeek-R1,引发了AI的巨大变革。本文回顾了LLM的发展历程,起点是2017年革命性的Transformer架构,该架构通过「…...

java八股文-spring

目录 1. spring基础 1.1 什么是Spring? 1.2 Spring有哪些优点? 1.3 Spring主要模块 1.4 Spring常用注解 1.5 Spring中Bean的作用域 1.6 Spring自动装配的方式 1.7 SpringBean的生命周期 1.8 多级缓存 1.9 循环依赖? 1 .8.1 原因 1.8…...

机器学习--实现多元线性回归

机器学习—实现多元线性回归 本节顺延机器学习--线性回归中的内容,进一步讨论多元函数的回归问题 y ′ h ( x ) w ⊤ ∙ x b y^{\prime}h(x)w^\top\bullet xb y′h(x)w⊤∙xb 其中, w T ⋅ x 就是 W 1 X 1 w 2 X 2 w 3 X 3 ⋯ w N X N \text{其中,}w^\math…...

vue3响应式丢失解决办法(三)

vue3的响应式的理解,与普通对象的区别(一) vue3 分析总结响应式丢失问题原因(二) 经过前面2篇文章,知道了响应式为什么丢失了,但是还是碰到了丢失情况,并且通过之前的内容还不能解…...

NLP 八股 DAY1:BERT

BERT全称:Pre-training of deep bidirectional transformers for language understanding,即深度双向Transformer。 模型训练时的两个任务是预测句⼦中被掩盖的词以及判断输⼊的两个句⼦是不是上下句。在预训练 好的BERT模型后⾯根据特定任务加上相应的⽹…...

蓝桥与力扣刷题(230 二叉搜索树中第k小的元素)

题目:给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。 示例 1: 输入:root [3,1,4,null,2], k 1 输出:1示例 2&#xff…...

半遮挡检测算法 Detecting Binocular Half-Occlusions

【1. 背景】: 本文分析【Detecting Binocular Half-Occlusions:Empirical Comparisons of Five Approaches】Geoffrey Egnal和Richard P. Wildes于2002年发表在IEEE Transactions on Pattern Analysis and Machine Intelligence上,这是1篇中…...

PHP培训机构教务管理系统小程序

🔑 培训机构教务管理系统——智慧教育,高效管理新典范 🚀 这款教务管理系统,是基于前沿的ThinkPHP框架与Uniapp技术深度融合,匠心打造的培训机构管理神器。它犹如一把开启高效运营与精细管理的金钥匙,专为…...

《LeetCode 763. 划分字母区间 | 高效分割字符串》

内容: 问题描述: 给定一个字符串 S,将字符串分割成若干个子串,使得每个子串中的字符都不重复,并且返回每个子串的长度。 解题思路: 找到每个字符最后一次出现的位置:我们首先遍历一遍字符串&a…...

无人机不等同轴旋翼架构设计应用探究

“结果显示,对于不等组合,用户应将较小的螺旋桨置于上游以提高能效,但若追求最大推力,则两个相等的螺旋桨更为理想。” 在近期的研究《不等同轴旋翼性能特性探究》中,Max Miles和Stephen D. Prior博士深入探讨了不同螺…...

什么是 大语言模型中Kernel优化

什么是 大语言模型中Kernel优化 目录 什么是 大语言模型中Kernel优化Kernel优化操作系统内核优化深度学习计算内核优化手工优化原理举例Flash Attention,Faster TransformerKernel优化 大语言模型存在访存密集操作(如注意力机制、LayerNorm等),这些操作使得GPU计算性能无法…...

DeepSeek与ChatGPT:AI语言模型的全面对决

DeepSeek与ChatGPT:AI语言模型的全面对决 引言:AI 语言模型的时代浪潮一、认识 DeepSeek 与 ChatGPT(一)DeepSeek:国产新星的崛起(二)ChatGPT:AI 界的开拓者 二、DeepSeek 与 ChatGP…...

CTFHub技能树-密码口令wp

目录 引言弱口令默认口令 引言 仅开放如下关卡 弱口令 通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令。 打开环境,是如下界面,尝试一些弱口令密码无果 利用burpsuite抓包,然后爆…...

Deepseek R1模型本地化部署与API实战指南:释放企业级AI生产力

摘要 本文深入解析Deepseek R1开源大模型的本地化部署流程与API集成方案,涵盖从硬件选型、Docker环境搭建到模型微调及RESTful接口封装的完整企业级解决方案。通过电商评论分析和智能客服搭建等案例,展示如何将前沿AI技术转化为实际生产力。教程支持Lin…...

MISP从入门到实战:威胁情报共享平台搭建与使用详解

MISP从入门到实战:威胁情报共享平台搭建与使用详解 目录 MISP核心作用与价值MISP安装与部署 2.1 Docker快速部署2.2 手动安装(Ubuntu) MISP基础使用教程 3.1 创建事件与属性3.2 数据共享与同步3.3 威胁情报分析实战 MISP高级功能 4.1 Galaxy…...

【NLP251】BertTokenizer 的全部 API 及 使用案例

BertTokenizer 是 Hugging Face 的 transformers 库中用于处理 BERT 模型输入的分词器类。它基于 WordPiece 分词算法,能够将文本分割成词汇单元(tokens),并将其转换为 BERT 模型可以理解的格式。BertTokenizer 是 BERT 模型的核心…...

【MySQL常见疑难杂症】常见文件及其所存储的信息

1、MySQL配置文件的读取顺序 (非Win)/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/mysql/etc/my.cnf、~/.my.cnf 可以通过命令查看MySQL读取配置文件的顺序 [roothadoop01 ~]# mysql --help |grep /etc/my.cnf /etc/my.cnf /etc/mysql/my.c…...

InnoDB如何解决幻读?深入解析MySQL的并发控制机制

--- ## 一、什么是幻读(Phantom Read)? **幻读**是数据库事务隔离性中的一个典型问题,具体表现为: 在同一个事务中,多次执行相同的范围查询(Range Query)时,**后一次…...