您的位置:首页 > Web前端 > Node.js

两种网页爬虫技术实现跨域(nodejs+java)(解决'X-Frame-Options'问题)

2018-08-08 17:26 369 查看
版权声明:如有转载请注明出处 https://blog.csdn.net/hdp134793/article/details/81512210

一.方法介绍:

在自己的多次百度方法尝试过程中,主要有两种方法推荐如下
1.使用iframe标签嵌套,然后将iframe的src设置成外网的链接,这样的话就可以把别人的网站加载进来,里面的dom结构和数据什么的都随便你去取(页面中能看到的)。
2.通过nodejs爬虫技术实现(针对那些已经安装nodejs的可以去尝试,不然先安装nodejs)

但是我个人更推荐nodejs来做,主要原因是现在很多网页都针对iframe引用网页做了拦截,所以当你使用iframe的时候就会发现存在这个问题。
Refused to display ‘http://www.xxx.com/’ in a frame because it set ‘X-Frame-Options’ to ‘sameorigin’.
也就是说很多网页通过设置’X-Frame-Options’来防止网页放在iframe中,这样的话就不能达到自己想要的效果。包括今后自己的网页都可以通过这方式来做限制。其次node爬虫相对其他语言(比如Python)性能更好,是服务器端的js且异步,爬网页数据更具优势。

二.Nodejs怎么去实现爬虫技术?

1.主要知识点介绍
Request模块:主要作用是用来请求网页的。
Cheerio模块:主要是分析页面中的dom结构的。
2.具体实现过程
A.nodejs项目的搭建,这个可以看我之前的博客,里面有相对详细的介绍。在一个空的项目文件夹下执行nmp init命令进行初始化node项目,这样的话在你创建的文件夹下会生成一个package.json文件
B.依赖版本的更新,针对文件中的新增下面一行
“dependencies”: { “cheerio”: “0.12.3”, “request”: “2.27.0” }
然后执行nmp update这样的话会自动从仓库将最新依赖版本进行更新
3.编写代码模块,新建一个index.js文件
代码如下(内含注释):

//定义有关页面请求模块和dom解析模块
var request = require('request');
var cheerio = require('cheerio');
/*var getNewsList=function(done) {
request('http://jwc.scu.edu.cn/jwc/frontPage.action', function (err, res) {
if (err) return console.error(err);
var $ = cheerio.load(res.body.toString());
});
};*/
var getNewsList=function(done) {
var news = new Array();
request('https://www.cnblogs.com/b-code/p/6178535.html', function (err, res) {
if (err) return console.error(err);
var t = setTimeout(function(){
//核心代码模块,通过cheerio来分析dom结构
var $ = cheerio.load(res.body.toString());
//解析获取的dom结构,从中获取你想要的数据或者dom结构
var table=$('body').children('div').eq(0).html();

console.log(table);
},1000)

});
};
getNewsList();

4.执行该js文件node index.js,这样的话在控制台会打印出你所需要的数据。

三.执行这个过程中遇到的问题

关于很多时候会出现关于cannot find module ‘xxx’系列的东西,解决方法基本都是nmp install xxx

四.思维拓展

我们如何通过java来实现从服务器上面捞数据(前提是知道捞取文件的路径)
代码如下:

@ResponseBody
@RequestMapping(value = "/getTxtdata")
public String getTxtdata(String urlstr){
//这个urlstr我是通过前端传递过来的,然后把读取到的数据string形式返回给前端
String returnstr = "no data";
URL myurl;
try {
myurl = new URL(urlstr);
URLConnection uc;
try {
uc = myurl.openConnection();
InputStreamReader isr=new InputStreamReader(uc.getInputStream());//获取服务器端字节流
BufferedReader br=new BufferedReader(isr);//读文件
String s=br.readLine();//读行
returnstr = s;
System.out.println(s);//输出
br.close();//关闭
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//创建连接

} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//创建URL对象
return returnstr;
}

这样前后端数据进行交互,就可以在很大程度上面规避访问X-Frame-Options的问题啦

测试不易,喜欢的话关注下或者给点赞赏吧!

皮一下很开心,这个zfb二维码是认真的,实在土豪可以扫一扫扶贫,>=10元的将将代写表白情诗一首
(支付宝加好友(2393703536@qq.com)私发对象名字)

扶贫1元(备注城市)即上榜,看看有多少人

自己购买云服务,写了一套代码表示感谢,感恩我是认真的
http://www.bcodelove.top:8080/bcode/jsp/apphome/rewardlist/rewardlist.html

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: