Python pycurl脚本无法登录到网站

Python pycurl脚本无法登录到网站,python,pycurl,Python,Pycurl,我目前正试图掌握pycurl。我正在尝试登录到一个网站。登录站点后,它应该重定向到主页。但是,当尝试此脚本时,它会返回到登录页面。我可能做错了什么 import pycurl import urllib import StringIO pf = {'username' : 'user', 'password' : 'pass' } fields = urllib.urlencode(pf) pageContents = StringIO.StringIO() p = pycurl.Curl(

我目前正试图掌握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()

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

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

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


不过,请注意,如果有JavaScript处理登录表单的任何必要部分,即使ClientForm也无法帮助您。您将需要一些解释JavaScript的东西来有效地自动化登录。在这种情况下,我曾经控制过浏览器,我让浏览器处理JavaScript。

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

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


不过,请注意,如果有JavaScript处理登录表单的任何必要部分,即使ClientForm也无法帮助您。您将需要一些解释JavaScript的东西来有效地自动化登录。在这种情况下,我曾经控制过浏览器,我让浏览器处理JavaScript。

黄金法则之一是,在尝试解决pycurl问题时,需要“阻止冰”,启用调试示例:

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

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

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()

金科玉律之一是,在尝试解决pycurl问题时,您需要“阻止冰”,启用调试。例如:

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

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

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()

URL不应该是接受登录的表单URL吗?这通常不是主页/URL,而是类似于login.cgi或login.php或处理登录表单的任何应用程序文件。我回去检查了一下,它似乎对我正在运行的测试页面有效,但对我正试图让它真正发挥作用的页面无效。非测试页面的操作表单指向主页URL,但我不确定该怎么做。更有可能的是,您登录的页面正在使用Javascript发布到index.html文件以外的URL。您可能需要查看Javascript以查看将值发布到何处。我找到了一个替代工具,可用于我尝试执行的操作:twill。我仍然很好奇为什么我的pycurl脚本不起作用。。。我还没有找到任何javascript可以阻止它。URL不应该是接受登录的表单URL吗?这通常不是主页/URL,而是类似于login.cgi或login.php或处理登录表单的任何应用程序文件。我回去检查了一下,它似乎对我正在运行的测试页面有效,但对我正试图让它真正发挥作用的页面无效。非测试页面的动作表单指向主页URL,但我不确定该怎么做。很可能,
您登录的页面正在使用Javascript发布到index.html文件以外的url。您可能需要查看Javascript以查看将值发布到何处。我找到了一个替代工具,可用于我尝试执行的操作:twill。我仍然很好奇为什么我的pycurl脚本不起作用。。。我还没有找到任何javascript可以阻止它。BeautifulSoup不是只处理屏幕抓取吗?我不认为它能处理表单信息的输入和发布数据。你是对的,我结合使用了ClientForm和BeautifulSoup。ClientForm处理表单和HTTP操作,而BeautifulSoup处理HTML解析,这在处理身份验证后特别有用。我仍然无法让PyclL在我想要的站点上运行,但它在另一个测试站点上运行,虽然这很奇怪,但我喜欢你的建议,所以我会相信你的答案。谢谢BeautifulSoup不是只处理屏幕刮擦吗?我不认为它能处理表单信息的输入和发布数据。你是对的,我结合使用了ClientForm和BeautifulSoup。ClientForm处理表单和HTTP操作,而BeautifulSoup处理HTML解析,这在处理身份验证后特别有用。我仍然无法让PyclL在我想要的站点上运行,但它在另一个测试站点上运行,虽然这很奇怪,但我喜欢你的建议,所以我会相信你的答案。谢谢干得好,付出了很大的努力,+1对你来说:干得好,付出了很大的努力,+1对你来说:
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()