⇤ ← Revision 1 as of 2004-08-29 17:49:27
Size: 4919
Comment: 从blog拷贝文章
|
Size: 5017
Comment: 增加源代码附件
|
Deletions are marked like this. | Additions are marked like this. |
Line 76: | Line 76: |
''下载源代码:attachment:lfcookie-1.py'' |
|
Line 129: | Line 131: |
''下载源代码:attachment:lfcookie-2.py'' |
解决在 Python 中登录网站的问题
-- xyb [DateTime(2004-08-29T17:49:27Z)] TableOfContents
解决在 Python 中登录网站的问题
作者:Xie Yanbo, 版权:创作共用/cc 1.0, 原文地址:http://xie.freezope.org/blog/2004/08/python.html
所谓登录进入一个网站,实际上就是在浏览器里留下一些暂时或长期的 cookie 而已。如果我们用 Python 访问一些需要登录才能看到的内容,只要把登录之后传回来的cookies再传回去就行了。
虽然 Python2.3 提供了 Cookie 这个模块,但做为操作客户端 cookie 来说并不实用。我们也可以靠自己维护 http header 来实现这些功能,但这很很麻烦。还好有人提供了不错的模块,比如 [http://wwwsearch.sourceforge.net/ClientCookie/ CookieClient] 就是不错的选择。下面是我用 CookieClient 编写的一个访问 [http://www.linuxforum.net/ linuxforum] 的示例脚本:
1 #!/usr/bin/env python
2 # -*- coding: GB2312 -*-
3 # xyb at linuxforum.net
4
5 import sys
6 import ClientCookie
7 from urllib import urlencode
8
9 # add loader
10 cookies = ClientCookie.LWPCookieJar()
11 opener = ClientCookie.build_opener(
12 ClientCookie.HTTPCookieProcessor(cookies),
13 ClientCookie.HTTPRefererProcessor,
14 ClientCookie.HTTPEquivProcessor,
15 ClientCookie.HTTPRefreshProcessor,
16 ClientCookie.SeekableProcessor)
17 opener.addheaders = [
18 ("User-agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20031107 Debian/1.5-3"),
19 ("Accept", "text/html, image/jpeg, image/png, text/*, image/*, */*")]
20 ClientCookie.install_opener(opener)
21
22 # check args
23 if len(sys.argv) <= 2:
24 print "Usage: %s USERNAME PASSWORD" % (sys.argv[0])
25 sys.exit(1)
26 else:
27 UserName = sys.argv[1]
28 Password = sys.argv[2]
29
30 # login
31 data = {
32 'Loginname': UserName,
33 'Loginpass': Password,
34 'firstlogin': 1,
35 'option': '登入论坛'
36 }
37 urldata = urlencode(data)
38 r = ClientCookie.urlopen("http://www.linuxforum.net/forum/start_page.php", urldata)
39
40 # show result
41 results = r.read()
42 open('start.html', 'w').write(results)
43
44 # then, user page
45 r = ClientCookie.urlopen("http://www.linuxforum.net/forum/login.php?Cat=")
46 results = r.read()
47 open('user.html', 'w').write(results)
48
49 # read messages
50 r = ClientCookie.urlopen("http://www.linuxforum.net/forum/viewmessages.php?Cat=&box=received")
51 results = r.read()
52 open('inbox.html', 'w').write(results)
53
54 # save cookies to file
55 cookies.save("./cookies")
下载源代码:attachment:lfcookie-1.py
这个例子里用的是 ClientCookie-0.9.4a。
不过从 Python2.4 开始,将会增加 [http://www.python.org/dev/doc/devel/lib/module-cookielib.html clientlib] 来提供对客户端 cookie 的支持,其中绝大部分代码都是 ClientCookie 里的,只不过调整了一下组织方式和文档,并且和 urllib2 整合在了一起。把上面的代码翻译一下,就可以得到如下的代码:
1 #!/usr/bin/env python
2 # -*- coding: GB2312 -*-
3 # xyb at linuxforum.net
4
5 import sys
6 from urllib import urlencode
7 import cookielib, urllib2
8 cj = cookielib.LWPCookieJar()
9 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
10 opener.addheaders = [
11 ("User-agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20031107 Debian/1.5-3"),
12 ("Accept", "text/html, image/jpeg, image/png, text/*, image/*, */*")]
13
14 # check args
15 if len(sys.argv) <= 2:
16 print "Usage: %s USERNAME PASSWORD" % (sys.argv[0])
17 sys.exit(1)
18 else:
19 UserName = sys.argv[1]
20 Password = sys.argv[2]
21
22 # login
23 data = {
24 'Loginname': UserName,
25 'Loginpass': Password,
26 'firstlogin': 1,
27 'option': '登入论坛'
28 }
29 urldata = urlencode(data)
30 r = opener.open("http://www.linuxforum.net/forum/start_page.php", urldata)
31
32 # show result
33 results = r.read()
34 open('start.html', 'w').write(results)
35
36 # then, user page
37 r = ClientCookie.urlopen("http://www.linuxforum.net/forum/login.php?Cat=")
38 results = r.read()
39 open('user.html', 'w').write(results)
40
41 # read messages
42 r = ClientCookie.urlopen("http://www.linuxforum.net/forum/viewmessages.php?Cat=&box=received")
43 results = r.read()
44 open('inbox.html', 'w').write(results)
45
46 # save cookies to file
47 cookies.save("./cookies")
下载源代码:attachment:lfcookie-2.py
不过现在 Python2.4a2 的 urllib2 还有点 [http://python.org/sf/996159 bug],它导致发出的请求 header 会有两个大小写不同的 Content-Length。这也导致我们的这个例子现在还不能正常运行,不过我想等正式的 Python2.4 出来以后这段代码应该能直接执行。
另外,在上面的代码中我是使用的 cookielib.LWPCookieJar() 或 ClientCookie.LWPCookieJar(),其实还有 MozillaCookieJar、MSIECookieJar、MSIEDBCookieJar 和 BSDDBCookieJar 这些选择。