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

从零开始学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即可判断是否限制爬取。

相关文章:

  • C语言中printf()函数,格式输出符
  • 【vue3】响应式的几个重要API
  • 一学就废|Python基础碎片,Pathlib模块
  • 一.AI大模型开发-初识机器学习
  • vue3.x 的provide 与 inject详细解读
  • 用C++实现点到三角形最小距离的计算
  • 基于springboot的超时代停车场管理平台(源码+文档)
  • LabVIEW与USB设备开发
  • 关于post和get的请求参数问题
  • [JVM篇]虚拟机性能监控、故障处理工具
  • TDengine 数据备份/还原工具 taosdump
  • C#开源大型商城系统之B2B2C+O2O一体化_OctShop
  • kubectl top输出与Linux free命令不一致原因?
  • React常用库
  • 【PyTorch】torch.optim介绍
  • MySQL
  • CCF-CSP第19次认证第一题——线性分类器【NA】
  • Deep seek学习日记1
  • 人工智能 - 主动视觉可能就是你所需要的:在双臂机器人操作中探索主动视觉
  • 学习笔记之debian的thonny开发(尚未验证)--从stm32裸机到linux嵌入式系统
  • 证监会副主席王建军被查
  • 国家医保局副局长颜清辉调任人社部副部长
  • 马上评|什么才是地方文旅宣传的正确姿势
  • 魔都眼|静安光影派对五一启幕:苏河湾看徐悲鸿艺术画作
  • 中国科学院院士张泽民已任重庆医科大学校长
  • 举牌超200轮!中铁建7.76亿元竞得北京通州梨园宅地