[Python]爬虫基础——urllib库

urllib目录

  • 一、简介
  • 二、发送请求
    • 1、urlopen()函数
    • 2、Request()函数
  • 三、异常处理
  • 四、解析URL
  • 五、分析Robots协议

一、简介

urllib库是Python内置的标准库。包含以下四个模块:
1、request:模拟发送HTTP请求;
2、error:处理HTTP请求错误时的异常;
3、parse:解析、拆分、合并URL;
4、robotparser:解析网站的robots.txt文件

案例:
爬取知乎网站的数据
首先要构造HTTP请求,然后将HTTP响应的各部分进行输出

第一步:准备工作,创建zhuhu.py文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第二步:爬取菜鸟教程代码,敲入以下代码

#第一步:导入request模块
import urllib.request
#第二步:定义url字符串(菜鸟教程网站)
url = 'https://www.runoob.com/'
#第三步:构造HTTP请求,并把返回回值赋值给response
response = urllib.request.urlopen(url)
print('响应类型',type(response))
print('响应状态码',response.getcode())
print('编码方式',response.getheader('Content-Type'))
print('请求的URL',response.geturl())
#第四步:urlopen()函数获取网页,返回的网页内容数据格式为bytes类型,需要使用decode()函数解码,装换成str类型。
resp = response.read().decode('utf-8')
print('网页内容',resp)

运行结果如下:

在这里插入图片描述
结果:爬取的内容与网页内容一致,爬取网页成功
在这里插入图片描述

二、发送请求

request模块提供了基本的构造HTTP请求方法,同时可以处理授权验证(authentication)、重定向(redirection)、Cookie会话等。
使用urlopen()函数和Request()函数构造HTTP请求。
在这里插入图片描述

1、urlopen()函数

在这里插入图片描述

原型:
urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
url:请求的URL,必传。
data:请求信息,以get方式发送请求为None,以post方式发送请求时给出data参数(必须是bytes(字节流)类型)。
timeout:网络访问的超时时间。
cafile、captath、cadefault:用于实现可信任CA证书的HTTP请求很少使用。
context:实现SSL加密传输,很少使用。
注意:urlopen()函数的data参数必须是bytes(字节流)类型,如果是字典类型,可以先用urllib.parse模块的urlencode()函数编码。

调用urlopen()函数后,返回一个HTTPResponse类型的对象,以下是

HTTPResponse类型对象提供的属性和方法。

getcode():status:获取响应状态码;
get_url():获取请求的url;
getheaders():获取响应头的信息,返回二元组列表;
getheader(name):获取特定响应头信息;
info():获取响应头信息,返回字符串;
read()/readline():读取响应体。

在这里插入图片描述urlopen()函数既可以实现GET请求,也可以通过设置data参数实现POST请求。

2、Request()函数

函数原型:
Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
(1) url:请求的URL。
(2) data:请求信息,以get方式发送请求为None,以post方式发送请求时给出data参数(必须是bytes(字节流)类型)。
(3) headers:请求头信息(user_agent,cookie,host…)
(4) origin_req_host:客户端的host名称或者IP地址。
(5) unverifiable:表示请求无法验证,默认为False.
(6) method:请求方法(get/post)

当服务器有反爬虫机制时,可以通过设置headers参数伪装成浏览器去访问网站。

案例:爬取https://www.iconfont.cn/首页内容

#第一步:导入request模块
import urllib.request
#第二步:定义url字符串
url ='https://www.iconfont.cn/'
#第三步:设置headersvalue参数,伪装成浏览器
headersvalue = {
    'user-agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}

#第四步:创建Request对象,并将返回的结果赋值给request
request =urllib.request.Request(url,headers=headersvalue)
#第五步:构造Http请求,并将返回结果赋值给response
response =urllib.request.urlopen(url)
#第六步:读取网页内容并解码
resp = response.read().decode('utf-8')
#第七步:输出网页内容
print("网页内容:",resp)

三、异常处理

error模块提供了request模块产生的异常处理,主要是URLError和HTTPError两个类。
1、URLError类:是error异常模块的基类,可以捕获request模块产生的异常,它具有一个reason属性(返回异常原因)。
2、HTTPError类是URLError类的子类,专门处理HTTP请求的异常,它具由3个属性,分别为reason(返回异常原因)、code(返回HTTP状态码)和headers(返回请求头)。

由于HTTPError是URLError的子类,并不能处理父类支持的异常处理,所以一般对两种异常分开捕获,可先捕获子类的异常,再捕获父类的异常。

#第一步:导入request模块
import urllib.request
#导入error模块
import urllib.error
#处理异常
try:
    # 构造HTTP请求,并将返回的结果赋值给response
    response = urllib.request.urlopen('https://www.gaoding.com/introduction')
    # 捕获HTTP请求的异常
except urllib.error.HTTPError as e:
    #输出HTTP请求的异常原因、状态码和请求头
    print('异常原因:',e.reason)
    print('状态码:',e.code)
    print('请求头:',e.headers)
except urllib.error.URLError as e:
    #捕获异常
    print(e.reason)
else:
    #如果没有异常则输出“Request Successfully”
    print('Request Successfully')




在这里插入图片描述

四、解析URL

parse模块提供解析URL方法,如下:
拆分:
urlparse(urlstring):将URL拆分为六个部分:scheme、netloc、path、params、query、fragment。
urlsplit(urlstring):将URL拆分为五部分:scheme、netloc、path、query、fragment。
合并:
urljoin(url1,url2):将基础链接uel1和新链接url2合并,分析url1的scheme、netloc、path内容,并补充url2缺失的部分。
urlunparse(parts):将可迭代对象parts合并为URL,parts长度为7。
urlunsplit(parts):将可迭代对象parts合并为URL,parts长度为6.
装换:
urlencode(query):将字典形式的数据装换为URL后面的查询字符串。
parse_qs(qs):将URL后面的查询字符串转换为字典。
parse_qsl(qs):将URL后面的查询字符串转换为列表。
quote(str):将URL中的中文字符装换为URL编码。
unquote(str):将URL编码转换为中文字符,进行编码。

案例:
解析 https://www.zhihu.com/search?type=content&q=%E7%88%AC%E8%99%AB

#导入parse模块
import urllib.parse
#定义url字符串
url = 'https://www.zhihu.com/search?type=content&q=%E7%88%AC%E8%99%AB '
#拆分url并输出结果
print("拆分结果:",urllib.parse.urlparse(url))
#合并url并输出结果
print(urllib.parse.urljoin('https://www.zhihu.com/search','?type=content&q=%E7%BD%91%E7%BB%9C'))
#定义params字符串
params={'type':'content','q':'%E7%BD%91%E7%BB%9C'}
#编码params参数,合并url并输出结果
print('https://www.zhihu.com/search?'+urllib.parse.urlencode(params))
#定义query字符串
query='type=content&q=%E7%BD%91%E7%BB%9C'
#将query转换成字典
print(urllib.parse.parse_qs(query))
#将query转换成列表
print(urllib.parse.parse_qsl(query))
#定义keyword中文字符串
keyword= 'Python语言进行网络爬虫'
#将中文字符串装换为URL编码,合并后赋值给url
url ='https://www.zhihu.com/search?type=content&q='+urllib.parse.quote(keyword)
#输出URL编码的url
print(url)
#将URL编码装换为中文字符并输出结果
print(urllib.parse.unquote(url))

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

五、分析Robots协议

robotparser模块提供了分析网站Robots协议的RobotFileParser类,它可以通过robots.txt文件来判断某网页是否能被爬取。
以下是RotbotFileParser类提供的方法:
(1)set_url():设置robots.txt文件的URL.
(2)read():读取robots.txt文件并进行分析。
(3)can_fetch():第一个参数为User_Agent,第二个参数为要爬取的网页的URL,判断该网页能否被爬取。
(4)parse():解析robots.txt文件中某些行的内容。
(5)mtime():返回上次抓取和分析的robots.txt文件的时间。
(6)modified():将当前时间设置为上次抓取和分析robots.txt时间。

案例:

#导入robotparser模块
import urllib.robotparser
#创建RobotsFileParser类对象response
response = urllib.robotparser.RobotFileParser()
#设置robots.txt文件的URL
response.set_url('https://www.zhihu.com/robots.txt')
#读取robots.txt文件并进行分析
response.read()
#定义爬虫名称
user_agent='zhuhupachong'
#定义知乎的发现url
url ='https://www.zhihu.com/explore'
#判断是否可以进行爬取
print("是否可以爬取知乎发现:",response.can_fetch(user_agent,url))

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端技术——css

1.CSS的引入 【1】为什么要学习CSS? 如果只用HEML画页面的话--->这个页面就是页面上需要的元素罗列起来,但是页面效果很差,不好看,为了让页面好看,为了修饰页面。所以我们需要用到CSS。 CSS的作用:修饰HTML页面…

linux操作手册

开机&关机 指令 shutdown -h now 立刻进行关机 shutdown -h num num分钟后执行关机 shutdown -r now 现在重启计算机 halt 关机 rebboot 重启计算机 sync 把内存的数据同步到磁盘 注意事项 无论是重启还是关闭系统,都必须先执行sync,将内存…

使用无标注的数据训练Bert

文章目录 1、准备用于训练的数据集2、处理数据集3、克隆代码4、运行代码5、将ckpt模型转为bin模型使其可在pytorch中运用 Bert官方仓库:https://github.com/google-research/bert 1、准备用于训练的数据集 此处准备的是BBC news的数据集,下载链接&…

camunda表达式如何使用

在Camunda中,表达式是一种灵活的方式,可以用于在流程定义和表单中计算和处理数据。表达式可以在Camunda的各个环节中使用,例如服务任务、网关、表单、条件等。 以下是Camunda表达式的一些常见用途: 1、计算值:表达式可…

卢北辰:数据点亮梦想,能力驱动人生 | 提升之路系列(九)

导读 为了发挥清华大学多学科优势,搭建跨学科交叉融合平台,创新跨学科交叉培养模式,培养具有大数据思维和应用创新的“π”型人才,由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

ipad有必要用手写笔吗?电容笔和Apple pencil区别

与Apple Pencil最大的不同之处,在于普通的电容笔并不具备着重力压感,而是会给人一种倾斜的压感。如果不是频繁作画,那就用一支普通的电容笔。这种电容笔不但可以用于办公室,也可以用于记笔记、做练习。再说了,一支苹果…

【C++修炼之路:二叉搜索树】

目录: 二叉搜索树的概念构建一颗二叉树二叉树的查找二插树的插入 二叉树的删除删除右子树的最小节点 写一个中序来走这个二叉搜索树递归版删除(recursion)递归版插入(recursion)递归版查找(recursion&#…

python+java+nodejs基于vue的企业人事工资管理系统

根据系统功能需求分析,对系统功能的进行设计和分解。功能分解的过程就是一个由抽象到具体的过程。 作为人事数据库系统,其主要实现的功能应包括以下几个模块: 1.登录模块 登录模块是由管理员、员工2种不同身份进行登录。 2.系统管理模块 用户…

中级软件设计师备考---软件工程1

目录 经典的模型敏捷开发方法【的分类】信息系统开发方法【的分类】结构化设计---内聚与耦合结构化设计---系统结构/模块结构 需求的分类 经典的模型 瀑布模型:最早的一类、适用于需求明确的项目、结构化的典型代表 原型模型:先构造一个建议的系统原型再…

【系统集成项目管理工程师】计算题专题一

一、决策树和期望货币值 1、项目经理向客户推荐了四种供应商选择方案。每个方案损益值已标在下面的决策树上。根据预期收益值,应选择设备供应商 A.供应商1B.供应商2C.供应商3D.供应商4 解题: 供应商 1:60% * 10000 (-30000&am…

Oracle SQL执行计划操作(13)——其他相关操作

该类操作主要包括以上未进行讲解的其他相关操作。根据不同的具体SQL语句及其他相关因素,如下各操作可能会出现于相关SQL语句的执行计划。 1)SELECT STATEMENT 检索表中数据。该操作出现于通过select语句检索表中数据时产生的执行计划。该操作具体如图15-1中节点0所示。 图1…

RISC-V OS(老师的OS) 基于 汪辰老师的视频笔记

前言 最后面没写完,以后再补。。。 RISC-V OS RVOS 介绍 操作系统定义 操作系统(英语:Operating System,缩写:OS)是一组系统软件程序: 主管并控制计算机操作、运用和运行硬件、软件资源。提…

SPSS如何进行对应分析之案例实训?

文章目录 0.引言1.对应分析2.多重对应分析 0.引言 因科研等多场景需要进行数据统计分析,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对对应分析进行阐述。 1.对应分析 &a…

55、RK3588使用MPP编码yuv到h264、解码h264到yuv模块开发和测试

基本思想:需要使用独立模块代码去实现自己的逻辑功能,所以在基于官方源码基础上,和参考附录几个官方链接,搞出一版rk3588编码测试和解码测试demo 测试视频/生成h264/生成yuv 链接: https://pan.baidu.com/s/1HbpeqMJb8HcgFpzaKh…

【Linux学习】多线程——线程控制 | 线程TCB

🐱作者:一只大喵咪1201 🐱专栏:《Linux学习》 🔥格言:你只管努力,剩下的交给时间! 线程控制 | 线程TCB 🧰线程控制🎴线程创建🎴线程结束&#x1…

写作业用白光还是暖光?盘点色温4000K的护眼台灯

台灯的白光或者暖光指的是台灯的色温,低色温的光线看起来发黄发红,高色温的光线发白发蓝。 如果灯光的光源是高品质光源,本身没有蓝光问题,那么色温的选择对护眼的影响是比较少的,更多的是对人学习工作状态&#xff0c…

Linux 之 vi 文本编辑器(二)

1、文本编辑器简介 Linux 中最常用的文本编辑器: vi:类 Unix 系统中默认的文本编辑器 vim:vi 编辑器的增强版本,习惯上也称 vi vi 文本编辑器的作用和特性: vi 可以执行插入、删除、查找、替换等众多文本操作&…

Leetcode268. 丢失的数字

Every day a leetcode 题目来源&#xff1a;268. 丢失的数字 解法1&#xff1a;排序 代码&#xff1a; /** lc appleetcode.cn id268 langcpp** [268] 丢失的数字*/// lc codestart class Solution { public:int missingNumber(vector<int> &nums){int n nums.s…

ESP32设备驱动-Si1145红外接近-紫外 (UV) 指数和环境光传感器驱动

Si1145红外接近-紫外 (UV) 指数和环境光传感器驱动 文章目录 Si1145红外接近-紫外 (UV) 指数和环境光传感器驱动1、Si1145介绍2、硬件准备3、软件准备4、驱动实现1、Si1145介绍 Si1145/46/47 是一款低功耗、基于反射的红外接近、紫外 (UV) 指数和环境光传感器,具有 I2C 数字接…

【一起撸个DL框架】4 反向传播求梯度

CSDN个人主页&#xff1a;清风莫追 欢迎关注本专栏&#xff1a;《一起撸个DL框架》 文章目录 4 反向传播求梯度&#x1f965;4.1 简介4.2 导数与梯度4.3 链式法则4.4 示例&#xff1a;y2x1的梯度 4 反向传播求梯度&#x1f965; 4.1 简介 上一篇&#xff1a;【一起撸个DL框架】…