1

我目前正在尝试掌握 pycurl。我正在尝试登录一个网站。登录网站后,它应该重定向到主页。但是,在尝试此脚本时,它只会返回到登录页面。我可能做错了什么?

import pycurl
import urllib
import StringIO

pf = {'username' : 'user', 'password' : 'pass' }
fields = urllib.urlencode(pf)
pageContents = StringIO.StringIO()

p = pycurl.Curl()
p.setopt(pycurl.FOLLOWLOCATION, 1)
p.setopt(pycurl.COOKIEFILE, './cookie_test.txt')
p.setopt(pycurl.COOKIEJAR, './cookie_test.txt')
p.setopt(pycurl.POST, 1)
p.setopt(pycurl.POSTFIELDS, fields)
p.setopt(pycurl.WRITEFUNCTION, pageContents.write)
p.setopt(pycurl.URL, 'http://localhost')
p.perform()

pageContents.seek(0)
print pageContents.readlines()

编辑:正如彼得所指出的,URL 应该指向一个登录 URL,但我试图让它工作的网站无法向我显示这将是什么 URL。表单的操作只是指向主页( /index.html )

4

2 回答 2

3

当您解决此问题时,我建议您使用 FireBug 或 LiveHTTPHeaders 之类的浏览器插件(我建议使用 Firefox 插件,但其他浏览器也有类似的插件)。然后,您可以执行对站点的请求,并查看正在将哪些操作 (URL)、方法和表单参数传递给目标服务器。这可能有助于阐明问题的症结所在。

如果这没有帮助,您可以考虑使用不同的工具进行机械化。我使用ClientFormBeautifulSoup来执行类似的操作。根据我在 pycURL 文档和您上面的代码中阅读的内容,ClientForm 可能是一个更好的工具。ClientForm 将解析您的 HTML 页面,找到其中的表单(包括登录表单),并根据您提供给表单的答案为您构建适当的请求。您甚至可以将 ClientForm 与 pycURL...

但是请注意,如果有 JavaScript 处理登录表单的任何必要部分,即使 ClientForm 也无法帮助您。您将需要能够解释 JavaScript 的东西来有效地自动登录。在这种情况下,我使用SeleniumRC来控制浏览器(并让浏览器处理 JavaScript)。

于 2010-06-17T14:19:32.000 回答
2

黄金法则之一,您需要“制止”,在尝试解决 pycurl 示例时启用调试:

注意:不要忘记在p.perform()之后使用p.close()


def test(debug_type, debug_msg):
    if len(debug_msg) < 300:
        print "debug(%d): %s" % (debug_type, debug_msg.strip())

p.setopt(pycurl.VERBOSE, True)
p.setopt(pycurl.DEBUGFUNCTION, test)

现在你可以看到你的代码是如何呼吸的,因为你已经启用了调试

import pycurl
import urllib
import StringIO

def test(debug_type, debug_msg):
    if len(debug_msg) < 300:
        print "debug(%d): %s" % (debug_type, debug_msg.strip())    

pf = {'username' : 'user', 'password' : 'pass' }
fields = urllib.urlencode(pf)
pageContents = StringIO.StringIO()

p = pycurl.Curl()
p.setopt(pycurl.FOLLOWLOCATION, 1)
p.setopt(pycurl.COOKIEFILE, './cookie_test.txt')
p.setopt(pycurl.COOKIEJAR, './cookie_test.txt')
p.setopt(pycurl.POST, 1)
p.setopt(pycurl.POSTFIELDS, fields)
p.setopt(pycurl.WRITEFUNCTION, pageContents.write)
p.setopt(pycurl.VERBOSE, True)
p.setopt(pycurl.DEBUGFUNCTION, test)
p.setopt(pycurl.URL, 'http://localhost')
p.perform()

p.close() # This is mandatory.

pageContents.seek(0)
print pageContents.readlines()
于 2013-10-31T05:48:30.200 回答