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中getaddrinfo()基本用法实例分析
Jun 28 Python
全面解析Python的While循环语句的使用方法
Oct 13 Python
关于numpy中np.nonzero()函数用法的详解
Feb 07 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
Jan 16 Python
解决Tensorflow使用pip安装后没有model目录的问题
Jun 13 Python
python进阶之多线程对同一个全局变量的处理方法
Nov 09 Python
对Python中创建进程的两种方式以及进程池详解
Jan 14 Python
python 修改本地网络配置的方法
Aug 14 Python
Python如何定义有默认参数的函数
Aug 10 Python
python中最小二乘法详细讲解
Feb 19 Python
python实现b站直播自动发送弹幕功能
Feb 20 Python
Python实现智慧校园自动评教全新版
Jun 18 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 中英文语言转换类
2011/09/07 PHP
PHP无法访问远程mysql的问题分析及解决
2013/05/16 PHP
PHP中Session引起的脚本阻塞问题解决办法
2014/04/08 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
JQ实现新浪游戏首页幻灯片
2015/07/29 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
详解Vue.js入门环境搭建
2017/03/17 Javascript
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
下载糗事百科的内容_python版
2008/12/07 Python
Python中给List添加元素的4种方法分享
2014/11/28 Python
OpenCV实现人脸识别
2017/04/07 Python
python 对key为时间的dict排序方法
2018/10/17 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
python绘制玫瑰的实现代码
2020/03/02 Python
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
zooplus德国:便宜地订购动物用品、动物饲料、动物食品
2020/05/06 全球购物
税务专业毕业生自荐信
2013/11/10 职场文书
财务出纳员岗位职责
2013/11/26 职场文书
安全检查管理制度
2014/02/02 职场文书
大学生求职工作的自我评价
2014/02/13 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers
详解MySQL的主键查询为什么这么快
2022/04/03 MySQL
python APScheduler执行定时任务介绍
2022/04/19 Python
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers