如何让Python的Mechanize发布ajax请求?

时间:2010-07-12 02:46:59

标签: python mechanize

我正在尝试蜘蛛的网站正在使用javascript:

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

通过我需要蜘蛛的ajax获取额外信息。我尝试了各种各样的排列:

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

让Mechanize获取页面,但它总是导致我再次获取登录HTML,表明出现了问题。根据Firebug,Firefox似乎没有向POST添加任何HTTP数据,并且我添加了一个空字段来尝试强制urlopen使用“POST”而不是“GET”,希望站点忽略该字段。我认为Mechanize的urlopen包括cookies。但是作为HTTPS,很难将事务线路化为调试。

有更好的方法吗?

对于Mechanize,似乎没有合适的API文档,只是示例。这很烦人。

1 个答案:

答案 0 :(得分:8)

这就是我想出来的:

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)

有趣的是在机械化调用中的“”。强制它进入“POST”模式。显然,该网站没有在一个空间内窒息:)

它也需要cookie。我使用以下方法调试了标题:

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的展示。