Python使用Chrome浏览器的Cookies发起HTTP请求

昨天我写了两篇博客,介绍:

1) 如何使用httplib带Cookies字符串发起请求

2) 如何解析Cookies字符串、创建CookieJar对象,自动管理Cookies的添加、更新、删除

本篇顺着介绍如何在Python中使用Chrome浏览器已有的Cookies发起HTTP请求。

Chrome的Cookies文件保存路径类似于:

C:\Users\Lucas Lee\AppData\Local\Google\Chrome\User Data\Default\Cookies

其中C:\Users\Lucas Lee\AppData可通过环境变量os.environ[‘LOCALAPPDATA’]获取。

Cookies是一个Sqlite3数据库文件。

了解完上述事实,问题就非常简单了:

从数据库中查询到所需的Cookies,更新到一个CookieJar对象中。再使用这个CookieJar创建opener即可。

函数build_opener_with_chrome_cookies展示了一个基本的实现,当省略domain时,会导入所有的Cookie,建议提供domain参数。

import os
import sqlite3
import cookielib
import Cookie
import urllib2

def build_opener_with_chrome_cookies(domain=None):
    cookie_file_path = os.path.join(os.environ['LOCALAPPDATA'], r'Google\Chrome\User Data\Default\Cookies')
    if not os.path.exists(cookie_file_path):
        raise Exception('Cookies file not exist!')
    conn = sqlite3.connect(cookie_file_path)
    sql = 'select host_key, name, value, path from cookies'
    if domain:
        sql += ' where host_key like "%{}%"'.format(domain)
        
    cookiejar = cookielib.CookieJar()    # No cookies stored yet

    for row in conn.execute(sql):
        cookie_item = cookielib.Cookie(
            version=0, name=row[1], value=row[2],
                     port=None, port_specified=None,
                     domain=row[0], domain_specified=None, domain_initial_dot=None,
                     path=row[3], path_specified=None,
                     secure=None,
                     expires=None,
                     discard=None,
                     comment=None,
                     comment_url=None,
                     rest=None,
                     rfc2109=False,
            )
        cookiejar.set_cookie(cookie_item)    # Apply each cookie_item to cookiejar
    conn.close()
    return urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))    # Return opener


if __name__ == '__main__':
    
    opener = build_opener_with_chrome_cookies(domain='192.168.1.253')
    html_doc = opener.open('http://192.168.1.253').read()
    import re
    print 'Title:', re.search('(.*?)', html_doc, re.IGNORECASE).group(1)

测试代码中,我在Chrome浏览器登陆了无线路由器,opener打开的页面同样显示处于已登陆状态。

利用Redirector插件去掉Google跳转和免费收听豆瓣FM Pro

本文描述的方法已失效

本文描述的方法是在通过Chrome插件实现的,因此,如果你已经安装了Chrome浏览器,请继续浏览下面的内容。

Redirector插件

这是一个用于URL Redirect和修改HTTP Header的Chrome插件。

安装这个插件

1. 去掉Google搜索结果页面中的跳转链接

安装完插件,我们可以开始添加跳转规则。

一个可行操作的方法是,在浏览器中的地址栏输入: chrome://extensions/

然后选择Redirector插件的”选项“,进入”规则管理器“。

如下图所示:

redirector-settings-manager

继续阅读利用Redirector插件去掉Google跳转和免费收听豆瓣FM Pro