Как заставить Python Mechanize отправлять запрос ajax POST?

Сайт, который я пытаюсь найти, использует javascript:

request.open("POST", url, true);

Чтобы получить дополнительную информацию через ajax, которую мне нужно найти. Я пробовал различные перестановки:

r = mechanize.urlopen("https://site.tld/dir/" + url, urllib.urlencode({'none' : 'none'}))

чтобы заставить Mechanize получить страницу, но это всегда приводит к тому, что я снова получаю HTML-код для входа, что указывает на то, что что-то не так. Firefox, похоже, не добавляет никаких данных HTTP в POST в соответствии с Firebug, и я добавляю пустое поле, чтобы попытаться заставить urlopen использовать «POST» вместо «GET», надеясь, что сайт проигнорирует это поле. Я думал, что urlopen Mechanize ДЕЙСТВИТЕЛЬНО включает файлы cookie. Но, будучи HTTPS, трудно выполнить проводную транзакцию для отладки.

Есть ли способ лучше?

Также, похоже, нет достойной документации по API для Mechanize, только примеры. Это раздражает.


person fret    schedule 12.07.2010    source источник


Ответы (1)


Вот что я придумал:

req = mechanize.Request("https://www.site.com/path/" + url, " ")
req.add_header("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7")
req.add_header("Referer", "https://www.site.com/path")
cj.add_cookie_header(req)
res = mechanize.urlopen(req)

Что интересно, так это " " в вызове mechanize.Request переводит его в режим "POST". Очевидно, сайт не захлебнулся одним пробелом :)

Печеньки тоже нужны. Я отлаживал заголовки, используя:

hh = mechanize.HTTPHandler()
hsh = mechanize.HTTPSHandler()
hh.set_http_debuglevel(1)
hsh.set_http_debuglevel(1)
opener = mechanize.build_opener(hh, hsh)
logger = logging.getLogger()
logger.addHandler(logging.StreamHandler(sys.stdout))
logger.setLevel(logging.NOTSET)
mechanize.install_opener(opener)

На фоне того, что показывал Firebug.

person fret    schedule 22.07.2010
comment
Как пространство переводит его в режим POST? Разве это не просто данные, или пост определяется как пространство для механизации? - person brainysmurf; 27.11.2010
comment
@brainysmurf Без пробела это GET-запрос, но при предоставлении данных он меняется на POST-запрос, а пробел — это самые маленькие простые данные, которые я мог предоставить. В космосе как таковом нет ничего особенного. - person fret; 31.12.2010