Python——urllib库

2023-09-13 19:32:56

        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, JavaScriptDOM, 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 代理池

更多推荐

[C++入门]---List的使用及模拟实现

文章目录1.list的介绍2.list的使用2.1list的构造函数2.2listmodifiers2.3listcapacity2.4listelmentaccess2.5iterator的使用3.list的模拟实现3.1list的源码1.list的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,

【Java 基础篇】深入理解Java HashMap:使用注意事项和性能优化

Java是一种广泛使用的编程语言,而集合是Java编程中不可或缺的一部分。在Java的集合框架中,HashMap是一个常用的数据结构,用于存储键值对。本文将深入介绍HashMap集合,从基础到高级用法,帮助您更好地理解和利用它。什么是HashMap?HashMap是Java集合框架中的一个类,它实现了Map接口,用于存

求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows

求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows大家好我是艾西,最近研究了下l4d2(求生之路2)这款游戏的搭建以及架设过程。今天就给喜欢l4d2这款游戏的小伙伴们分享下怎么搭建架设一个自己的服务器。毕竟自己当服主是热爱游戏每一个人的梦想,在自己的服务器里为所欲为在游戏里成就自己。(注:因PT原因本文

RocketMQ消息的分类

一、普通消息1消息发送分类Producer对于消息的发送方式也有多种选择,不同的方式会产生不同的系统效果。同步发送消息同步发送消息是指,Producer发出⼀条消息后,会在收到MQ返回的ACK之后才发下⼀条消息。该方式的消息可靠性最高,但消息发送效率太低。异步发送消息异步发送消息是指,Producer发出消息后无需等待

【Jetpack】Navigation 导航组件 ④ ( Fragment 跳转中使用 safe args 安全传递参数 )

文章目录一、页面跳转间的传统的数据传递方式1、传统的数据传递方式-Bundle传递数据1、Navigation组件中的Bundle数据传递2、传统数据传递实现步骤3、FragmentA完整代码示例4、FragmentB完整代码示例5、执行结果2、使用Bundle传递数据安全性差二、页面跳转间的传统的数据传递方式1、导入

C++--哈希表的实现及unorder_set和unorder_map的封装

1.什么是哈希表哈希表是一种数据结构,用来存放数据的,哈希表存放的数据是无序的,可以实现增删查,当时不能修改数据。可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。该

知乎万赞的:网络安全系统自学就业路线,建议收藏!

为什么说网络安全是新风口?近几年,随着移动互联网、大数据、云计算、人工智能等新一代信息技术的快速发展,围绕网络和数据的服务与应用呈现爆发式增长,丰富的应用场景下暴露出越来越多的网络安全风险和问题。但是,我国网络安全整体投入不高。网络安全建设方面,国内网络安全投入占信息化的投入比例大概不到百分之3%,而欧美等发达国家均在

Python 超高频常见字符操作【建议收藏】

文章目录前言1.字符串截取2.字符串拼接3.字符串搜索4.字符串格式化5.字符串替换6.字符串去除空格7.字符串截取8.字符串反转总结前言为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评

A Survey of Hallucination in “Large” Foundation Models

本文是LLM系列文章,针对《ASurveyofHallucinationin“Large”FoundationModels》的翻译。大型基础模型幻觉现象综述摘要1引言2大语言模型中的幻觉3大图像模型中的幻觉4大视频模型中的幻觉5大音频模型中的幻觉6幻觉不总是有害的:不同的视角7结论和未来方向7.1幻觉的自动评估7.2利

解密堆排序与TopK问题

📙作者简介:清水加冰,目前大二在读,正在学习C/C++、Python、操作系统、数据库等。📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。欢迎点赞👍收藏⭐留言📝如有错误还望各路大佬指正!✨每一次努力都是一种收获,每一次坚持都是一种成长✨目录前言1.堆排序1.1时间

Chrome扩展开发实战:网页图片抓取,打造专属自己的效率插件

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月csdn上海赛道top4。🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。🏆本文已收录于专栏:100个JavaScript的小应用。🎉欢迎👍点赞✍评论⭐收藏文章目录🚀一、背景🚀二

热文推荐