【问题标题】:Re-use http connection Python 3重用 http 连接 Python 3
【发布时间】:2015-11-14 01:06:39
【问题描述】:

所以每秒我都会向网站 X 发出一堆请求,到目前为止,使用标准的 urllib 包就像这样(请求返回一个 json):

import urllib.request
import threading, time

def makerequests():
    request = urllib.request.Request('http://www.X.com/Y')
    while True:
        time.sleep(0.2)
        response = urllib.request.urlopen(request)
        data = json.loads(response.read().decode('utf-8'))

for i in range(4):
    t = threading.Thread(target=makerequests)
    t.start()

但是,由于我在大约 500 次请求后提出了如此多的请求,因此网站返回 HTTPError 429: Too manyrequests。我想如果我重新使用初始 TCP 连接可能会有所帮助,但是我注意到使用 urllib 包是不可能做到这一点的。

所以我做了一些谷歌搜索,发现以下软件包可能会有所帮助:

  • Requests
  • http.client
  • socket ?

所以我有一个问题:哪一个最适合我的情况,有人可以展示其中任何一个的示例(对于 Python 3)吗?

【问题讨论】:

  • 回答你的问题requests (可能)是最好的——它会自动处理保持活动。但实际上可能有帮助的是减少请求。
  • 如果网站是限速请求,那么重用tcp连接可能就不行了。
  • 我假设网站的系统管理员知道您在做什么以及为什么。如果不重复循环相同的请求,可能会被视为攻击,您的 IP 将在黑名单中结束。

标签: python sockets http tcp urllib


【解决方案1】:

如果您使用会话,requests 会自动处理 keep alive。如果服务器限制请求的速率,这实际上可能对您没有帮助,但是,requests 也处理解析 JSON,因此这是使用它的一个很好的理由。这是一个例子:

import requests

s = requests.Session()
while True:
    time.sleep(0.2)
    response = s.get('http://www.X.com/y')
    data = response.json()

【讨论】:

    猜你喜欢
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2019-01-24
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多