python - Tweepy 2.0 卡在 ssl do_handshake() 上

标签 python ubuntu ssl tweepy

我有一个长时间运行的 Twitter 抓取脚本,偶尔会挂起,堆栈跟踪以

结尾
"/usr/lib/python2.7/ssl.py", line 305: self._sslobj.do_handshake()

我的问题是“为什么?”和“我能做些什么来解决它?”。

这种情况通常会持续一周左右。最后一次,处理 tweepy 的 4 个线程中的 3 个挂起(第四个正在等待来自挂起线程的信息)。奇怪的是,挂起的线程之间有相当长的延迟:首先,线程调用 api.followers_ids()挂起,然后大约 12 分钟后线程调用 api.friends_ids()挂起,然后 1 小时 12 分钟后(!)线程调用 api.search()挂了。在所有这些之间有许多 api 调用。

当我发送 QUIT 时,我有一些代码可以转储它的堆栈跟踪。信号,对于挂起的线程,我得到了类似以下内容的信息。它们与(并包括)第二个条目(tweepy/binder.py, line 185, in _call 部分)完全相同。另外两个从tweepy/cursor.py, line 85 in next到达那里和 tweepy/cursor.py, line 60, in next :

  File "myTwitterScrapingScript.py", line 245, in checkStatus
    status = api.rate_limit_status()
  File "/scratch/bin/python-virtual-environments/tweepy-2/local/lib/python2.7/site-packages/tweepy/binder.py", line 185, in _call
    return method.execute()
  File "/scratch/bin/python-virtual-environments/tweepy-2/local/lib/python2.7/site-packages/tweepy/binder.py", line 146, in execute
    conn.request(self.method, url, headers=self.headers, body=self.post_data)
  File "/usr/lib/python2.7/httplib.py", line 958, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.7/httplib.py", line 992, in _send_request
    self.endheaders(body)
  File "/usr/lib/python2.7/httplib.py", line 954, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python2.7/httplib.py", line 814, in _send_output
    self.send(msg)  File "/scratch/bin/python-virtual-environments/tweepy-2/local/lib/python2.7/site-packages/tweepy/binder.py", line 185, in _call
    return method.execute()
  File "/scratch/bin/python-virtual-environments/tweepy-2/local/lib/python2.7/site-packages/tweepy/binder.py", line 146, in execute
    conn.request(self.method, url, headers=self.headers, body=self.post_data)
  File "/usr/lib/python2.7/httplib.py", line 958, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.7/httplib.py", line 992, in _send_request
    self.endheaders(body)
  File "/usr/lib/python2.7/httplib.py", line 954, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python2.7/httplib.py", line 814, in _send_output
    self.send(msg)
  File "/usr/lib/python2.7/httplib.py", line 776, in send
    self.connect()
  File "/usr/lib/python2.7/httplib.py", line 1161, in connect
    self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)
  File "/usr/lib/python2.7/ssl.py", line 381, in wrap_socket
    ciphers=ciphers)
  File "/usr/lib/python2.7/ssl.py", line 143, in __init__
    self.do_handshake()
  File "/usr/lib/python2.7/ssl.py", line 305, in do_handshake
    self._sslobj.do_handshake()

线程挂起时出现了一些小错误。这并不少见,尽管数量略高于正常水平。不过第四个看起来很有趣。它发生在该线程挂起之前。

  • [Errno 110] : Connection timed out在最后一个之前约 7 分钟followers_ids()调用(中间有许多各种各样的 api 调用)
  • [Errno 104] Connection reset by peer大约 3 分钟后(再次,几次成功的通话)
  • [Errno 110] Connection timed out最后一集前约 1.5 分钟 friends_ids()称呼。这是在api.search()线程,它在第一个线程挂起前大约 5 分钟一直在等待 - 总共等待了大约 15 分钟。
  • [Errno 104] Connection reset by peer friends_ids() 的最后一条消息前约 2 毫秒线程,并且在同一个线程中。刚刚收集的 friend ID 的页面显示一切正常,并且这些调用没有错误。
  • [Errno 104] Connection reset by peersearch线程,在 friends_ids 后约 17 分钟线程在 search 前将近一个小时挂起线程挂起。
  • A Failed to send request大约 1.5 分钟后无故出现 TweepError。
  • 3 个毫无理由的 Failed to send request的和一个[Errno 104] Connection reset by peer在接下来的 45 分钟内。
  • 大约 15 分钟没有错误,有很多 searchlookup_userssearch 之前调用线程终于挂了。

最佳答案

问题似乎是 tweepy 没有实现超时。在 tweepy 的最新版本中,这个问题已经得到修复,此后(在连续几个月的数据收集中)没有出现过这个问题。

关于python - Tweepy 2.0 卡在 ssl do_handshake() 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16183179/

相关文章:

python - 将 `app.add_route()` 用于 GraphQL 时,如何在 FastAPI 中获取用户身份验证信息?

ubuntu - Nginx 配置文件更新问题

docker - 在 ubuntu 容器中运行 docker

amazon-web-services - 为 S3 启用 SSL,默认提供 index.html

ssl - 在 AWS 上的 ELB EC2 之间添加 SSL 通信并强制仅进行 HTTPS 通信

python - Keras 实现中的 LSTM 架构?

python - 如何在我的ros系统中添加sensor_msgs.msg类型?

python - 当主线程调用 sys.exit() 时,守护线程是否会被终止?

qt - 如何在 Qt5 中获取系统 QFileDialog?

node.js - 在 Apache 后面运行 express 应用程序时如何强制使用 SSL?