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实现从web抓取文档的方法
Sep 26 Python
python批量生成本地ip地址的方法
Mar 23 Python
Python的Django框架中settings文件的部署建议
May 30 Python
Python中常见的数据类型小结
Aug 29 Python
python 遍历目录(包括子目录)下所有文件的实例
Jul 11 Python
win7 x64系统中安装Scrapy的方法
Nov 18 Python
简单了解python反射机制的一些知识
Jul 13 Python
python的mysql数据库建立表与插入数据操作示例
Sep 30 Python
Django中使用haystack+whoosh实现搜索功能
Oct 08 Python
Spring Cloud Feign高级应用实例详解
Dec 10 Python
jupyter notebook插入本地图片的实现
Apr 13 Python
Python包和模块的分发详细介绍
Jun 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
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
基于PHP遍历数组的方法汇总分析
2013/06/08 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
浅谈Angularjs link和compile的使用区别
2016/10/21 Javascript
vue项目中用cdn优化的方法
2018/01/03 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
2019/06/10 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
python实现挑选出来100以内的质数
2015/03/24 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
python django model联合主键的例子
2019/08/06 Python
Python 中pandas索引切片读取数据缺失数据处理问题
2019/10/09 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
python轮询机制控制led实例
2020/05/03 Python
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
全球第二大家装零售商:Lowe’s
2018/01/13 全球购物
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
Michael Kors澳大利亚官网:世界知名的奢侈饰品和成衣设计师
2020/02/13 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
领导调研接待方案
2014/02/27 职场文书
节约能源标语
2014/06/17 职场文书
机关作风整顿个人整改措施2014
2014/09/17 职场文书
2014年市场部工作总结
2014/11/25 职场文书
2015年办公室文员工作总结
2015/04/24 职场文书
Mysql官方性能测试工具mysqlslap的使用简介
2021/05/21 MySQL
Python基础之条件语句详解
2021/06/16 Python
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python