您好,匿名用户
随意问技术百科期待您的加入

JS跨域抓取HTML页面并解析

+1 投票

RT,想通过JS抓取远端的HTML页面并解析页面(能分别解析tag最好,不能的话正则吧)获取内容
不是node.js就是本地的javascript(或者jquery)
想知道这种想法能实现么?

用户头像 提问 2013年 9月10日 @ Malphite 上等兵 (306 威望)
分享到:

1个回答

+1 投票
 
最佳答案

same origin policy

页面中的Javascript只能读取,访问同域的网页。这里需要注意的是,Javascript自身的域定义和它所在的网站没有任何关系,只和该Javascript代码所嵌入的文档的域有关。如以下示例代码:

<!DOCTYPE HTML>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>This is a webpage came from http://localhost:8000</title>
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
</head>
<body>
  <div id="test">123</div>
  <script type="text/javascript">
    console.log($('#test').text());
  </script>
</body>
</html>

该HTML文档来源于http://localhost:8000,这意味着它的域为http://localhost:8000(域和端口也相关),虽然页面中的jquery加载自ajax.googleapis.com,然而该JQuery的域只和它所处的HTML文档的域有关,从而可以访问该HTML文档的属性,因而以上代码可以正常运行。
附:使用上述代码的原因是,开发者将通用的Javascript库(如JQuery)地址指向公共相同的URL。当用户加载过一次该JS后,以后的加载将都通过浏览器缓存,从而加快了页面加载速度。

从这个角度看问题,假如提问者所知的远端指的是互联网上任意的页面,那么不能实现你所期望的功能;如果远端指的是提问者你所拥有控制权的网站,请看下面的Relaxing the same-origin policy;

Relaxing the same-origin policy

  1. Document.domain:用于子域名的情况。对于多个windows(一个页面有多个iframe),通过设置document.domain的值为相同的域,使得Javascript可以访问异域window;
  2. Cross-origin resource sharing:通过在服务器端返回头增加Access-Control-

Allow-Origin,该头部包含了所有允许访问的域的列表。支持的浏览器将允许本页面Javascript访问这些域;

  1. cross-document messaging:该方式和域无关,不同文档的Javascript可以相互发送接受消息而不受限制,然而不能主动趣读取,调用另一个文档的方法属性;

如果提问者拥有远端页面的控制权,可以尝试第二种方法。

服务器端抓取

根据提问者的需求,比较可行的方案应该是在服务器端进行处理。借助(http://phantomjs.org/),你可以使用Javascript语法在服务器端进行DOM操作,同时你可以使用nodejs进行进一步的分析等,当然,你也可以使用Python, php ,Java语言进行后续操作。

参考资料

同源策略
http://en.wikipedia.org/wiki/Same_ori...
Google Hosted Libraries
https://developers.google.com/speed/l...
Cross-origin resource sharing
http://en.wikipedia.org/wiki/Cross-or...
http://www.w3.org/TR/cors/
phantomjs
https://github.com/ariya/phantomjs

用户头像 回复 2013年 9月10日 @ Mordekaiser 上等兵 (232 威望)
选中 2013年 9月7日 @Malphite
提一个问题:

相关问题

+1 投票
1 回复 749 阅读
用户头像 提问 2012年 12月1日 @ Leona 上等兵 (279 威望)
0 投票
1 回复 55 阅读
用户头像 提问 2012年 12月1日 @ Demeter 上等兵 (208 威望)
+1 投票
1 回复 88 阅读
用户头像 提问 2013年 4月10日 @ mongodb 上等兵 (152 威望)
0 投票
1 回复 66 阅读
0 投票
1 回复 95 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...