В настоящее время я пытаюсь разобраться в 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()

EDIT: как указал Питер, URL-адрес должен указывать на URL-адрес входа, но сайт, на котором я пытаюсь заставить это работать, не может показать мне, какой это будет URL-адрес. Действие формы просто указывает на домашнюю страницу (/index.html)

1
The Jug 17 Июн 2010 в 01:21

2 ответа

Лучший ответ

По мере устранения этой проблемы я предлагаю установить плагин для браузера, например FireBug или LiveHTTPHeaders (я предлагаю плагины для Firefox, но есть аналогичные плагины и для других браузеров). Затем вы можете выполнить запрос к сайту и посмотреть, какие действия (URL), метод и параметры формы передаются на целевой сервер. Это, вероятно, поможет прояснить суть проблемы.

Если это не поможет, вы можете подумать об использовании другого инструмента для вашей механизации. Я использовал ClientForm и BeautifulSoup, чтобы выполнить аналогичные операции. Основываясь на том, что я прочитал в документах pycURL и вашем коде выше, ClientForm может быть лучшим инструментом для использования. ClientForm проанализирует вашу HTML-страницу, найдет на ней формы (включая формы входа) и построит для вас соответствующий запрос на основе ответов, которые вы предоставите форме. Вы даже можете использовать ClientForm с pycURL ... но, по крайней мере, ClientForm предоставит вам соответствующее действие для POST и создаст все соответствующие параметры.

Однако имейте в виду, что если есть JavaScript, обрабатывающий любую необходимую часть формы входа, даже ClientForm не сможет вам помочь. Вам понадобится что-то, что интерпретирует JavaScript для эффективной автоматизации входа в систему. В этом случае я использовал SeleniumRC для управления браузером (и разрешил браузеру обрабатывать JavaScript).

3
Jason R. Coombs 17 Июн 2010 в 14:19

Одно из золотых правил, вам нужно «затормозить лед», включив отладку при попытке решить пример 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()
2
user1630938user1630938 31 Окт 2013 в 05:48