用python写网络爬虫:3.urllib库进一步的使用方法

文章目录

  • 异常处理
    • URLError
    • HTTPError
    • 设置超时时间
  • 链接的解析、构造、合并
    • urlparse方法
    • urlsplit方法
    • urljoin方法
    • urlencode方法
    • parse_qs方法
    • quote方法
  • Robots 协议
    • Robots 协议的结构
    • 解析协议
  • 参考书籍

在上一篇文章:用python写网络爬虫:2.urllib库的基本用法 已经介绍了如何使用urllib库的requests模块发送简单的请求,如果想方便地实现更多东西,还得学习新的东西

异常处理

使用urllib库中的error模块可以帮我们处理异常情况

URLError

如果我们打开一个不存在的网页,程序应该会报错,这时可以使用URLError命令返回错误原因,避免程序异常终止

from urllib import request, error try: response = request.urlopen('https://cuiqingcai.com/index.htm')
except error.URLError as e: print(e.reason)

HTTPError

是URLError错误的子类,专门处理HTTP请求错误,它有三个属性

  • code:返回HTTP状态码
  • reason:返回错误原因
  • headers:返回请求头
    代码示例:
from urllib import request,error try: response = request.urlopen('https://cuiqingcai.com/index.htm') 
except error.HTTPError as e: print(e.reason,e.code,e.headers)

输出结果如下
在这里插入图片描述
在一些情况下,e.reason,e.code 和 e.headers 也可能为 None。此时可以代替使用 e 本身来输出完整的异常信息。

print(e)

为了使代码更有效率,一般我们先使用HTTPError检查是否存在HTTPError,再使用父类的URLError检查是否存在URLError,即

from urllib import request, errortry: response = request.urlopen('https://cuiqingcai.com/index.htm') 
except error.HTTPError as e: print(e.reason, e.code, e.headers) 
except error.URLError as e: print(e .reason) 
else: print('Request Successfully')

设置超时时间

通过设置一个超时时间,防止程序因异常而长时间循环

import socket 
import urllib.request 
import urllib.error try: response = urllib.request.urlopen('https://www.baidu.com',timeout = 0.01)
except urllib.error.URLError as e: print(type(e.reason)) if isinstance(e.reason,socket.timeout):print('TIME OUT')

链接的解析、构造、合并

urlparse方法

使用urlparse方法可以进行链接的解析

from urllib.parse import urlparse result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result), result)

返回结果是一个 ParseResult 类型的对象,它包含6个部分,分别是协议scheme、域名netloc、访问路径path、参数params、查询条件query、锚点fragment

<class ‘urllib.parse.ParseResult’> ParseResult(scheme=‘http’, netloc=‘www.baidu.com’, path=‘/index.html’, params=‘user’, query=‘id=5’, fragment=‘comment’)

这也暗示着,一个标准的URL链接格式应该是

scheme://netloc/path;params?query#fragment

urlparse方法的参数
urlparse(urlstring,scheme=‘’,allow_fragments=True)

  • urlstring:待解析的URL,必填参数
  • scheme:若原链接不含有协议信息,则为其指定协议(例如HTTP)。若原链接含有协议scheme,则失效
  • allow_fragments:是否带有fragments。是:正常解析fragments;否:忽略fragments,将其作为query、params或path的一部分

使用urlunparse方法按照URL的标准结构可以构造一个链接

from urllib.parse import urlunparse data =['http','www.baidu.com','index.html','user','a=6','comment'] 
print(urlunparse(data))

输出结果即为 http://www.baidu.com/index.html;user?a=6#comment

urlsplit方法

urlsplit方法大体与urlparse类似,区别在于urlsplit不解析params的部分,而将其与path合并

from urllib.parse import urlsplitresult = urlsplit('http://www.baidu.com/index.html;user?id=5#comment') 
print(result)

结果即

SplitResult(scheme=‘http’, netloc=‘www.baidu.com’, path=‘/index.html;user’, query=‘id=5’, fragment=‘comment’)

类似地,可以使用urlunsplit方法构造链接,只需注意元素为5个

from urllib.parse import urlunsplit data =['http','www.baidu.com','index.html','a=6','comment']
print(urlunsplit(data))

urljoin方法

以上介绍了链接的解析和构造,下面介绍用urljoin方法进行链接的合并,一般输入两个参数,第一个参数为基础链接,第二个参数为新链接;urljoin会将基础链接拆分,将新链接没有的部分给补全,如下例

from urllib.parse import urljoin print(urljoin('http://www.baidu.com','FAQ.html')) 
print(urljoin('http://www.baidu.com','https://cuiqingcai.com/FAQ.html')) 
print(urljoin('http://www.baidu.com/about.html','https://cuiqingcai.com/FAQ.html')) 
print(urljoin('http://www.baidu.com/about.html','https://cuiqingcai.com/FAQ.html?question=2')) 
print(urljoin('http://www.baidu.com?wd=abc','https://cuiqingcai.com/index.php'))
print(urljoin('http://www.baidu.com','?category=2#comment')) 
print(urljoin('www.baidu.com','?category=2#comment')) 
print(urljoin('www.baidu.com#conent','?category=2'))

运行结果如下
在这里插入图片描述

urlencode方法

构造GET请求时,常常需要先声明一个字典,再将其化为请求的参数,这时需要urlencode方法

from urllib.parse import urlencodeparams = {'name' : 'germey','age': 22
}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params)
print(url)

运行结果为 http://www.baidu.com?name=germey&age=22

parse_qs方法

若想将URL中的参数转回字典,可以使用parse_qs方法

from urllib.parse import parse_qs query= 'name=germey&age=22' 
print(parse_qs(query))

运行结果:{‘name’: [‘germey’], ‘age’: [‘22’]}

若想将参数转化为列表,则使用parse_qsl方法

from urllib.parse import parse_qsl query= 'name=germey&age=22' 
print(parse_qsl(query))

运行结果:[(‘name’, ‘germey’), (‘age’, ‘22’)]

quote方法

URL中带有中文参数时,有时可能会导致乱码的问题,此时用quote方法可以将中文字符转化为 URL 编码

from urllib.parse import quote keyword = '壁纸'
url = 'https://www.baidu.com/s?wd='+ quote(keyword) 
print(url)

输出结果:https://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8

若想将编码转回文字,则使用unquote方法

from urllib .parse import unquote 
url = 'http://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8' 
print(unquote(url))

运行结果:http://www.baidu.com/s?wd=壁纸

Robots 协议

Robots 协议( Robots Exclusion Protocol ),也称作爬虫协议、机器人协议,用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取。 它通常是一个叫作 robots.txt的文本文件,一般放在网站的根目录下。

当爬虫访问一个站点时,它首先会检查这个站点根目录下是否存在 robots.txt 文件,如果存在,搜索爬虫会根据其中的规则来爬取,否则搜索爬虫便会访问所有可直接访问的页面。

Robots 协议的结构

robots.txt一般由三部分组成,User-agent、Disallow、Allow,分别代表对哪些爬虫生效,禁止爬取的范围,允许爬取的范围。

常见的爬虫名称

名称含义
*所有爬虫
BaiduSpider百度
Googlebot谷歌
360Spider360
YodaoBot有道

下面举几个 robots.txt 的例子

禁止所有爬虫访问任何目录:

User-agent: *
Disallow: /

允许所有爬虫访问所有目录

User-agent: *
Allow:

禁止所有爬虫访问网站某些目录:

User-agent: *
Disallow: /private/
Disallow: /tmp/

只允许某一爬虫访问:

User-agent: BaiduSpider
Disallow:
User-agent: *
Disallow: /

解析协议

使用robotparser模块的RobotFileParser类进行解析robots.txt文件,只需要输入URL即可

urllib.robotparser.RobotFileParser(url='')

或者在声明时输入为空,并选择以下设置

  • set_url:传入URL链接
  • read:读取robots.txt文件,必须设置
  • parse:解析 robots. txt 文件,传入的参数是 robots.txt 部分行的内容,按照robots.txt的语法规则来分析这些内容
  • can_fetch:判断爬虫是否可以抓取这个 URL,返回结果是 True 或 False
  • mtime: 返回的是上次抓取和分析 robots.txt 的时间,利于定期检查来抓取最新的 robots.txt
  • modified:将当前时间设置为上次抓取和分析 robots.txt 的时间,避免频繁地获取 robots.txt 文件,节省网络资源并提高爬虫效率

示例:

from urllib.robotparser import RobotFileParser 
rp = RobotFileParser() 
rp.set_url('http://www.jianshu.com/robots.txt') 
rp. read() print(rp.can_fetch ('*','http://www.jianshu.com/p/b67554025d7d')) 
print(rp.can_fetch ('*','http://www.jianshu.com/search?q=python&page=l&type=collections'))

上述代码说明以上两个URL均不可被爬取

参考书籍

《python3 网络爬虫开发实战》崔庆才著

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/752734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32中freertos任务不能调度的原因解决

本文是项目中的定位问题&#xff0c;如果定位到同样问题&#xff0c;可以按下面方法解决。 问题定位 这行assert代码主要判断系统中最大中断优先级数量是否等于内核中断优先级&#xff0c;实际意思就是要求内核中断优先级为系统最低优先级&#xff08;freertos中0为最高优先级…

初次文件包含漏洞

1.文件包含漏洞介绍 1.1.文件包含漏洞解释   文件包含漏洞就是使用函数去包含任意文件的时候&#xff0c;当包含的文件来源过滤不严谨的时候&#xff0c;当存在包含恶意文件后&#xff0c;就可以通过这个恶意的文件来达到相应的目的。 1.2.文件包含漏洞原理    其实原理就…

四、MySQL

MySQL MySQL1.初识网站2.安装MySQL2.1 下载&#xff08;最重要的一点是路径中不能有中文&#xff0c;哪怕是同级目录也不行&#xff09;2.2安装补丁2.3安装2.4创建配置文件2.5初始化 3.启动MySQL4.连接测试4.1 设置密码4.2 查看已有的文件夹&#xff08;数据库&#xff09;4.3 …

计算机网络——物理层(信道复用技术)

计算机网络——物理层&#xff08;信道复用技术&#xff09; 信道复用技术频分多址与时分多址 频分复用 FDM (Frequency Division Multiplexing)时分复用 TDM (Time Division Multiplexing)统计时分复用 STDM (Statistic TDM)波分复用码分复用 我们今天接着来看信道复用技术&am…

用Excel就可以实现的生产绩效考核评定

从事生产管理数十载&#xff0c;在进行员工日常生产效率和综合考核的管理方面&#xff0c;积累了一些经验和注意事项。今天来和大家分享一下如何用Excel来搞定它吧&#xff01; 首先&#xff0c;Excel是一个强大的工具&#xff0c;可以帮助我们收集、分析和展示员工的生产数据…

生成器建造者模式(Builder)——创建型模式

生成器/建造者模式——创建型模式 什么是生成器模式&#xff1f; 生成器模式是一种创建型设计模式&#xff0c; 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 提炼两个关键点&#xff1a;Ⅰ.分步骤创建复杂对象。Ⅱ.相同创建代码…

llm综述

1、语言模型进程 1.1、语言模型概述 语言模型从统计语言模型&#xff08;SLM&#xff09;逐步发展为神经语言模型&#xff08;NLM&#xff09;&#xff1b;近年&#xff0c;通过在大规模语料库上对 Transformer 模型进行预训练&#xff0c;预训练语言模型(Pre-training Langu…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:EffectComponent)

特效合并容器组件&#xff0c;用于子节点特效绘制的合并&#xff0c;实现特效的绘制性能优化。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件为系统接口。 目前该组件仅支持子组件背景…

亮点抢先看!4月16-17日,百度Create大会开设“AI公开课”,大咖带你打造赚钱工具

3月16日&#xff0c;2024百度Create AI开发者大会正式开放售票&#xff0c;嘉宾套票定价399元。据悉&#xff0c;本次大会以“创造未来&#xff08;Create the Future&#xff09;”为主题&#xff0c;设有20深度论坛、超30节AI公开课、3000平AI互动体验区和AI音乐节等精彩环节…

基于java+springboot+vue实现的网上商城系统(文末源码+Lw+ppt)23-448

摘要 随着社会的不断进步与发展&#xff0c;人们经济水平也不断的提高&#xff0c;于是对各行各业需求也越来越高。特别是从2019年新型冠状病毒爆发以来&#xff0c;利用计算机网络来处理各行业事务这一概念更深入人心&#xff0c;由于用户工作繁忙的原因&#xff0c;去商城购…

深圳市翻译协会与赛氪网签署战略合作协议 共推语言服务行业创新发展

2024年3月12日&#xff0c;在中国深圳&#xff0c;深圳市翻译协会与赛氪网共同举办了一场盛大的战略合作签约仪式&#xff0c;标志着双方在语言服务行业将展开深度合作&#xff0c;共同推动行业的创新与发展。 签约仪式上&#xff0c;深圳市翻译协会向赛氪网赠送了《汉英深圳公…

pinia 的选项式和组合式的不同写法和持久化的方法

pinia 是vue3推荐的状态管理插件&#xff0c;它对标的是vue2中使用的vuex pinia 的引入方法 npm 安装 pinia在 src/store/index.js 中 创建一个pinia 的实例&#xff0c;并导出 在项目中的 main.js 中引入 2 中的pinia 并且使用 app.use(pinia) main.js中 import pinia from…

2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛—— C 题:竞赛论文的辅助自动评阅完整思路与源代码分享

一、问题背景 近年来我国各领域各层次学科竞赛百花齐放&#xff0c;层出不穷&#xff0c;学生参与度也越来越高。随着参赛队伍的增 加&#xff0c;评阅论文的工作量急剧增加&#xff0c;这对评阅论文的人力要求也越来越大。因此引入机器辅助评阅成为竞赛主办方的现实需求。 在…

【论文笔记合集】Transformers in Time Series A Survey综述总结

本文作者&#xff1a; slience_me 文章目录 Transformers in Time Series A Survey综述总结1 Introduction2 Transformer的组成Preliminaries of the Transformer2.1 Vanilla Transformer2.2 输入编码和位置编码 Input Encoding and Positional Encoding绝对位置编码 Absolute …

Java Spring Boot搭配MyBatis的项目开发中关于账户余额并发更新

在Java Spring Boot搭配MyBatis的项目开发中&#xff0c;涉及到多个功能模块同时操作同一数据库表字段&#xff08;例如用户账户余额&#xff09;时&#xff0c;为了保证数据的一致性和防止更新过程中的错误&#xff08;例如余额错账、更新丢失等&#xff09;&#xff0c;需要采…

冷链物流行业市场规模与未来投资趋势分析

环洋市场咨询Global Info Research的冷链物流市场调研报告提供冷链物流市场的基本概况&#xff0c;包括定义&#xff0c;分类&#xff0c;应用和产业链结构&#xff0c;同时还讨论发展政策和计划以及制造流程和成本结构&#xff0c;分析冷链物流市场的发展现状与未来市场趋势&a…

LLM文本生成—解码策略(Top-k Top-p Temperature)

{"top_k": 5,"temperature": 0.8,"num_beams": 1,"top_p": 0.75,"repetition_penalty": 1.5,"max_tokens": 30000,"message": [{"content": "你好","role": "user&…

CentOS7 安装ErLang语言环境

在线搜索适合当前linux系统的epel在线安装。 yum -y install epel-release下载erlang-solutions安装包。 wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm离线安装erlang-solutions安装包。 rpm -Uvh erlang-solutions-1.0-1.noarch.rpm在线…

【C语言】字符串函数下

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《C语言》 &#x1f389;道阻且长&#xff0c;行则将至 前言 这篇博客是字符串函数下篇&#xff0c;主要是关于长度受限制的字符串函数&#xff08;strncpy,strncat,strncmp)的使用…

【LabVIEW FPGA入门】FPGA中的数据流

LabVIEW 以数据流方式执行代码。 当节点的所有输入上都存在数据时&#xff0c;该节点就会执行。 当节点完成执行时&#xff0c;节点的输出将数据传递到下游的下一个节点。 LabVIEW FPGA 使用三个组件来维护这种数据流范例。 节点具有与其功能相对应的逻辑 同步&#xff0c;该组…