【问题标题】:Mechanize + Python: how to follow a link in a simple javascript?Mechanize + Python:如何在简单的 javascript 中跟踪链接?
【发布时间】:2012-10-15 06:31:12
【问题描述】:

简短:如何使用 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”,并且该脚本无法正常工作!

对不起,如果这只是一个新手问题,提前谢谢你!

附言我有 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,如 Gecko)Chrome/22.0.1229.94 Safari/537.4 接受: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 引用者:http://www.address1.com 接受编码:gzip,deflate,sdch 接受语言:it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie: PHPSESSID=6e161axxxxxxxxxxxxx;用户=我的用户名;
通过=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问题?

【问题讨论】:

  • 快速检查一下,你不是为了滥用推荐奖金而将其机械化吗?
  • URL 是变化了还是总是一样?
  • 不,我没有滥用任何推荐。此外:“location.href”中的地址没有改变,但另一个是。简而言之:www.site2.com 是静态的,www.address1.com 是动态的。谢谢你的回答!
  • 很酷,这意味着您不必从 Javascript 中抓取 site2 的 URL。

标签: javascript python mechanize referer


【解决方案1】:

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

【讨论】:

  • follow_link() 想要一个 Absolute_Url 作为参数,所以看来我不能简单地做类似 br.follow_link("google.com") 的事情,谢谢你的回答!
【解决方案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

【讨论】:

  • 原来是cookie问题?
【解决方案3】:

怎么样

br.open("http://alpha.com") 

br.follow_link("http://beta.com")

如果您使用br_follow_link,希望这会将 HTTP 引荐来源网址设置为上一页。而如果你这样做br.open 就像打开一个新窗口一样,它不会设置 HTTP 引荐来源标头。


编辑。好的,看起来.follow_link 不接受字符串,而是接受具有属性.absolute_url 的特殊mechanize.Link 对象。你可以假装。

>>> 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,它不那么老套,但更乏味。

【讨论】:

  • follow_link() 想要一个 Absolute_Url 作为参数,所以看来我不能简单地做类似 br.follow_link("google.com") 的事情。但无论如何真的很感谢你的回答!跨度>
  • 嘘,它应该那样工作。有另一个想法(见编辑的答案)
  • 它不能按需要工作。事实上,它就像 br.open 一样工作,所以 site2.com 看不到我来自 address1.com
【解决方案4】:

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

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

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

【讨论】:

  • 这似乎是要走的路。但它不起作用。我在答案末尾添加了更多信息。
猜你喜欢
  • 2015-03-24
  • 1970-01-01
  • 2013-03-15
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多