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进行基础的函数式编程的教程
Mar 31 Python
详细介绍Ruby中的正则表达式
Apr 10 Python
Python字符串格式化输出方法分析
Apr 13 Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
django query模块
Apr 20 Python
Python之Numpy的超实用基础详细教程
Oct 23 Python
在TensorFlow中屏蔽warning的方式
Feb 04 Python
Selenium之模拟登录铁路12306的示例代码
Jul 31 Python
利用python调用摄像头的实例分析
Jun 07 Python
Python并发编程实例教程之线程的玩法
Jun 20 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中extract()函数的定义和用法
2012/08/17 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
JS实现网页Div层Clone拖拽效果
2015/09/26 Javascript
JS常用加密编码与算法实例总结
2016/12/22 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
2017/01/24 Javascript
JavaScript通过filereader接口读取文件
2017/05/10 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
详解Angular2 之 结构型指令
2017/06/21 Javascript
JS实现前端页面的搜索功能
2018/06/12 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
Python的词法分析与语法分析
2013/05/18 Python
python字符串编码识别模块chardet简单应用
2015/06/15 Python
python 多线程实现检测服务器在线情况
2015/11/25 Python
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
CSS3五个技巧给你的网站带来出色的效果
2009/04/02 HTML / CSS
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
银行柜员求职自荐书
2014/06/18 职场文书
诚信考试标语
2014/06/24 职场文书
2014年教务处工作总结
2014/12/03 职场文书
python实现简单的井字棋
2021/05/26 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python