热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

1.2请求库urllib库的使用

1.urllib库介绍:(Python3)2.urllib发送请求与响应3.urllib高级用法—Handler(处理器)4.处理异常5.解析链接(使用较少)6.Robots协议1

1.urllib库介绍: (Python3)

2.urllib发送请求与响应

3.urllib高级用法 — Handler(处理器)

4.处理异常

5.解析链接(使用较少)

6.Robots协议


1.urllib库介绍: (Python3)

1 # urllib是python内置的HTTP请求库, 不需要额外安装即可使用, 它包含四个模块, 分别如下:
2
3 (1).request: request是最基本的HTTP请求模块, 可以用来模拟发送请求. 就像在浏览器中输入网址后按下回车是一样一样滴, 只需要个库方法传入URL以及额外的参数, 就可以模拟实现这个过程了.
4
5 (2).error: 异常处理模块, 如果出现请求错误, 我们可以捕捉这些异常, 然后进行重试或其他操作以保证程序不会意外终止.
6
7 (3).parse: 一个工具模块, 提供了许多URL处理方法, 比如拆分, 解析, 合并等.
8
9 (4).robotparse: 主要是用来识别网站的robots.txt文件, 然后判断哪些网站可以爬, 哪些网站不能爬, 其实这并不重要, 因为robots.txt只针对通用爬虫, 我们爬取数据一般会忽略该协议.

返回顶部


2.urllib发送请求与响应

urlopen是urllib.request提供的向服务器发送请求的的方法,同时它还带有处理授权验证(authenticaton)、重定向(redirection)、浏览器COOKIEs以及其他内容. 其语法与具体示例如下:

urllib.request.urlopen(url, data=None, [timeout,]*, cafile=None, cadefault=False, context=None)

(1).使用urlopen发送get请求

1 # 导入urllib库下的request模块
2 import urllib.request
3
4 # 使用urlopen向百度网页发送请求, response可以调用read方法, 读取内部的内容
5 response = urllib.request.urlopen('https://www.baidu.com')
6
7 # read方法获取的是二进制数据, 用utf-8进行解码就可以正常显示了
8 print(response.read().decode('utf-8'))

 

返回顶部

(2).使用urlopen发送post请求

1 # 在利用urlopen发送post请求前需要预先定义data数据作为方法的参数传递
2 import urllib.parse # parse定义data
3 import urllib.request
4
5 # urlencode可以吧字典转化为字符串
6 # 传入urlopen中的data需要是字节流, 需要使用bytes进行转换, 编码格式为utf-8
7 data = bytes(urllib.parse.urlencode({'word':'hello'}), encoding='utf8')
8 response = urllib.request.urlopen('http://httpbin.org/post', data=data) # 将data传入方法中
9 print(response.read())# 输出响应结果

 

返回顶部

(3).自定制Request对象

1 # 为什么要定制Request对象
2 上面的demo中我们通过URLopen发送了简单的请求,但传递的几个简单参数还不能构建一个完整的请求,由于一些服务器要求请求中需要携带headers中的一部分内容才能请求成功,没有这些表要的请求头很有可能会被识别为非法请求.所有需要定制Request对象.
3
4 # 定制Request对象与发送请求的步骤
5 -从urllib中导入request
6 -实例化一个Request对象,给该对象传入需要的参数
7 -利用urlopen方法将上面实例化定制后的request对象作为参数传入,向服务器发送请求
8
9 # Request类参数:
10 Request(url, data=None, headers={},origin_req_host=None,unverifiable=False, method=None)
11   - url:要请求的url
12   - data:发送post请求要向服务器提交的数据,可以使用urllib.parse.urlencode()编码,再bytes转为字节流类型
13   - headers是请求头信息,是一个字典,可以直接构造完成,也可以使用add_header方法动态添加
14   - origin_req_host:指的是请求方的host名称或者IP地址.
15   - unverifiable:表示这个请求是否是无法验证的,默认是False,意思就是说用户没有足够权限来选择接收这个请求的结果。例如,我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,这时unverifiable的值就是True`
16   - method:是一个字符串,用来指示请求使用的方法,比如GET、POST和PUT等。

 

返回顶部

1 # 导入request模块用于发送请求, parse模块用于处理data数据
2 from urllib import request, parse
3
4 # 定义要访问的url
5 url ='http://httpbin.org/post'
6
7 # 定义响应头, 其中User-Agent表示了客户单的信息
8 headers ={
9 'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
10 'Host':'httpbin.org'
11 }
12
13 # 构建需要提交到服务器的数据
14 dict ={
15 'name':'Germey'
16 }
17
18 # 处理data数据, 先将dic用parse.urlencode()转化为字符串
19 # 将字符串形式的dic通过bytes转化为字节流
20 data = bytes(parse.urlencode(dict), encoding='utf8')
21
22 # 实例化request对象, 传入url, data及headers参数, 由于提交数据data, 所以method为post请求
23 req = request.Request(url=url, data=data, headers=headers, method='POST')
24
25 # 使用urlopen向服务器发送请求, 获取响应赋值给response
26 response = request.urlopen(req)
27
28 # 输出响应结果
29 print(response.read().decode('utf-8'))

 

返回顶部

(4).响应对象

1 1.响应对象response的类型是<class&#39;http.client.HTTPResponse&#39;>,就是一个HTTPResponse类型的对象
2
3 2.响应对象常用方法:
4 read():返回网页内容
5 getheader(name):获取指定的响应头信息
6 getheader():获取所有响应头信息
7
8 3.响应对象包含的属性如下:
9 status:返回结果的状态码
10 reason:返回响应的异常信息

 

返回顶部


3.urllib高级用法 — Handler(处理器)

1 # Handler介绍:
2   通过上面的对request的封装后,已经构造了相对完善的request了,但还不够完善.一些网站的访问需要用户携带COOKIE,一些网站对ip的访问频率会有限制,当我们的请求量较大时,很有可能就被封ip了.所以我们还有对request进行进一步的处理.
3   Handler是一个强大的工具,可以理解为各种处理器,Handler有处理COOKIEs的,有处理ip代理的,还可处理登陆验证.
4   应用Handler不需知道一个BaseHandler类,它是所有其他Handler的父类,其内部封装了最基本的方法共子类调用.
5   现在要使用高级用法,就要引入opener. opener提供了open方法来请求服务器获取数据.

 

返回顶部

1 # opener的具体构建步骤如下:
2 0.构建一个对象,这个对象是构建处理器是需要传入的参数,不同的处理器有所不同,不如代理处理器的构建就不需要这一步.
3 1.实例化一个处理器,如COOKIEs处理器,代理处理器,验证处理器
4 2.利用build_opener方法构建opener

 

返回顶部

(1).验证

1 from urllib.request importHTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler, build_opener
2 from urllib.error importURLError
3 username &#61;&#39;username&#39;
4 password &#61;&#39;password&#39;
5 url &#61;&#39;http://localhost:5000/&#39;# 自己搭建的服务器, 用于测试
6
7 # 1.示例化一个HTTPPasswordMgrWithDefaultRealm对象, 该对象将作为验证处理器实例化的参数传入
8 p &#61;HTTPPasswordMgrWithDefaultRealm()
9
10 # 使用p的add_password方法将用户名密码添加进p对象
11 p.add_password(None, url, username, password)
12
13 # 2.实例化验证处理器对象, 并将p对象作为参数传进来
14 auth_handler &#61;HTTPBasicAuthHandler(p)
15
16 # 3.利用build_opener方法构建一个opener, 接下来就可以利用opener来请求服务器了
17 opener &#61; build_opener(auth_handler)
18 try:
19   result &#61; opener.open(url)
20   html &#61; result.read().decode(&#39;utf-8&#39;)
21   print(html)
22 exceptURLErroras e:# 处理异常
23   print(e.reason)

 

返回顶部

(2).代理

1 from urllib.error importURLError
2 from urllib.request importProxyHandler, build_opener
3
4 # 1.构建代理处理器, 注意:代理处理器的构建不需要像认证处理器那样先实例化一个对象作为参数
5 proxy_handler &#61;ProxyHandler({
6 &#39;http&#39;:&#39;http://127.0.0.1:9743&#39;,
7 &#39;https&#39;:&#39;https://127.0.0.1:9743&#39;
8 })
9
10 # 2.构建opener
11 opener &#61; build_opener(proxy_handler)
12
13 # 向服务器发起请求
14 try:
15   response &#61; opener.open(&#39;https://www.baidu.com&#39;)
16   print(response.read().decode(&#39;utf-8&#39;))
17 exceptURLErroras e:
18   print(e.reason)

 

返回顶部

(3).COOKIEs

1 import http.COOKIEjar, urllib.request
2
3 # 1.实例化一个COOKIE对象, 该对象将作为参数传入处理器中
4 COOKIE &#61; http.COOKIEjar.COOKIEJar()
5
6 # 2.构建一个COOKIE处理器, 将COOKIE对象出入
7 handler &#61; urllib.request.HTTPCOOKIEProcessor(COOKIE)
8
9 # 请求服务器获取数据
10 opener &#61; urllib.request.build_opener(handler)
11 response &#61; opener.open(&#39;http://www.baidu.com&#39;)
12
13 # 遍历COOKIE对象, 查看请求时携带的COOKIE都有哪些内容, 下面代码不是请求需要的代码, 是为了给大家看看COOKIE是个什么鬼
14 for item in COOKIE:
15   print(item.name&#43;"&#61;"&#43;item.value)

 

返回顶部


4.处理异常

1 # error简介
2 urllib的error模块定义了有request模块产生的异常,其中包含了URLError和HTTPError,其实HTTPError是URLError的子类
3
4 1.URLError
5   URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,有request,模块产生的异常都可以通过捕捉这个类来处理.
6 from urllib import request, error
7 try:
8   # 下面网址是我博客网址改动的, 根本不存在这个页面, 所以请求会抛出异常
9   response &#61; request.urlopen(&#39;https://www.cnblogs.com/Jermy/p/1082330800000000.html&#39;)
10 except error.URLErroras e:
11   print(e.reason)
12
13 2.HTTPError
14   HTTPError是URLError的子类&#xff0c;专门用来处理HTTP请求错误&#xff0c;比如认证请求失败等。它有如下3个属性。
15     - code&#xff1a;返回HTTP状态码&#xff0c;比如404表示网页不存在&#xff0c;500表示服务器内部错误等。
16     - reason&#xff1a;同父类一样&#xff0c;用于返回错误的原因。
17     - headers&#xff1a;返回请求头。
18 from urllib import request, error
19 try:
20   # 下面网址是我博客网址改动的, 根本不存在这个页面, 所以请求会抛出异常
21   response &#61; request.urlopen(&#39;https://www.cnblogs.com/Jermy/p/1082330800000000.html&#39;)
22 except error.HTTPErroras e:
23   print(e.reason, e.code, e.headers)

 

返回顶部

1 小贴士:如果你足够细心会发下我上面使用的是同样的url,却使用了不同的异常捕捉,同样都能捕捉到NotFound这个异常.那到底什么时候用URLError,什么时候用HTTPError呢?迷茫......
2 没关系的,因为HTTPError是URLError的子类,也就是HTTPError会继承URLError,所以URLError能捕捉的异常,HTTPError一样能步骤,所以任性一点直接用HTTPError好了,
 而且它步骤到异常能够提供的信息更多,岂不是更好,然并卵.个人感觉用处不大,注意不是没用,我只是说用处不大而已.

 

返回顶部


5.解析链接(使用较少)

1 # 1.urlencode():使用较多,它在构造GET请求参数的时候非常有用
2
3 from urllib.parse import urlencode
4
5 # 构建请求参数
6 params&#61;{
7 &#39;wd&#39;:&#39;爬虫&#39;
8 }
9 base_url &#61;&#39;http://www.baidu.com?&#39;
10 url &#61; base_url &#43; urlencode(params)
11 print(url)
12 # 输出结果为:
13 http://www.baidu.com?wd&#61;%E7%88%AC%E8%99%AB

 

返回顶部

1 # 其他方法:(不常用可只做了解)
2 2. urlparse():该方法可以实现URL的识别和分段
3 3. urlunparse():有了urlparse()&#xff0c;相应地就有了它的对立方法urlunparse()。它接受的参数是一个可迭代对象&#xff0c;但是它的长度必须是6&#xff0c;否则会抛出参数数量不足或者过多的问题
4 4. urlsplit():该方法和urlparse()方法非常相似&#xff0c;不过它不再单独解析params这一部分&#xff0c;只返回5个结果
5 5. urlunsplit():与urlunparse()类似&#xff0c;它也是将链接各个部分组合成完整链接的方法&#xff0c;传入的参数也是一个可迭代对象&#xff0c;例如列表、元组等&#xff0c;唯一的区别是长度必须为5
6 6. urljoin():提供一个base_url&#xff08;基础链接&#xff09;作为第一个参数&#xff0c;将新的链接作为第二个参数&#xff0c;该方法会分析base_url的scheme、netloc和path这3个内容并对新链接缺失的部分进行补充&#xff0c;最后返回结果
7 7. parse_qs():有一串GET请求参数&#xff0c;利用parse_qs()方法&#xff0c;就可以将它转回字典
8 8. parse_qsl():它用于将参数转化为元组组成的列表
9 9. quote():该方法可以将内容转化为URL编码的格式. URL中带有中文参数时&#xff0c;有时可能会导致乱码的问题&#xff0c;此时用这个方法可以将中文字符转化为URL编码
10 10. unquote():有了quote()方法&#xff0c;当然还有unquote()方法&#xff0c;它可以进行URL解码

 

返回顶部


6.Robots协议

1 Robots协议也称作爬虫协议、机器人协议&#xff0c;它的全名叫作网络爬虫排除标准&#xff08;RobotsExclusionProtocol&#xff09;&#xff0c;用来告诉爬虫和搜索引擎哪些页面可以抓取&#xff0c;哪些不可以抓取。它通常是一个叫作robots.txt的文本文件&#xff0c;一般放在网站的根目录下。
2 当搜索爬虫访问一个站点时&#xff0c;它首先会检查这个站点根目录下是否存在robots.txt文件&#xff0c;如果存在&#xff0c;搜索爬虫会根据其中定义的爬取范围来爬取。如果没有找到这个文件&#xff0c;搜索爬虫便会访问所有可直接访问的页面。
3 小贴士:甭管他,爬你的就好,,,就怕你技术太菜,爬不到人家的数据..........

 

返回顶部

转:https://www.cnblogs.com/Jermy/articles/10940705.html



推荐阅读
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有