• 05访问超时设置 | 01.数据抓取 | Python


    05-访问超时设置

    郑昀 201005 隶属于《01.数据抓取》小节

    设置 HTTP 或 Socket 访问超时,来防止爬虫抓取某个页面时间过长。

    pycurl 库的调用中,可以设置超时时间:

    c.setopt(pycurl.CONNECTTIMEOUT, 60)

    在 Python 2.6 版本下,httplib 库由于有如下构造函数:

    class HTTPConnection:

        def __init__(self, host, port=None, strict=None,
                 timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
            self.timeout = timeout

    所以可以设置:

    >>> h3 = httplib.HTTPConnection('www.cwi.nl', 80, timeout=10)
     
    参见文档 #2452: timeout is used for all blocking operations

    如果通过 HTTPConnection 或 HTTPSConnection 的构造函数给定超时时间,那么阻塞操作(如试图建立连接)将会超时。如果没有给或者赋值 None ,那么它将使用全局的超时时间设置。

    Python 2.5 下,因为 HTTPConnection 类的 __init__ 函数没有 timeout 参数,所以通过一个隐藏很深的函数:

    httplib.socket.setdefaulttimeout(3)#输入参数单位貌似是分钟

    来设置超时。

    设置全局超时

    最后,抓取时如果实在找不到什么函数能设置超时时间,那么可以设置全局的 socket 超时,虽然这样做不大合适:

    >>> import socket
    >>> socket.setdefaulttimeout(90)

    setdefaulttimeout() was a hack to allow to set the timeout when nothing else is available.

    如何捕获超时异常?

    举例:

    from urllib2 import urlopen
    import socket

    slowurl =”http://www.wenxuecity.com/”

    socket.setdefaulttimeout(1)

    try:
        data = urlopen(slowurl)
        data.read()
    except socket.error:
        errno, errstr = sys.exc_info()[:2]
        if errno == socket.timeout:
            print "There was a timeout"
        else:
            print "There was some other socket error"

    参考资源:

    1、 No way to disable socket timeouts in httplib, etc.

    2、How to catch socket timeout?

  • 相关阅读:
    mysql The server time zone value 'xxx' is unrecognized
    mysql Public Key Retrieval is not allowed
    mysql Unable to load authentication plugin 'caching_sha2_password'.
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
  • 原文地址:https://www.cnblogs.com/zhengyun_ustc/p/1738348.html
Copyright © 2020-2023  润新知