ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

华为AI开发者空间

华为AI开发者空间 在网络请求当中, 请求超时这种情况是不可避免的, 如果不设置好相关的参数, 那么你的程序很有可能会出现一直无法响应的状态。关于超时这一情况, 还可以将其分为连接超时和读取超时这两种类型, 从比较简单的角度出发去理解的话, 所谓连接超时, 指的就是在客户端发出请求直至与服务器方建立起连接这个过程中所允许耗费的最长时间上限, 而所谓读取超时, 则是指在与服务器的连接已经成功建立之后, 到最终收到来自服务器方的响应数据这其间所需要等待的最长时间界限。在最近的时间里, 异常状况已经出现了两次。有一次出现的情况是, 返回的数据并不完整, 通过打印文本内容可以看出, 字符串的后半段没有被读取出来。还有那么一回, 事情卡住不动了, 一直没出现返回的反应。通过百度搜索找到的信息如下: 遇到了超时的情况, 以及页面卡住没有任何反应的解决处理方法。来源是简书这一平台。网络请求不可避免会遇上请求超时的情况在 中如果不设置你的程序可能会永远失去响应。超时这个事儿, 它其实是可以分成那么两类的, 就是连接超时, 再一个, 就是读取超时。连接超时连接超时这个概念, 是指当你的客户端尝试去跟远端的机器端口建立连接的时候, 它所能够等待的时间长度是多少秒。import timeimport requestsurl http://www.google.com.hkprint(time.strftime(%Y-%m-%d %H:%M:%S))try:html requests.get(url, timeout5).textprint(success)except requests.exceptions.RequestException as e:print(e)print(time.strftime(%Y-%m-%d %H:%M:%S))因为被墙了, 所以无法连接, 错误信息显示是连接超时。2018-12-14 14:38:20HTTPConnectionPool(hostwww.google.com.hk, port80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(, Connection to www.google.com.hk timed out. (connect timeout5)))2018-12-14 14:38:25就算不进行专门的设置, 依然会使用一个默认的链接超时时间, 经过我的测试, 具体的时长大概在21秒左右。读取超时所谓的读取超时, 实际上就是指客户端在等待服务器发出请求时所耗费的时长。更具体地来说, 它指的是客户端为了等待服务器依次发送各个字节而需要经历的时间。而在绝大多数情况下, 也就是占据百分之九十九点九的情形里, 这一概念特指的就是从开始直到服务器发出第一个字节之前的这段等待时间。简单来说, 连接超时指的是从发起请求到连接建立之间所允许消耗的最大时间长度, 而读取超时则是指连接一旦成功之后在等待服务器返回响应这一过程里所占据的最大时长。假如说, 你把单个的具体数值进行设定充当那个占位符的样子话, 就像是下面所展现出来的这个情况那样子的。r .get(, 5)这个值会被用来作为读操作里面的那个参数。如果你想要分别地进行设置, 你就需要输入一个包含两个元素的序列数据。变量r通过调用_get函数并传入特定参数来赋值, 其中该参数的值为27乘以3.05之后的结果。黑板课爬虫闯关活动当中的第四关, 这个关卡的情况是, 网站方人为地设置了一个响应等待时间, 该时间的长度为十五秒钟, 使用这一情况来进行说明, 被认为是非常合适的。import timeimport requestsurl_login next/lesson/crawler_ex03/session requests.Session()session.get(url_login)token session.cookies[csrftoken]session.post(url_login, data{csrfmiddlewaretoken: token, username: xx, password: xx})print(time.strftime(%Y-%m-%d %H:%M:%S))url_pw try:html session.get(url_pw, timeout(5, 10)).textprint(success)except requests.exceptions.RequestException as e:print(e)print(time.strftime(%Y-%m-%d %H:%M:%S))在错误信息里面所展示出来的内容, 主要是表明了出现了读取操作超时的情况, 也就是通常所说的那个阅读时间超出预期的问题。2018-12-14 15:20:47port80): Read timed out. (read timeout10)2018-12-14 15:20:57读取这个超时配置它本来就是没有给默认的值的, 要是你不专门去给它设置一个数出来, 那么这个程序它就一直在那儿干等着, 根本不会停。我们的爬虫经常会发生那种卡住不动了的情况, 而且还没有任何报错的信息跑出来, 产生这种问题的原因, 其实就在这个地方。超时重试在处理超时情况的时候, 我们一般会先不立马给出结果而是会去配置一套能够重连三次的机制。def gethtml(url):i 0while i 3:try:html requests.get(url, timeout5).textreturn htmlexcept requests.exceptions.RequestException:i 1实际上, 它已经替我们把这些工作都封装好了。不过, 代码的数量好像也因此变多了。import timeimport requestsfrom requests.adapters import HTTPAdapters requests.Session()s.mount(http://, HTTPAdapter(max_retries3))s.mount(https://, HTTPAdapter(max_retries3))print(time.strftime(%Y-%m-%d %H:%M:%S))try:r s.get(http://www.google.com.hk, timeout5)return r.textexcept requests.exceptions.RequestException as e:print(e)print(time.strftime(%Y-%m-%d %H:%M:%S))把这个最大重试次数设置为3次, 然后再加上最开始的那一次请求, 算下来总共有4次。所以呢, 刚才说的那个代码跑完需要的耗时是20秒, 而并不是15秒。2018-12-14 15:34:03HTTPConnectionPool(hostwww.google.com.hk, port80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(, Connection to www.google.com.hk timed out. (connect timeout5)))2018-12-14 15:34:23
返回列表