Size: 6535
Comment:
|
Size: 5333
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 8: | Line 8: |
Line 9: | Line 10: |
''作者:Xie Yanbo, | {{{ 作者:Xie Yanbo, |
Line 12: | Line 14: |
'' | }}} |
Line 16: | Line 18: |
== CookieClient == | |
Line 42: | Line 45: |
if len(sys.argv) <= 2: | if len(sys.argv) <= 2: |
Line 69: | Line 72: |
r = ClientCookie.urlopen("http://www.linuxforum.net/forum/viewmessages.php?Cat=&box=received") | r = ClientCookie.urlopen("http://www.linuxforum.net/forum/viewmessages.php?Cat=&box=received") |
Line 78: | Line 81: |
这个例子里用的是 ClientCookie-0.9.4a。 | * 这个例子里用的是 ClientCookie-0.9.4a。 |
Line 80: | Line 83: |
== with urllib2 == | |
Line 98: | Line 102: |
if len(sys.argv) <= 2: | if len(sys.argv) <= 2: |
Line 125: | Line 129: |
r = urllib2.urlopen("http://www.linuxforum.net/forum/viewmessages.php?Cat=&box=received") | r = urllib2.urlopen("http://www.linuxforum.net/forum/viewmessages.php?Cat=&box=received") |
Line 134: | Line 138: |
不过现在 Python2.4a2 的 urllib2 还有点 [http://python.org/sf/996159 bug],它导致发出的请求 header 会有两个大小写不同的 Content-Length。这也导致我们的这个例子现在还不能正常运行,不过我想等正式的 Python2.4 出来以后这段代码应该能直接执行。 | = 后续 = |
Line 136: | Line 140: |
另外,在上面的代码中我是使用的 cookielib.LWPCookieJar() 或 ClientCookie.LWPCookieJar(),其实还有 MozillaCookieJar、MSIECookieJar、MSIEDBCookieJar 和 | * 不过现在 Python2.4a2 的 urllib2 还有点 [http://python.org/sf/996159 bug],它导致发出的请求 header 会有两个大小写不同的 Content-Length。这也导致我们的这个例子现在还不能正常运行,不过我想等正式的 Python2.4 出来以后这段代码应该能直接执行。 * 另外,在上面的代码中我是使用的 cookielib.LWPCookieJar() 或 ClientCookie.LWPCookieJar(),其实还有 MozillaCookieJar、MSIECookieJar、MSIEDBCookieJar 和 |
Line 139: | Line 145: |
2004-09-06,注:Python2.4a3 发布,clientlib 没有什么问题了,我的那段倒是有问题,一是需要 install_opener,二是需要使用 urllib2.urlopen。现在改过了。 [http://allegra913.b3.nu/ Allegra] [http://ambien913.b3.nu/ Ambien] [http://amoxil913.b3.nu/ Amoxil] [http://ativan913.b3.nu/ Ativan] [http://celebrex913.b3.nu/ Celebrex] [http://cialis913.b3.nu/ Cialis] [http://cipro913.b3.nu/ Cipro] [http://claritin913.b3.nu/ Claritin] [http://clomid913.b3.nu/ Clomid] [http://glucophage913.b3.nu/ Glucophage] [http://levitra913.b3.nu/ Levitra] [http://lipitor913.b3.nu/ Lipitor] [http://mevacor913.b3.nu/ Mevacor] [http://nexium913.b3.nu/ Nexium] [http://norvasc913.b3.nu/ Norvasc] [http://paxil913.b3.nu/ Paxil] [http://phentermine913.b3.nu/ Phentermine] [http://propecia913.b3.nu/ Propecia] [http://proscar913.b3.nu/ Proscar] [http://prozac913.b3.nu/ Prozac] [http://reductil-meridia913.b3.nu/ Reductil-meridia] [http://soma913.b3.nu/ Soma] [http://ultram913.b3.nu/ Ultram] [http://valium913.b3.nu/ Valium] [http://viagra913.b3.nu/ Viagra] [http://viagra soft913.b3.nu/ Viagra Soft] [http://vioxx913.b3.nu/ Vioxx] [http://wellbutrin913.b3.nu/ Wellbutrin] [http://xanax913.b3.nu/ Xanax] [http://xenical913.b3.nu/ Xenical] [http://zanaflex913.b3.nu/ Zanaflex] [http://zantac913.b3.nu/ Zantac] [http://zocor913.b3.nu/ Zocor] [http://zoloft913.b3.nu/ Zoloft] [http://zovirax913.b3.nu/ Zovirax] [http://zyban913.b3.nu/ Zyban] [http://zyrtec913.b3.nu/ Zyrtec] |
* '''2004-09-06''',注:Python2.4a3 发布,clientlib 没有什么问题了,我的那段倒是有问题,一是需要 install_opener,二是需要使用 urllib2.urlopen。现在改过了。 == 2006 == * ZoomQuiet |
解决在 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再传回去就行了。
CookieClient
虽然 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。
with urllib2
不过从 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 urllib2.install_opener(opener)
11 opener.addheaders = [
12 ("User-agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20031107 Debian/1.5-3"),
13 ("Accept", "text/html, image/jpeg, image/png, text/*, image/*, */*")]
14
15 # check args
16 if len(sys.argv) <= 2:
17 print "Usage: %s USERNAME PASSWORD" % (sys.argv[0])
18 sys.exit(1)
19 else:
20 UserName = sys.argv[1]
21 Password = sys.argv[2]
22
23 # login
24 data = {
25 'Loginname': UserName,
26 'Loginpass': Password,
27 'firstlogin': 1,
28 'option': '登入论坛'
29 }
30 urldata = urlencode(data)
31 r = opener.open("http://www.linuxforum.net/forum/start_page.php", urldata)
32
33 # show result
34 results = r.read()
35 open('start.html', 'w').write(results)
36
37 # then, user page
38 r = urllib2.urlopen("http://www.linuxforum.net/forum/login.php?Cat=")
39 results = r.read()
40 open('user.html', 'w').write(results)
41
42 # read messages
43 r = urllib2.urlopen("http://www.linuxforum.net/forum/viewmessages.php?Cat=&box=received")
44 results = r.read()
45 open('inbox.html', 'w').write(results)
46
47 # save cookies to file
48 cj.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 这些选择。
2004-09-06,注:Python2.4a3 发布,clientlib 没有什么问题了,我的那段倒是有问题,一是需要 install_opener,二是需要使用 urllib2.urlopen。现在改过了。