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语言描述机器学习之Logistic回归算法
Dec 21 Python
python调用OpenCV实现人脸识别功能
May 25 Python
对Python正则匹配IP、Url、Mail的方法详解
Dec 25 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
Jan 26 Python
python学习--使用QQ邮箱发送邮件代码实例
Apr 16 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 Python
Python numpy数组转置与轴变换
Nov 15 Python
Django与pyecharts结合的实例代码
May 13 Python
python如何进入交互模式
Jul 06 Python
Python过滤序列元素的方法
Jul 31 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 Python
python-jwt用户认证食用教学的实现方法
Jan 19 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支持时的替代方案
2006/10/09 PHP
PHP Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
PHP房贷计算器实例代码,等额本息,等额本金
2017/04/01 PHP
php图片裁剪函数
2018/10/31 PHP
php xhprof使用实例详解
2019/04/15 PHP
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
JQuery实现列表中复选框全选反选功能封装(推荐)
2016/11/24 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
JS实现合并json对象的方法
2017/10/10 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
2018/07/19 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
js的对象与函数详解
2019/01/21 Javascript
vue自动路由-单页面项目(非build时构建)
2019/04/30 Javascript
vue data恢复初始化数据的实现方法
2019/10/31 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
Python装饰器模式定义与用法分析
2018/08/06 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
使用CSS3制作倾斜导航条和毛玻璃效果
2017/09/12 HTML / CSS
女装和独特珠宝:Sundance Catalog
2018/09/19 全球购物
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
几个Shell Script面试题
2014/04/18 面试题
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
运动会广播稿200米
2014/01/27 职场文书
初一学生评语大全
2014/04/24 职场文书
超市客服工作职责
2014/06/11 职场文书
2014年感恩节活动策划方案
2014/10/06 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
2014年学生会干事工作总结
2014/11/07 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
《雪域豹影》读后感:父爱的伟大
2019/12/23 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python