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 BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
Python 性能优化技巧总结
Nov 01 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 Python
mac系统下Redis安装和使用步骤详解
Jul 09 Python
Python使用Slider组件实现调整曲线参数功能示例
Sep 06 Python
python的pyecharts绘制各种图表详细(附代码)
Nov 11 Python
python多线程使用方法实例详解
Dec 30 Python
python pprint模块中print()和pprint()两者的区别
Feb 10 Python
Django contrib auth authenticate函数源码解析
Nov 12 Python
python爬虫多次请求超时的几种重试方法(6种)
Dec 01 Python
用Python制作音乐海报
Jan 26 Python
Python连续赋值需要注意的一些问题
Jun 03 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
使用 php4 加速 web 传输
2006/10/09 PHP
基于php socket(fsockopen)的应用实例分析
2013/06/02 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
js使用eval解析json(js中使用json)
2014/01/17 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
关于Function中的bind()示例详解
2016/12/02 Javascript
微信公众平台开发教程(五)详解自定义菜单
2016/12/02 Javascript
jquery横向纵向鼠标滚轮全屏切换
2017/02/27 Javascript
Vue实现选择城市功能
2017/05/27 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
Vue实现滑动拼图验证码功能
2019/09/15 Javascript
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
浅谈Python使用Bottle来提供一个简单的web服务
2017/12/27 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
django从请求到响应的过程深入讲解
2018/08/01 Python
Python绘制并保存指定大小图像的方法
2019/01/10 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
python实现与redis交互操作详解
2020/04/21 Python
Python Celery异步任务队列使用方法解析
2020/08/10 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
法国奢华女性时尚配饰网上商店:Monnier Frères
2016/08/27 全球购物
美国婴儿用品店:Babies”R”Us
2017/10/12 全球购物
在阿尔卑斯山或希腊度过快乐假期:Alpine Elements
2019/12/28 全球购物
高中毕业自我鉴定
2013/12/22 职场文书
旅行社各个岗位职责
2014/03/15 职场文书
小学捐书活动总结
2014/07/05 职场文书
车辆年审委托书范本
2014/09/18 职场文书
军训后的感想
2015/08/07 职场文书
golang 实现两个结构体复制字段
2021/04/28 Golang