简介:如何使用python Mechanize执行/模拟javascript重定向?
location.href="http://www.site2.com/";
我已经制作了一个带有机械化模块的python脚本,该模块在页面中查找链接并跟随它。
当我这样做时,问题出现在特定网站上
br.follow_link("http://www.address1.com")
他将我重定向到这个简单的页面:
<script language="JavaScript">{
location.href="http://www.site2.com/";
self.focus();
}</script>
现在,如果我这样做:
br = mechanize.Browser(factory=mechanize.RobustFactory())
... #other code
br.follow_link("http://www.address1.com")
for link in br.links():
br.follow_link(link)
print link
它不会打印任何内容,这意味着该页面中没有链接。 但如果我手动解析页面并执行:
br.open("http://www.site2.com")
Site2不承认我来自“www.address1.com”并且脚本无法正常工作!
很抱歉,如果这只是一个新手问题,请提前感谢你!
P.S。我有br.set_handle_referer(True)
编辑:更多信息: 检查与Fiddler2的链接,它看起来像:
获取http://www.site2.com/ HTTP / 1.1主机:www.site2.com连接: keep-alive用户代理:Mozilla / 5.0(Windows NT 6.2; WOW64) AppleWebKit / 537.4(KHTML,与Gecko一样)Chrome / 22.0.1229.94 Safari / 537.4接受: text / html的,应用/ XHTML + xml的,应用/ XML; Q = 0.9, / 的; Q = 0.8 Referer:http://www.address1.com Accept-Encoding:gzip,deflate,sdch Accept-Language:it-IT,it; q = 0.8,en-US; q = 0.6,en; q = 0.4
Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.3 Cookie: PHPSESSID = 6e161axxxxxxxxxxx;用户=名为myUsername;
通过= xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; IP = 79.xx.xx.xx;
剂= a220243a8b8f83de64c6204a5ef7b6eb; __utma = 154746788.943755841.1348303404.1350232016.1350241320.43; __utmb = 154746788.12.10.1350241320; __utmc = 154999999; __utmz = 154746788.134999998.99.6.utmcsr =谷歌| utmccn =(有机)| utmcmd =有机| utmctr =%东西%东西%
所以它似乎是一个cookie问题?
答案 0 :(得分:1)
Mechanize无法处理JavaScript,因为它无法解释它,请尝试手动解析您的网站并将此链接传递给br.follow_link
。
答案 1 :(得分:1)
我解决了!这样:
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
...
br.follow_link("www.address1.com")
refe= br.geturl()
req = urllib2.Request(url='www.site2.com')
req.add_header('Referer', refe)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj) )
f = opener.open(req)
htm = f.read()
print "\n\n", htm
答案 2 :(得分:0)
您可以在发出请求之前明确设置HTTP引荐来源标头
br.addheaders = [('Referer', 'http://alpha.com')]
br.open("http://beta.com")
令人惊讶的难以找到官方文档http://wwwsearch.sourceforge.net/mechanize/doc.html
的更多细节答案 3 :(得分:0)
怎么样
br.open("http://alpha.com")
br.follow_link("http://beta.com")
如果您使用br_follow_link
希望将HTTP引荐来源设置为上一页。如果您执行br.open
,就像打开一个新窗口一样,它不会设置HTTP引用标头。
修改即可。好的看起来.follow_link
不接受字符串,而是使用带有属性mechanize.Link
的特殊.absolute_url
对象。你可以伪造它。
>>> class Fake:
... pass
...
>>> x = Fake()
>>> x.absolute_url="http://stackoverflow.com"
>>> br.follow_link(x)
<response_seek_wrapper at 0x2937af8 whose wrapped object = <closeable_response at 0x2937f08 whose fp = <socket._fileobject object at 0x02934970>>>
>>> br.title()
'Stack Overflow'
或制作一个真正的mechanize.Link
,它不那么黑,但更乏味。