用Tornado的HttpClient进行带Cookie的访问

由于最近需要用Tornado做一个网络抓取的东西。不过由于那系统是Struts写的,利用了Java EE的session,所以需要Cookie保存状态。

。。最近穷到只能用SAE那种被阉割的云服务器(截止现在我已经放血100大洋买了一个月的阿里云服务器了)。

SAE这种奇葩的产品似乎没办法装自己需要的库,所以像Httplib2这样的东西估计没戏了(好吧其实我没尝试过。。。)

但是我们可以利用Tornado自带的Http客户端来实现带Cookie的程序。

解释文字不多加,大家代码一看就懂。有一点特殊的就是,获取cookie的时候要读取头部的“Set-Cookie”。但是设置Cookie的时候,只要往头部写"Cookie"就好(不是"Set-Cookie")。

P.S.下面这段代码是从我的项目中拼凑出来的,没直接跑过。。不过理论上差不多吧……

try:  
    #新建一个HTTPClient对象
    http_client = httpclient.HTTPClient()

    #得到这个当前Handler自己的headers,以后我们直接往里填充cookie会比较方便。不过其实空的header也可以
    self.__login_headers = self._headers

    #创建一个Request,用的头部就是这个Handler自己的头部
    request = httpclient.HTTPRequest(
        "url?username=%s&password=%s" % (username, password),
        headers=self.__login_headers
    )

    #请求这个地址,然后得到Response
    response = http_client.fetch(request)

    #由于只是个登陆,所以这个页面的content似乎不重要。
    #这里通过判断返回页面的内容来鉴别是不是登陆成功云云
    content = response.body.decode('gb2312')

    #登陆错误过滤(服务器端页面错误,非HTTP错误)
    if content.find(u"您的密码不正确") is not -1:
        raise Exception("您的密码不正确")
    elif content.find(u"你输入的证件号不存在") is not -1:
        raise Exception("您输入的证件号不存在")

    #这里是重点!!!!!获得登陆后的cookie!!!!!!
    self.__login_cookies = response.headers.get_list('Set-Cookie')            #这里是“Set-Cookie”

    #在头部中加入刚刚的Cookie
    for item in self.__login_cookies:
        self.__login_headers.add('cookie', item)            #这里是“cookie”

    #这次的Client功能已经达到了。它已经获取到了登陆cookie
    http_client.close()

    #再新开启一个HTTPClient
    http_client = httpclient.HTTPClient()

    #再来一个Request
    request = httpclient.HTTPRequest(
        url='url',    #这里的url想要有东西就需要带着cookie
        method='GET',
        headers=self.__login_headers,        #这里带着上面保存着Cookie的头部
    )

    #然后fetch,然后获得内容etc。。。
    response = http_client.fetch(request)
    content = response.body.decode('gb2312')

except Exception as e:    #这里不规范。。大家别这么写— —。。。  
    print e

Friskit

继续阅读此作者的更多文章