在 Python 中建立 Web 连接的这两种方法之间有什么实际区别?

2024-03-03

我注意到有几种方法可以启动 http 连接以进行网络抓取。我不确定某些是否是更新的编码方式,或者它们是否只是具有不同优点和缺点的不同模块。更具体地说,我试图了解以下两种方法之间有什么区别,您会推荐什么?

1)使用urllib3:

http = PoolManager()
r = http.urlopen('GET', url, preload_content=False)
soup = BeautifulSoup(r, "html.parser")

2)使用请求

html = requests.get(url).content
soup = BeautifulSoup(html, "html5lib")

除了需要导入不同模块这一简单事实之外,是什么使这两个选项与众不同?


在引擎盖下,requests uses urllib3完成大部分 http 繁重工作。如果使用得当,它应该基本相同,除非您需要更高级的配置。

除了,在你的特定示例中,它们是not相同:

在 urllib3 示例中,您重复使用连接,而在 requests 示例中,您没有重复使用连接。您可以通过以下方法判断:

>>> import requests
>>> requests.packages.urllib3.add_stderr_logger()
2016-04-29 11:43:42,086 DEBUG Added a stderr logging handler to logger: requests.packages.urllib3
>>> requests.get('https://www.google.com/')
2016-04-29 11:45:59,043 INFO Starting new HTTPS connection (1): www.google.com
2016-04-29 11:45:59,158 DEBUG "GET / HTTP/1.1" 200 None
>>> requests.get('https://www.google.com/')
2016-04-29 11:45:59,815 INFO Starting new HTTPS connection (1): www.google.com
2016-04-29 11:45:59,925 DEBUG "GET / HTTP/1.1" 200 None

要像在 urllib3 PoolManager 中那样开始重用连接,您需要发出请求session.

>>> session = requests.session()
>>> session.get('https://www.google.com/')
2016-04-29 11:46:49,649 INFO Starting new HTTPS connection (1): www.google.com
2016-04-29 11:46:49,771 DEBUG "GET / HTTP/1.1" 200 None
>>> session.get('https://www.google.com/')
2016-04-29 11:46:50,548 DEBUG "GET / HTTP/1.1" 200 None

Now这相当于你正在做的事情http = PoolManager()。另请注意:urllib3 是一个较低级别的更显式库,因此您显式创建一个池并且显式需要指定您的 SSL 证书位置 https://urllib3.readthedocs.io/en/latest/security.html#using-certifi-with-urllib3, 例如。这是一两行额外的工作,但如果您正在寻找的话,也需要更多的控制。

总而言之,比较就变成了:

1)使用urllib3:

import urllib3, certifi
http = urllib3.PoolManager(ca_certs=certifi.where())
html = http.request('GET', url).read()
soup = BeautifulSoup(html, "html5lib")

2)使用请求:

import requests
session = requests.session()
html = session.get(url).content
soup = BeautifulSoup(html, "html5lib")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中建立 Web 连接的这两种方法之间有什么实际区别? 的相关文章

  • 网站(Google 和/或您)应如何处理 Accept-Language 标头?

    很长一段时间以来 我对谷歌在以下情况下的行为并不满意 并且在无意中注意到之后80 其他人 https stackoverflow com questions 1011167 what are common ui misconceptions
  • Python 3.6.1 安装位置

    我在 Ubuntu 16 服务器上安装了 Python 3 6 1 但找不到安装位置 我查看了 usr bin 其中提到了除 3 6 1 之外的所有其他版本 在哪里可以找到该版本的可执行文件 使用命令 whereis python3 6 1
  • ASCII - Asciimatics - 如何在代码中实现效果/屏幕

    几篇文章之前 有人建议我研究一下 Python 的 Asciimatics 库 我正在尝试使用以下方法来解决它 样品 https github com peterbrittain asciimatics tree master sample
  • H2O服务器崩溃

    去年我一直在使用 H2O 我已经厌倦了服务器崩溃 我已经放弃了 夜间发布 因为它们很容易被我的数据集崩溃 请告诉我在哪里可以下载稳定的版本 Charles 我的环境是 Windows 10 企业版 内部版本 1607 具有 64 GB 内存
  • Windows 操作系统中 ST_INO(os.stat() 输出)的含义

    谁能告诉我这个值的含义是什么st ino是跑步时os stat 在 Windows 上 Python 3 5 3 在早期的 Python 版本中 它包含虚拟值 但最近发生了变化 我找不到它是如何计算 生成的 我怀疑它因文件系统 NTFS F
  • 过滤条件的查询字符串与资源路径

    背景 我有2个资源 courses and professors A course具有以下属性 ID topic 学期号 年 部分 教授 id A professor具有以下属性 ID 学院 超级用户 名 姓 所以 你可以说一门课程有一位教
  • 如何在android中创建nanohttpd服务器?

    其实我也查过一些问题 然后去github上找了一下 但我是新来的 我无法理解这个例子 我想在android中创建http服务器 这样我就可以在PC浏览器中访问它 我有一个类扩展 nanohttpd 的实例 但服务器无法工作 不知道为什么 我
  • Flask-migrate:更改模型属性并重命名相应的数据库列

    我对 Flask 有一些经验 但对数据库 Flask migrate alembic SqlAlchemy 不太了解 我正在跟进this https blog miguelgrinberg com post the flask mega t
  • 捕获 subprocess.run() 的输入

    我在 Windows 上有一个交互式命令行 exe 文件 是由其他人编写的 当程序出现异常时 它会终止 并且我对程序的所有输入都会丢失 所以我正在编写一个 python 程序 它调用一个阻塞子进程subprocess run 并捕获所有输入
  • 对于一般不成功的请求(不是错误),适当的 HTTP 状态代码响应是什么?

    我正在创建一个 RESTful API 它将处理许多用户交互 包括使用存储的信用卡下订单 如果订单成功 我将返回 200 OK 如果订单请求格式错误或无效 我将返回 400 Bad Request 但如果订单实际处理过程中出现问题 我该怎么
  • 如何阅读网站内容?

    我是使用 python 2 7 的网络爬虫的新手 一 背景 现在 我想收集有用的数据AQICN org http aqicn org city shenyang usconsulate 这是一个很棒的网站 提供世界各地的空气质量数据 我想用
  • 导入错误:无法导入名称“FFProbe”

    我无法获取ffprobe包 https github com simonh10 ffprobe在 Python 3 6 中工作 我使用 pip 安装它 但是当我输入import ffprobe it says Traceback most
  • 加载pickle时出错

    无法加载 pickle 文件 我正在使用 python 3 5 import pickle data pickle load open D ud120 projects final project final project dataset
  • Seed_data.yaml 文件中有没有办法自动生成第一个模型所依赖的模型?

    我正在使用 Django 2 0 Python 3 7 和 MySql 5 我有以下两个模型 第二个依赖于第一个 class CoopType models Model name models CharField max length 20
  • python 中带有 lambda 函数字典的奇怪行为

    我编写了一个用于生成 lambda 常量函数字典的函数 它是一个更复杂函数的一部分 但我已将其简化为下面的代码 def function a interpolators for key in a keys interpolators key
  • 嵌套列表的重叠会产生不必要的间隙

    我有一个包含三个列表的嵌套 这些列表由 for 循环填充 并且填充由 if 条件控制 第一次迭代后 它可能类似于以下示例 a 1 2 0 0 0 0 0 0 4 5 0 0 0 0 0 0 6 7 根据条件 它们不重叠 在第二次迭代之后 新
  • 如何在 Laravel 中使用 PUT http 动词提交表单

    我知道这个问题可能已经提出 但我就是无法让它发挥作用 如果有人可以帮助我 我将非常感激 我安装了 colletive form 但答案也可以是 html 表单标签 现在列出我的表格 我的路线和我的例外情况 Form model array
  • Python3 和 xml/xslt 库

    在 python 2 6 中 我这样做是为了实现 xsl 转换 import libxml2 import libxslt styledoc libxml2 parseFile my xslt file style libxslt pars
  • 在 HTML 表单中使用 PUT 方法

    我可以在 HTML 表单中使用 PUT 方法将数据从表单发送到服务器吗 根据HTML标准 https www w3 org TR html5 sec forms html element attrdef form method 你可以not
  • Python 3.4 中的“异步”

    aiohttp 的入门文档提供了以下客户端示例 import asyncio import aiohttp async def fetch page session url with aiohttp Timeout 10 async wit

随机推荐