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 相关文章推荐
windows下安装python paramiko模块的代码
Feb 10 Python
python脚本实现数据导出excel格式的简单方法(推荐)
Dec 30 Python
Python网络编程之TCP套接字简单用法示例
Apr 09 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
python 计算平均平方误差(MSE)的实例
Jun 29 Python
python实现函数极小值
Jul 10 Python
python字符串替换re.sub()方法解析
Sep 18 Python
python脚本调用iftop 统计业务应用流量的思路详解
Oct 11 Python
python字典排序的方法
Oct 12 Python
django实现将修改好的新模型写入数据库
Mar 31 Python
Pytorch实验常用代码段汇总
Nov 19 Python
python geopandas读取、创建shapefile文件的方法
Jun 29 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连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
利用javascript解决图片缩放及其优化的代码
2012/05/23 Javascript
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
探寻Javascript执行效率问题
2014/11/12 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
angular 实现同步验证器跨字段验证的方法
2019/04/11 Javascript
微信小程序自定义弹出层效果
2020/05/26 Javascript
python格式化字符串实例总结
2014/09/28 Python
python获取Linux下文件版本信息、公司名和产品名的方法
2014/10/05 Python
分析python动态规划的递归、非递归实现
2018/03/04 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
2018/05/11 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
python 线性回归分析模型检验标准--拟合优度详解
2020/02/24 Python
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
人力资源经理自我评价
2014/01/04 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
委托书的样本
2015/01/28 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
Python实现生成bmp图像的方法
2021/06/13 Python
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python