如何让Python的Mechanize发送ajax请求的POST?

6 投票
1 回答
7954 浏览
提问于 2025-04-16 01:09

我想抓取的网站使用了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协议,想用wireshark抓包调试就很困难。

有没有更好的办法呢?

另外,Mechanize似乎没有好的API文档,只有一些例子,这让我很烦恼。

1 个回答

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)

有趣的是,在调用 mechanize.Request 的时候加了一个空格,这样就强制它使用了“POST”模式。显然,这个网站并没有因为一个空格而出错 :)

另外,它还需要一些 cookies。我是通过以下方式调试请求头的:

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 显示的内容进行对比。

撰写回答