python 如何用urllib与服务端交互(发送和接收数据)


Posted in Python onMarch 04, 2021

urllib是Python3中内置的HTTP请求库,不需要单独安装,官方文档链接如下:https://docs.python.org/3/library/urllib.html从官方文档可以看出,urllib包含4个模块,如图所示。

python 如何用urllib与服务端交互(发送和接收数据)

这4个模块的功能描述如下:

  • request:最基本的HTTP请求模块,可以用来发送HTTP请求,并接收服务端的响应数据。这个过程就像在浏览器地址栏输入URL,然后按Enter键一样。
  • error:异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后根据实际情况,或者进行重试,或者直接忽略,或进行其他操作。
  • parse:工具模块,提供了很多处理URL的API,如拆分、解析、合并等。
  • robotparser:主要用来识别网站的robots.txt文件,然后判断哪些网站可以抓取,哪些网站不可以抓取。

本文主要介绍如何通过urllib发送HTTP GET请求和HTTP POST请求,并获取相应数据。

1. 用urlopen函数发送HTTP GET请求

urllib最基本的一个功能就是向服务端发送HTTP请求,然后接收服务端返回的响应数据。这个功能只需要通过urlopen函数就可以搞定。例如,下面的代码向百度发送HTTP GET请求,然后输出服务端的响应结果。

import urllib.request 
response=urllib.request.urlopen('https://baidu.com') 
# 将服务端的响应数据用utf-8解码 
print(response.read().decode('utf-8')) 

运行结果如图 所示。

python 如何用urllib与服务端交互(发送和接收数据)

我们可以看到,使用urllib与服务端交互是非常容易的,除了import语句外,真正与业务有关的代码只有2行,就完成了整个与服务端交互的过程。其实这个过程已经完成了爬虫的第一步,就是从服务端获取HTML代码,然后就可以利用各种分析库对HTML代码进行解析,提取出我们感兴趣的URL、文本、图像等。其实urlopen函数返回的是一个对象,而read是这个对象的一个方法,可以利用type方法输出这个对象的类型,当我们知道了对象类型后,就可以很容易知道这个对象中有哪些API,然后调用它们。

import urllib.request 
response=urllib.request.urlopen('https://baidu.com') 
print(type(response)) 

这段代码会输出如下的结果:

<class 'http.client.HTTPResponse'> 

现在我们了解到,urlopen函数返回的是HTTPResponse类型的对象,主要包含read、getheader、getheaders等方法,以及msg、version、status、debuglevel、closed等属性。下面是一个实际的案例,用来演示了HTTPResponse对象中主要的方法和属性的用法。

import urllib.request 
# 向京东商城发送HTTP GET请求,urlopen函数即可以使用http,也可以使用https 
response=urllib.request.urlopen('https://www.jd.com') 
# 输出urlopen函数返回值的数据类型 
print('response的类型:',type(response)) 
# 输出响应状态码、响应消息和HTTP版本 
print('status:',response.status,' msg:',response.msg,' version:', response.version) 
# 输出所有的响应头信息 
print('headers:',response.getheaders()) 
# 输出名为Content-Type的响应头信息 
print('headers.Content-Type',response.getheader('Content-Type')) 
# 输出京东商城首页所有的HTML代码(经过utf-8解码) 
print(response.read().decode('utf-8')) 

运行结果如图所示。

python 如何用urllib与服务端交互(发送和接收数据)

2. 用urlopen函数发送HTTP POST请求

urlopen函数默认情况下发送的是HTTP GET请求,如果要发送HTTP POST请求,需要使用data命名参数,该参数是bytes类型,需要用bytes类将字符串形式的数据转换为bytes类型。下面的例子

下面的例子向http://httpbin.org/post发送HTTP POST请求,并输出返回结果。

import urllib.request 
# 将表单数据转换为bytes类型,用utf-8编码 
data=bytes(urllib.parse.urlencode({'name':'Bill','age':30}),encoding='utf-8') 
# 提交HTTP POST请求 
response=urllib.request.urlopen('http://httpbin.org/post',data=data) 
# 输出响应数据 
print(response.read().decode('utf-8')) 

这段代码中一开始提供了一个字典形式的表单数据,然后使用urlencode方法将字典类型的表单转换为字符串形式的表单,接下来将字符串形式的表单按utf-8编码转换为bytes类型,这就是要传给urlopen函数的data命名参数的值,要注意,一旦指定了data命名参数,urlopen函数就会向服务端提交HTTP POST请求,这里并不需要显式指定要提交的是POST请求。

本例将HTTP POST请求提交给了http://httpbin.org/post,这是一个用于测试HTTP POST请求的网址,如果请求成功,服务端会将HTTP POST请求信息原封不动地返回给客户端。运行结果如图所示。

python 如何用urllib与服务端交互(发送和接收数据)

以上就是python 如何用urllib与服务端交互(发送和接收数据)的详细内容,更多关于python 用urllib与服务端交互的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python模块学习 re 正则表达式
May 19 Python
Python写的贪吃蛇游戏例子
Jun 16 Python
详解Python中__str__和__repr__方法的区别
Apr 17 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
Jun 30 Python
python3实现抓取网页资源的 N 种方法
May 02 Python
python实现简单登陆流程的方法
Apr 22 Python
python安装requests库的实例代码
Jun 25 Python
python 默认参数相关知识详解
Sep 18 Python
Python面向对象特殊属性及方法解析
Sep 16 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 Python
python压包的概念及实例详解
Feb 17 Python
python 爬取豆瓣网页的示例
Apr 13 Python
python 求两个向量的顺时针夹角操作
Mar 04 #Python
python 制作磁力搜索工具
Mar 04 #Python
python抢购软件/插件/脚本附完整源码
Mar 04 #Python
Python 求向量的余弦值操作
Mar 04 #Python
django使用多个数据库的方法实例
Mar 04 #Python
Python使用paramiko连接远程服务器执行Shell命令的实现
Mar 04 #Python
Python 调用C++封装的进一步探索交流
Mar 04 #Python
You might like
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
小文件php+SQLite存储方案
2010/09/04 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
2013/11/26 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
js document.write()使用介绍
2014/02/21 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
ECMAScript6函数默认参数
2015/06/12 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
Jquery获取当前城市的天气信息
2016/08/05 Javascript
JS三目运算(三元运算)方法详解
2017/03/01 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
浅谈Ant Design Pro 菜单自定义 icon
2020/11/17 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
2020/11/19 Vue.js
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
python使用SMTP发送qq或sina邮件
2017/10/21 Python
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
Python实现注册、登录小程序功能
2018/09/21 Python
python pygame实现五子棋小游戏
2020/10/26 Python
Django values()和value_list()的使用
2020/03/31 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
Chantelle仙黛尔内衣美国官网:法国第一品牌内衣
2018/07/26 全球购物
学习“七一”讲话精神体会
2014/07/08 职场文书
部队反四风对照检查材料
2014/09/26 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
幼儿园教师安全责任书
2015/05/08 职场文书
2015少先队大队辅导员工作总结
2015/07/24 职场文书
2016中秋节问候语
2015/11/11 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
Tomcat用户管理的优化配置详解
2022/03/31 Servers