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

fre*_*ret 6 python mechanize

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

request.open("POST", url, true);
Run Code Online (Sandbox Code Playgroud)

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

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

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

有没有更好的办法?

此外,似乎没有适合Mechanize的API文档,只是示例.这很烦人.

fre*_*ret 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)
Run Code Online (Sandbox Code Playgroud)

有趣的是在机械化调用中的"".强制它进入"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)
Run Code Online (Sandbox Code Playgroud)

反对Firebug展示的内容.

  • @brainysmurf没有空间它是一个GET请求,但通过提供一个数据,它改变为一个POST请求,一个空格是我能提供的最小的最简单的"数据".空间本身并没有什么特别之处. (2认同)