1

简短:如何使用 python Mechanize 执行/模拟 javascript 重定向?

location.href="http://www.site2.com/";

我制作了一个带有 mechanize 模块的 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”,并且该脚本无法正常工作!

抱歉,如果这只是一个新手问题,请提前感谢您!

ps 我有 br.set_handle_referer(True)

编辑:更多信息:检查与 Fiddler2 的链接,它看起来像:

GET http://www.site2.com/ HTTP/1.1 主机:www.site2.com 连接:keep-alive 用户代理:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome /22.0.1229.94 Safari/537.4 Accept: text/html,application/xhtml+xml,application/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;用户=我的用户名;
通过=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;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=google|utmccn=(有机)|utmcmd=有机|utmctr=%something%something%

所以这似乎是一个cookie问题?

4

4 回答 4

1

Mechanize 无法处理 JavaScript,因为它无法解释它,请尝试手动解析您的站点并将此链接传递给br.follow_link.

于 2012-10-14T10:37:38.530 回答
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
于 2012-10-14T22:31:12.150 回答
0

您可以在发出请求之前明确设置 HTTP 引荐来源网址

br.addheaders = [('Referer', 'http://alpha.com')]
br.open("http://beta.com")

在令人惊讶的难以找到官方文档中的更多详细信息 http://wwwsearch.sourceforge.net/mechanize/doc.html

于 2012-10-14T10:48:23.223 回答
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或者制作一个不那么老套但更乏味的真实作品。

于 2012-10-14T19:02:48.460 回答