如何“保活”与蟒蛇cookielib和httplib的?(How to “keep-alive” w

2019-06-23 16:22发布

在Python中,我使用httplib的,因为它“保活”的HTTP连接(如反对的urllib(2))。 现在,我想与httplib的使用cookielib但他们似乎讨厌对方! (没办法对接在一起)。

有谁知道解决这个问题的?

Answer 1:

对urllib2的HTTP处理程序,支持保活



Answer 2:

你应该考虑使用Requests库,而不是在你重构你的代码最早的机会。 同时;

HACK警惕! :)

我会去其他建议的方式,但我做了一个黑客(因为虽然不同的原因而作出的),这也创造之间的接口httplib的和cookielib 。

我所做的就是创建一个假HTTPRequest以最小所需的一套方法,使CookieJar根据需要将其识别和处理饼干。 我用的是假的请求对象,设置需要cookielib的所有数据。

下面是类的代码:

class HTTPRequest( object ):
"""
Data container for HTTP request (used for cookie processing).
"""

    def __init__( self, host, url, headers={}, secure=False ):
        self._host = host
        self._url = url
        self._secure = secure
        self._headers = {}
        for key, value in headers.items():
            self.add_header(key, value)

    def has_header( self, name ):
        return name in self._headers

    def add_header( self, key, val ):
        self._headers[key.capitalize()] = val

    def add_unredirected_header(self, key, val):
        self._headers[key.capitalize()] = val

    def is_unverifiable( self ):
        return True

    def get_type( self ):
        return 'https' if self._secure else 'http'

    def get_full_url( self ):
        port_str = ""
        port = str(self._host[1])
        if self._secure:
            if port != 443:
                port_str = ":"+port
        else:
            if port != 80:
                port_str = ":"+port
        return self.get_type() + '://' + self._host[0] + port_str + self._url

    def get_header( self, header_name, default=None ):
        return self._headers.get( header_name, default )

    def get_host( self ):
        return self._host[0]

    get_origin_req_host = get_host

    def get_headers( self ):
        return self._headers

请注意,这个类有只HTTPS协议的支持(所有我需要的时刻)。

它使用这个类的代码,是(请注意其他的黑客攻击,使与cookielib响应兼容):

cookies = CookieJar()

headers = {
    # headers that you wish to set
}

# construct fake request
fake_request = HTTPRequest( host, request_url, headers )

# add cookies to fake request
cookies.add_cookie_header(fake_request)

# issue an httplib.HTTPConnection based request using cookies and headers from the fake request
http_connection.request(type, request_url, body, fake_request.get_headers())

response = http_connection.getresponse()

if response.status == httplib.OK:
    # HACK: pretend we're urllib2 response
    response.info = lambda : response.msg

    # read and store cookies from response
    cookies.extract_cookies(response, fake_request)

    # process response...


文章来源: How to “keep-alive” with cookielib and httplib in python?