python中urllib.request和requests的使用及区别详解


Posted in Python onMay 05, 2020

urllib.request

我们都知道,urlopen()方法能发起最基本对的请求发起,但仅仅这些在我们的实际应用中一般都是不够的,可能我们需要加入headers之类的参数,那需要用功能更为强大的Request类来构建了

在不需要任何其他参数配置的时候,可直接通过urlopen()方法来发起一个简单的web请求

发起一个简单的请求

import urllib.request
url='https://www.douban.com'
webPage=urllib.request.urlopen(url)
print(webPage)
data=webPage.read()
print(data)
print(data.decode('utf-8'))

urlopen()方法返回的是一个http.client.HTTPResponse对象,需要通过read()方法做进一步的处理。一般使用read()后,我们需要用decode()进行解码,通常为utf-8,经过这些步骤后,最终才获取到我们想要的网页。

添加Headers信息

import urllib.request
url='https://www.douban.com'
headers = {
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
 }
response=urllib.request.Request(url=url,headers=headers)
webPage=urllib.request.urlopen(response)
print(webPage.read().decode('utf-8'))

使用Request类返回的又是一个urllib.request.Request对象了。

通常我们爬取网页,在构造http请求的时候,都需要加上一些额外信息,什么Useragent,cookie等之类的信息,或者添加代理服务器。往往这些都是一些必要的反爬机制

requests

通常而言,在我们使用python爬虫时,更建议用requests库,因为requests比urllib更为便捷,requests可以直接构造get,post请求并发起,而urllib.request只能先构造get,post请求,再发起。

import requests
url='https://www.douban.com'
headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
}
get_response = requests.get(url,headers=headers,params=None)
post_response=requests.post(url,headers=headers,data=None,json=None)
print(post_response)
print(get_response.text)
print(get_response.content)
print(get_response.json)

get_response.text得到的是str数据类型。

get_response.content得到的是Bytes类型,需要进行解码。作用和get_response.text类似。

get_response.json得到的是json数据。

总而言之,requests是对urllib的进一步封装,因此在使用上显得更加的便捷,建议小伙伴们在实际应用当中尽量使用requests。

补充知识:python中urllib.request.Request()与urllib.request.urlopen()区别

蟒蛇中urllib.request.Request()与urllib.request.urlopen()的区别:

相对于urllib.request.urlopen()来说urllib.request.Request是进一步的包装请求,下面是请求类的源码示例:

class Request:
  
  # 主要看这块,构造函数中指明了Request进一步包装请求中可以传递的参数有(url,data,headers,            
  # origin_req_host,unverifiable,method)
 
  def __init__(self, url, data=None, headers={},
         origin_req_host=None, unverifiable=False,
         method=None):
    self.full_url = url
    self.headers = {}
    self.unredirected_hdrs = {}
    self._data = None
    self.data = data
    self._tunnel_host = None
    for key, value in headers.items():
      self.add_header(key, value)
    if origin_req_host is None:
      origin_req_host = request_host(self)
    self.origin_req_host = origin_req_host
    self.unverifiable = unverifiable
    if method:
      self.method = method
  pass

我们可以这样使用(以下是模拟有道字典翻译发送的请求):

# 请求地址url
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
 
# 请求头
request_headers = {
  'Host':'fanyi.youdao.com',
  "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36",
}
 
# 发送给服务器的表单
form_data = {
  "i": word,
  "from": "AUTO",
  "to": "AUTO",
  "smartresult": "dict",
  "doctype": "json",
  "version": "2.1",
  "keyfrom": "fanyi.web",
  "action": "FY_BY_REALTIME",
  "typoResult": "false"
}
 
# POST发送的data必须为bytes或bytes类型的可迭代对象,不能是字符串
form_data = urllib.parse.urlencode(form_data).encode()
 
# 构造请求对象Request
req = urllib.request.Request(url, data=form_data, headers=request_headers)
 
# 发起请求
response = urllib.request.urlopen(req)
data = response.read().decode()
print(data)

所以,总的来说,如果我们在获取请求对象时,不需要过多的参数传递,我么可以直接选择urllib.request.urlopen();如果需要进一步的包装请求,则需要用urllib.request里。的urlopen()进行包装处理。

以上这篇python中urllib.request和requests的使用及区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python ZipFile模块详解
Nov 01 Python
python实用代码片段收集贴
Jun 03 Python
python开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 Python
Django中的CBV和FBV示例介绍
Feb 25 Python
Python内存读写操作示例
Jul 18 Python
python 用下标截取字符串的实例
Dec 25 Python
python 获取毫秒数,计算调用时长的方法
Feb 20 Python
使用python制作一个为hex文件增加版本号的脚本实例
Jun 12 Python
Python matplotlib学习笔记之坐标轴范围
Jun 28 Python
Django logging配置及使用详解
Jul 23 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
Oct 30 Python
只用50行Python代码爬取网络美女高清图片
Jun 02 Python
python requests包的request()函数中的参数-params和data的区别介绍
May 05 #Python
关于Python解包知识点总结
May 05 #Python
python 使用事件对象asyncio.Event来同步协程的操作
May 04 #Python
在python里使用await关键字来等另外一个协程的实例
May 04 #Python
python 异步async库的使用说明
May 04 #Python
Python插件机制实现详解
May 04 #Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 #Python
You might like
php select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
用PHP为SHOPEX增加日志功能代码
2010/07/02 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
PHP的PDO错误与错误处理
2019/01/27 PHP
javascript void(0)的妙用
2009/10/21 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
2017/01/08 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
vue-quill-editor富文本编辑器简单使用方法
2018/09/21 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
layer弹出层扩展主题的方法
2019/09/11 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
2020/10/28 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
2021/02/23 Vue.js
使用Python的Supervisor进行进程监控以及自动启动
2014/05/29 Python
Python获取任意xml节点值的方法
2015/05/05 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
python pickle存储、读取大数据量列表、字典数据的方法
2019/07/07 Python
python3.7简单的爬虫实例详解
2019/07/08 Python
Django CSRF认证的几种解决方案
2020/03/03 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
化工专业个人的求职信范文
2013/11/28 职场文书
文化宣传方案
2014/03/13 职场文书
文明城市标语
2014/06/16 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
中学生运动会广播稿
2015/08/19 职场文书