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中的strftime()方法的使用
May 22 Python
Python素数检测实例分析
Jun 15 Python
python在不同层级目录import模块的方法
Jan 31 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
Feb 16 Python
Python 专题二 条件语句和循环语句的基础知识
Mar 19 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
Nov 23 Python
学习Python3 Dlib19.7进行人脸面部识别
Jan 24 Python
Python判断telnet通不通的实例
Jan 26 Python
自定义Django默认的sitemap站点地图样式
Mar 04 Python
python 实现两个线程交替执行
May 02 Python
利用PyTorch实现VGG16教程
Jun 24 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
Dec 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实现等比压缩图片大小
2016/03/04 PHP
JavaScript 构造函数 面相对象学习必备知识
2010/06/09 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
ExtJs使用总结(非常详细)
2012/03/22 Javascript
Js nodeType 属性全面解析
2013/11/14 Javascript
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
详解webpack进阶之插件篇
2017/07/06 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
微信小程序实现左滑动删除效果
2020/03/30 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python中os操作文件及文件路径实例汇总
2015/01/15 Python
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
python添加模块搜索路径方法
2017/09/11 Python
python连接数据库的方法
2017/10/19 Python
Python对象属性自动更新操作示例
2018/06/15 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
Python操作json的方法实例分析
2018/12/06 Python
关于python下cv.waitKey无响应的原因及解决方法
2019/01/10 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
学校介绍信范文
2014/01/14 职场文书
《木笛》教学反思
2014/03/01 职场文书
关工委先进个人事迹材料
2014/05/23 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
校车安全管理责任书
2015/05/11 职场文书
2015年党小组工作总结
2015/05/26 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书