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 相关文章推荐
Python2/3中urllib库的一些常见用法
Dec 19 Python
python编程使用selenium模拟登陆淘宝实例代码
Jan 25 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
Python爬虫文件下载图文教程
Dec 23 Python
Python TestCase中的断言方法介绍
May 02 Python
set在python里的含义和用法
Jun 24 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
Nov 08 Python
Python3爬虫发送请求的知识点实例
Jul 30 Python
python opencv实现简易画图板
Aug 27 Python
python 实现百度网盘非会员上传超过500个文件的方法
Jan 07 Python
python字符串的多行输出的实例详解
Jun 08 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
搜索引擎技术核心揭密
2006/10/09 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
php中mysql操作buffer用法详解
2015/03/19 PHP
javascript new后的constructor属性
2010/08/05 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
jQuery插件scroll实现无缝滚动效果
2015/04/27 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
javascript回到顶部特效
2016/07/30 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
2016/08/25 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
深入研究React中setState源码
2017/11/17 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
mpvue 单文件页面配置详解
2018/12/02 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
使用preload预加载页面资源时注意事项
2020/02/03 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
详解在Python程序中使用Cookie的教程
2015/04/30 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
python的pytest框架之命令行参数详解(下)
2019/06/27 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
python代码中怎么换行
2020/06/17 Python
css图标制作教程制作云图标
2014/01/19 HTML / CSS
我的画教学反思
2014/04/28 职场文书
劳动竞赛口号
2014/06/16 职场文书
某集团股份有限公司委托书样本
2014/09/24 职场文书
欢迎家长标语
2014/10/08 职场文书
2014年党小组工作总结
2014/12/20 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
图文详解nginx日志切割的实现
2022/01/18 Servers
Python与C++中梯度方向直方图的实现
2022/03/17 Python