Python——urllib库

news2024/11/27 7:02:15

        urllib是一个用来处理网络请求的python内置库。

一.基本使用

二.一个类型和6个方法 

        2.1 一个类型

        urllib的request库中urlopen方法返回的类型:<class 'http.client.HTTPResponse'>。为了与之后request库做区别。

        2.2 6个方法

  • read()方法:获得响应正文,按字节为单位读取正文(一字节字节的去读)。得到的是字节形式的二进制数据。缺点是太慢了。

  • readline():按行读取响应正文。只能读取一行。返回的编码也是二进制的。
  • readlines():循环按照行去读取响应正文。直到读完。编码是二进制的。
  • getcode():获得状态码。
  • geturl():返回url地址。
  • getheaders():获取响应报头。

三.下载资源

        使用urllib.request.urlretrieve方法

        有人说,这样下载资源,我自己手动点即网页下载也行。但是,当我们需要下载成千上万个资源时,人工操作很耗时耗力。而通过爬虫很好实现。

四.请求对象的定制

  • 发现问题及其原因

        请求的url为https://www.baidu.com,响应返回的信息不正确。这是因为https的反爬手段。该反爬手段会验证请求报头中的Use-Agent(用户代理)字段,该字段中包括操作系统及版本,CPU类型,浏览器及其版本,浏览器的渲染引擎,浏览器语言,浏览器插件等信息。

  •  解决问题

首先介绍一下urlopen方法和Request对象:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) 
Open the URL url, which can be either a string or a Request object.
打开URL URL,它可以是字符串或请求对象。

class urllib.request.Request(url, data=None, headers={},
      origin_req_host=None, unverifiable=False, method=None)

         urlopen参数可以接收字符串或者Request对象,我们可以通过构建Request对象,自定义报头。在调用urlopen时请求中,会带有我们定义的信息。

五.编解码

        由于计算机一开始是美国人发明的。最早只有127个字符,小写字母,大写字母,数字和一些符号被编码到计算机里。这个编码表被称为ASCII表。

        而想要计算机认识中文,不能使用ASCII表,就得自己制定编码标准,而且还不能和ASCII码产生冲突。于是中国制定了GB2312编码,把中文加到计算机的编码中。

        但是世界上的语言这么多,不同的语言就会需要有不同的编码和不同的标准,就会不可避免的出现冲突,冲突就是一个字符在多个标准中有对应不同值,结果就是显示出现乱码。

        于是Unicode应运而生,把所有语言都统一到一套编码中。这样就不会出现乱码问题。

        例子:

        当我们百度一下搜索周杰伦时。

url:https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6

 而wd=%E5%91%A8%E6%9D%B0%E4%BC%A6中等于号右边的就是周杰伦的Unicode编码。

        get请求方式的参数在url中,而post的请求方式在请求正文中。

        5.1 get请求方式的quote方法

        方法是urllib.parse.quote()库中的,作用是将参数转化为Unicode编码。

例子:还是拿搜索周杰伦举例:

        不进行编码,直接搜索。

        使用quote编码后进行搜索:

        上面的现象是因为反爬导致的,是因为百度需要验证用户信息。需要在报头加上cookie。cookie可以在网页右键检查中得到:

         5.2 get请求方式的urlencode方法

        quato方法只能每次将一个参数转化为Unicode编码,当有多个参数时,会导致代码变得复杂。而urllib.parse模块中还提供了urlencode方法,可以将多个参数转化成Unicode编码,并且会转化成get参数的对应格式。  

        该方法也是urllib.parse模块中的,作用转化多个参数为Unicode编码。后面访问url时只需要将参数拼接到url中即可。

        5.3 post请求方式

         post请求方式和get请求方式不同在于,get请求方式的参数在url上,post的请求方式的参数在请求正文中。

        使用post请求方式来获取数据时,需要将请求参数作为构建urllib.request.Request对象的参数传入。

        参数在网页中可以获取:

        5.4 例子——ajax的get请求10页豆瓣电影

ajax介绍: Ajax即Asynchronous Javascript And XML(异步JavaScript和XML)在 2005年被Jesse James Garrett提出的新术语,用来描述一种使用现有技术集合的‘新’方法,包括: HTML 或 XHTML, CSS, JavaScript, DOM, XML, XSLT, 以及最重要的XMLHttpRequest。  使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。

请求第一页豆瓣电影的url:https://movie.douban.com/j/chart/top_listtype=5&interval_id=100%3A90&action=&start=0&limit=20

请求第二页豆瓣电影的url:https://movie.douban.com/j/chart/top_listtype=5&interval_id=100%3A90&action=&start=20&limit=20

请求第二页豆瓣电影的url:https://movie.douban.com/j/chart/top_listtype=5&interval_id=100%3A90&action=&start=40&limit=20

...

我们发现请求不同页数的url中只有start参数在变化,变化规律为 (page - 1) * 20

代码为:

        __name__:属于Python中的内置类属性,代表对应程序名称。如果当前运行的程序是主程序,此时__name__的值就是__main__,反之,则是对应的模块名。

        5.5 例子——ajax的post请求肯德基官网某个城市的门店

        post请求的参数在请求正文中。

        例子中查看参数:请求不同页数时,是参数pageindex值为对应的页数。

         代码:

六.异常

        HTTP错误是针对浏览器无法连接到服务器增加的错误提示。引导使用者该页是出现了什么问题。

        一般异常有两个类:UrlError/HttpError:这两个类在urllib.error模块下。

  • URLError异常类:一般报这个异常是URL上IP或者参数出现问题

  • HTTPError异常类:一般是URL上路径出现错误。HttpError是UrlError的子类。 

 

七.使用cookie跳过登录

现象,当我们爬微博个人主页:

 查看微博登录界面的编码:

        这是一种反爬手段,访问的url需要进行登录操作,或跳转到登录界面。但是登录界面的编码和访问页面编码不一样。 

        在http协议中有一种cookie和session机制,可以使用户在登录过一次某网站时,在访问该网站不需要再次登录。

        找到需要访问网页的的cookie设置到报头中,可以跳过登录。

报头中的referer:也是一种反爬手段。判断当前网页的上一个网页是不是referer对应的url,不相等不能进入。一般情况下做图片的防盗链。 

八.handler处理器

        handler的作用是为了定制更加高级的请求头。主要用来处理动态cookie和代理的情况。

         8.1 handler的基本使用

        8.2 代理

         8.3 代理池

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

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

相关文章

spark6. 如何设置spark 日志

spark yarn日志全解 一.前言二.开启日志聚合是什么样的2.1 开启日志聚合MapReduce history server2.2 如何开启Spark history server 三.不开启日志聚合是什么样的四.正确使用log4j.properties 一.前言 本文只讲解再yarn 模式下的日志配置。 二.开启日志聚合是什么样的 在ya…

C#,数值计算——哈希表的实现代码

1 文本格式 using System; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Hash<K, V> : Hashtable<K> { private List<V> els { get; set; } new List<V>(); public Ha…

iPhone苹果15手机圆点怎么设置让屏幕上显示出来圆形图标?

iPhone苹果15手机圆点怎么设置让屏幕上显示出来圆形图标&#xff1f; 1、在iPhone苹果手机上找到「设置」并点击打开&#xff1b; 2、在苹果iPhone设置内找到「辅助功能」并点击打开&#xff1b; 3、在苹果iPhone手机辅助功能内的动作交互内找到「触控」并点击打开&#xff1b…

车联网远程监控管理提升车辆调度效率,实现高效运营

随着智慧城市建设与物联网技术发展&#xff0c;车辆使用4G工业路由器网络实现车联网&#xff0c;并对车上视频监控、GPS定位以及温湿度传感器等信息进行数据采集和实时传输。这些数据的采集和监测将通过4G网络上传到管理平台&#xff0c;为车辆调度和运行效率的优化提供了有力的…

全局滚动条样式修改,elementUI table底部滚动条遮挡

/* 整个滚动条 */ ::-webkit-scrollbar {width: 15px !important;height: 15px !important; } /* 滚动条上的滚动滑块 */ ::-webkit-scrollbar-thumb {border-radius: 32px; } /* 滚动条轨道 */ ::-webkit-scrollbar-track {border-radius: 32px; }// 如果想作用组件 可以 .xxx…

项目--苍穹外卖

1.| constant | 存放相关常量类 | | context | 存放上下文类 | | enumeration | 项目的枚举类存储 | | exception | 存放自定义异常类 | | json | 处理json转换的类 | | properties | 存放SpringBoot相关的配置属性类 | | result | 返回结果类的封装 | | utils | 常用工具类 | …

✔ ★算法基础笔记(Acwing)(二)—— 数据结构(17道题)【java版本】

数据结构 1. 单链表模板1. 单链表(7分钟) 2. 双链表模板1. 双链表 3. 模拟栈1. 模拟栈(一个数组即可)2. 表达式求值(20分钟) 4. 队列 tt -1,hh 0;1. 模拟队列 5. 单调栈1. 单调栈(4分钟)3.14 6. 单调队列1. 滑动窗口例题(10分钟) 7. KMP1. KMP字符串(10分钟)二刷体会★三刷体…

Python之glob

import os import glob import datetime # for dirpath, dirname, files in os.walk(rE:\htdos\Project): # print(dirpath, dirname, files)# glob.glob(**) 当前目录的所有文件和文件夹 # glob.glob(**/) 当前目录的所有文件夹 # glob.glob(20*) 找到当前目录以20开头的…

HDMI协议Ver2.0a(学习笔记)

1 简介 本规范由HDMI论坛制定 2.目的和范围 本文件构成了高清多媒体接口2.0版规范&#xff08;HDMI规范2.0版&#xff09;。本规范通过引用纳入了HDMI规范1.4b版&#xff0c;并定义了附加和改进的功能。对Source、Sink、中继器和电缆的合规性所需的机械、电气、行为和协议要…

解决java.lang.reflect.ReflectionException: Reflection error

解决java.lang.reflect.ReflectionException: Reflection error 摘要引言正文1. 理解异常的根本原因2. 处理反射操作错误用法获取类的方式不正确&#xff1a;调用方法的方式不正确&#xff1a; 3. 处理访问权限问题4. 异常处理 总结参考资料 博主 默语带您 Go to New World. ✍…

Unity 课时 1 : No.1 模拟面试题

课时 1 : No.1 模拟面试题 C# 1.装箱和拆箱是什么&#xff1f; ​ 对于应用类型。将基类的子类转化成基类称为装箱。将基类转换成子类&#xff0c;成为拆箱。装箱通常使用隐式转换&#xff0c;拆箱可以使用 as 或者 强制转换。同样对于值类型也可以进行装箱和拆箱。 答案&a…

C++11—线程库

C线程库 文章目录 C线程库线程的创建thread提供的成员函数get_idthis_thread命名空间线程的回收策略join detach 线程函数参数mutex的种类lock_guardunique_lock原子性操作库(atomic)cas操作windows和Linux创建进程的区别 线程的创建 调用无参的构造函数 thread() noexcept;#in…

视频云存储/安防监控/AI分析/视频AI智能分析网关行为分析算法应用场景汇总

随着城市经济的日益发展&#xff0c;城市建设也如火如荼。很多施工人员为了自身方便&#xff0c;无视安全规章制度&#xff0c;不按照安全施工要求进行着装、施工。具有很大的安全隐患&#xff0c;一旦发生事故&#xff0c;就会造成人员损伤和工程进度的挤压。为了改善此问题&a…

QT实战之翻金币游戏【详细过程及介绍】

目录 前言 一、游戏整体分析 二、创建项目 三、添加资源 四、主界面实现 1、设置游戏主场景基本配置 2、设置背景图片 3、创建开始按钮并设置动画 4、创建关卡选择界面并实现主界面与其的切换 五、关卡选择界面实现 1、设置关卡选择场景基本配置 2、设置关卡选择场…

2-2 自动微分机制

神经网络是如何更新网络参数的呢&#xff1f; 为什么需要自动微分机制&#xff1f; 以及什么是自动微分机制&#xff1f; 神经网络通常依赖反向传播求梯度来更新网络参数&#xff0c;求梯度过程通常是一件非常复杂而容易出错的事情。而深度学习框架可以帮助我们自动地完成这种求…

PostgreSQL数据库IPC——SI Message Queue

SI Message Queue代码位于src/backend/storage/ipc/sinvaladt.c和src/backend/storage/ipc/sinval.c文件中&#xff0c;属于PostgreSQL数据库IPC进程间通信的一种方式【之前介绍过PostgreSQL数据库PMsignal——后端进程\Postmaster信号通信也是作为PostgreSQL数据库IPC进程间通…

Linux下Minio分布式存储安装配置(图文详细)

文章目录 Linux下Minio分布式存储安装配置(图文详细)1 资源准备1.1 创建存储目录1.2 获取Minio Server资源1.3 获取Minio Client资源 2 Minio Server安装配置2.1 切换目录2.2 后台启动2.3 查看进程2.4 控制台测试 3 Minio Client安装配置3.1 切换目录3.2 移动mc脚本3.2 运行mc命…

记录一次LiteFlow项目实战

文章目录 学习LiteFlowspring boot整合LiteFlow依赖配置组件定义spring boot配置文件规则文件的定义 执行 组件EL规则串行并行 动态构建组件动态构建chain&#xff08;流程&#xff09;销毁chain高级特性 题外话&#xff1a; 最近喜欢上骑摩托车了&#xff0c;不是多大排量的摩…

C++ if...else 语句

一个 if 语句 后可跟一个可选的 else 语句&#xff0c;else 语句在布尔表达式为假时执行。 语法 C 中 if…else 语句的语法&#xff1a; if(boolean_expression) {// 如果布尔表达式为真将执行的语句 } else {// 如果布尔表达式为假将执行的语句 }如果布尔表达式为 true&…

联想拯救者Lenovo Legion Y7000 2020H(81Y7)原厂Win10系统

链接&#xff1a;https://pan.baidu.com/s/15GwrfjvhK3-_OlhkfPyUbA?pwd4v03 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;ISO 文件大小&#xff1a;10.7GB 注&#xff1a;恢复…