2010-06-16 117 views
1

我目前正试图掌握pycurl。我试图登录到一个网站。登录到网站后,它应该重定向到主页面。但是,尝试此脚本时,它只会返回到登录页面。我可能会做错什么?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的网站。该表单的动作只是指向主页(/index.html)

+0

不应该URL是可以接受的登录表单的网址?这通常不是主页“/”URL,而是诸如“login.cgi”或“login.php”或任何应用程序文件处理登录表单的内容。 – 2010-06-17 04:20:30

+0

你说得对。我回去检查了这一点,它似乎适用于我正在运行的测试页面,但没有用于我试图真正为其工作的那个测试页面。非测试页面的操作表单指向主页的URL,所以我不积极做什么。 – 2010-06-17 13:46:37

+0

很可能,您登录的页面正在使用Javascript发布到除index.html文件以外的url。您可能需要查看Javascript以查看将值发布到哪里。 – 2010-06-17 13:51:41

回答

3

正如你正在解决这个问题,我建议获得一个像FireBug或LiveHTTPHeaders的浏览器插件(我建议Firefox插件,但也有类似的其他插件浏览器也是如此)。然后,您可以对该网站发出请求并查看传递给目标服务器的操作(URL),方法和表单参数。这可能有助于阐明问题的症结所在。

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

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

+0

不BeautifulSoup只处理屏幕抓取?我不认为它处理表单信息和发布数据。 – 2010-06-17 14:47:11

+0

你是对的 - 我同时使用ClientForm和BeautifulSoup。 ClientForm处理表单和HTTP操作,而BeautifulSoup处理HTML解析,这在处理认证后特别有用。 – 2010-06-18 11:05:35

+0

嗯,我仍然无法让pycurl为我想要的网站工作(虽然这很奇怪,但是我喜欢你的建议,所以我会给你信誉的答案。谢谢! – 2010-06-18 14:18:42

2

一个金科玉律,你需要“刹车冰”,已经启用调试试图解决pycurl例如当:

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


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

不错的工作,很大的努力,+1为你:) – sohom 2015-12-01 06:27:17