Pycurl скрипт не может войти на сайт - PullRequest
1 голос
/ 17 июня 2010

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

Ответы [ 2 ]

3 голосов
/ 17 июня 2010

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

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

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

2 голосов
/ 31 октября 2013

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