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进阶教程之文本文件的读取和写入
Aug 29 Python
Python open()文件处理使用介绍
Nov 30 Python
Python实现将目录中TXT合并成一个大TXT文件的方法
Jul 15 Python
Python中shutil模块的常用文件操作函数用法示例
Jul 05 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
Flask之flask-session的具体使用
Jul 26 Python
python 画函数曲线示例
Dec 04 Python
使用Python第三方库pygame写个贪吃蛇小游戏
Mar 06 Python
使用darknet框架的imagenet数据分类预训练操作
Jul 07 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
Sep 26 Python
python logging模块的使用详解
Oct 23 Python
Python使用openpyxl复制整张sheet
Mar 24 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 MYSQL中插入当前时间
2008/04/06 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
Yii2分页的使用及其扩展方法详解
2016/05/23 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
Yii2框架自定义验证规则操作示例
2019/02/08 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
Prototype Template对象 学习
2009/07/19 Javascript
JavaScript 变量基础知识
2009/11/07 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
js获取RadioButtonList的Value/Text及选中值等信息实现代码
2013/03/05 Javascript
JS中Date日期函数中的参数使用介绍
2014/01/02 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
angular十大常见问题
2017/03/07 Javascript
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
C++如何引用一个已经定义过的全局变量
2014/08/25 面试题
小学生成长感言
2014/01/30 职场文书
产品质量保证书
2014/04/29 职场文书
陈胜吴广起义口号
2014/06/20 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
刑事附带民事代理词
2015/05/25 职场文书
开学典礼致辞
2015/07/29 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
详细介绍python操作RabbitMq
2022/04/12 Python