机械化+的Python:如何遵循一个简单的JavaScript的链接?(Mechanize + Py

2019-09-27 01:32发布

简而言之:如何执行/模拟与蟒蛇机械化的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")

站点2不承认,我来自“www.address1.com”和脚本不工作,我想!

很抱歉,如果它只是一个新手的问​​题,并预先感谢您!

PS我有br.set_handle_referer(真)

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

GET http://www.site2.com/ HTTP / 1.1主机:www.site2.com连接:保持活跃的User-Agent: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接受编码:gzip,放气,SDCH接受语言:它-IT,它; q = 0.8,EN-US; q = 0.6,连接; q = 0.4
接收字符集: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的问题?

Answer 1:

机械化,不能用JavaScript处理,因为它无法解释它,尝试手动解析您的网站,通过这个链接, br.follow_link



Answer 2:

我解决了它! 通过这种方式:

    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


Answer 3:

怎么样

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是少哈克,但比较繁琐。



Answer 4:

你可以让你的请求之前明确设置HTTP引用头

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

在异常困难的更多细节发现官方的文档http://wwwsearch.sourceforge.net/mechanize/doc.html



文章来源: Mechanize + Python: how to follow a link in a simple javascript?