Mechanize + Python:如何在简单的javascript中关注链接?

时间:2012-10-14 10:36:02

标签: javascript python mechanize referer

简介:如何使用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问题?

4 个答案:

答案 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,它不那么黑,但更乏味。