我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用nodejs怎么抓取页面的始末

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用nodejs怎么抓取页面的始末

使用nodejs怎么抓取页面的始末,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

事由以及动机

2015年9月份全国研究生数学建模竞赛的F题,旅游线路规划问题。其中需要自己去查很多数据。例如所给201个***级景区的位置,以及景区距离所 在省会距离等等~开始队友小伙伴准备从百度手动去一个一个查询,但是效率极低,在这么短的时间内,需要收集这么多数据是多么的耗时,并且也不能把大把时间 花费在查资料上,虽然说查资料是必须的,题目也鼓励我们从网上查询相关数据,因此在团队中的我就想到了让计算机帮我们去做这件事。

***步,确定想要抓取的信息,获取数据服务api

以查询个两地的行车时间为例,我们以百度地图为例,见下图

使用nodejs怎么抓取页面的始末

先打开需要去请求数据的网页,打开开发人员工具(我用的是chrome),选择Network选项卡,输入需要查询的内容(tips:先清除掉之前的网络获取纪录,以方便接下来的借接口分析)。

点击“查询”,并监控网络数据流,会发现网页发起了很多的http请求,并返回了结果。

使用nodejs怎么抓取页面的始末

通过分析所有请求,拿到想要的请求接口(一般情况下,都不会是Type为图片类型的,并且耗时较长的)。

点击某个请求时能看到该请求的详细信息

使用nodejs怎么抓取页面的始末

查看请求的头部信息Headers

使用nodejs怎么抓取页面的始末

拿到请求的地 址:requestURL,例如:http://map.baidu.com/?newmap=1&reqflag=pcmap& biz=1&pcevaname=pc2&da_par=direct&from=webmap&qt=nav&da_class="lazy" data-src=pcmappg.searchBox.button&c=289&sn=2$$$$$$%E4%B8%8A%E6%B5%B7%E5%B8%82$$0$$$$&en=2$$$$$$%E5%8C%97%E4%BA%AC%E5%B8%82$$0$$$$&sc=289&ec=289&rn=5&extinfo=63&tn=B_NORMAL_MAP&nn=0&ie=utf-8&l=12&b=(13503777.31,3639994.64;13542753.31,3642234.64)&t=1443022534161

并分析,一般我们要看的是URL中的querey部分,也就是?后面的内容,一般来说由很多(字母+百分号)构成的为中文字符,是汉字被url转码获得。可以把该地址拿到地址栏查询一下,汉字的内容

使用nodejs怎么抓取页面的始末

那我们的数据服务API就拿到了

编写数据访问页面

接下来就是利用XMLHTTPRequerst来调取他人的服务了

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>getData</title> </head> <body>     <script class="lazy" data-src="http://code.jquery.com/jquery-2.1.4.min.js"></script>     <script>         var sn="北京市";         var en="上海市";         var url="http://map.baidu.com/?newmap=1&reqflag=pcmap&biz=1&pcevaname=pc2&da_par=direct&from=webmap&qt=nav&da_class="lazy" data-src=pcmappg.searchBox.button&c=289&sn=2$$$$$$"+         sn+"$$0$$$$&en=2$$$$$$"+         en+"$$0$$$$&sc=289&ec=289&rn=5&extinfo=63&tn=B_NORMAL_MAP&nn=0&ie=utf-8&l=12&b=(13503777.31,3639994.64;13542753.31,3642234.64)&t=1443022534161";          $.ajax({             url:url,             type:"get",             success:function(res){                 console.log(res)             },             error:function(e){                 console.log(e)             }         })     </script> </body> </html>  html

使用nodejs怎么抓取页面的始末

运行察看结果:

使用nodejs怎么抓取页面的始末

跨域提示错误,跨域(见为什么浏览器不能跨域http://www.cnblogs.com/alvinwei1024/p/4626054.html)是浏览器的行为。

方法1: 通过jsonp的方法

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>getData</title> </head> <body>     <script class="lazy" data-src="http://code.jquery.com/jquery-2.1.4.min.js"></script>     <script>         var sn="北京市";         var en="上海市";         var url="http://map.baidu.com/?newmap=1&reqflag=pcmap&biz=1&pcevaname=pc2&da_par=direct&from=webmap&qt=nav&da_class="lazy" data-src=pcmappg.searchBox.button&c=289&sn=2$$$$$$"+         sn+"$$0$$$$&en=2$$$$$$"+         en+"$$0$$$$&sc=289&ec=289&rn=5&extinfo=63&tn=B_NORMAL_MAP&nn=0&ie=utf-8&l=12&b=(13503777.31,3639994.64;13542753.31,3642234.64)&t=1443022534161";          $.ajax({             url:url,             type:"get",             dataType:"jsonp",              jsonp:"callback",             success:function(res){                 console.log(res)             },             error:function(e){                 console.log(e)             }         })     </script> </body> </html>  html

使用nodejs怎么抓取页面的始末

运行结果:获取到想要的数据

使用nodejs怎么抓取页面的始末

可以拿到,北京到上海的距离1208548,时间48617以及距离等。

  1. dis: 1208548

  2. kps: Array[38]

  3. rss: Array[38]

  4. taxi: Object

  5. time: 48617

  6. toll: 580

方法二:CORS

除了方法以利用jsonp跨域外,还可以通过服务器做一个代理,通过cors绕过原来资源不允许跨域的限制。

本文利用node来做服务器,原因很简单,最方便,几句代码就能搞定,方便又快捷。

var http = require('http'); var request_ = require('request'); var urlencode2=require("urlencode2"); var url=require('url') http.createServer(function (request, response) {      var arg1 = url.parse(request.url, true).query;      var sn=arg1.sn;     var en=arg1.en;     var req_url="http://api.map.baidu.com/?qt=nav&c=131&sn=2%24%24%24%24%24%24%20"+           urlencode2(sn,'gbk')+"%24%240%24%24%24%24&en=2%24%24%24%24%24%24"+           urlencode2(en,'gbk')+"%24%240%24%24%24%24&sy=0&ie=utf-8&oue=1&fromproduct=jsapi&res=api&callback=BMap._rd._cbk54249";       request_.get({             url:req_url,             json:true         },         function(error, response_, body) {           if (!error && response_.statusCode == 200) {             var res=-1;             if(body){               res=body.split(',"toll":')[0];//time  s               res=res.split('"time":')[2];               console.log(res)               if(!res){                 res=-1;               }               else{                 res=res/60;               }             }             response.writeHead(200, {                 "Content-Type": "text/html; charset=UTF-8",                 'Access-Control-Allow-Origin':request.headers.origin             });             response.end(res+'\n');           }           else{             // console.log(error)           }         }     ) }).listen(8888); // 终端打印如下信息 console.log('Server running at http://127.0.0.1:8888/');  nodejs

使用nodejs怎么抓取页面的始末

其中,本文用到了request(用于发起http请求)模块和urlencode2(主要用于URLEncode)模块

request安装:

npm install request

详见:https://github.com/request/request

urlencode2安装:

详见:https://github.com/node-modules/urlencode

1 var http = require('http');
2 http.createServer(function (request, response) {
3 //...
4 response.end('welcome baby');
5 }).listen(8888);

这几句简单的代码就搭建了一个web服务,端口号是8888

$ node 文件名.js

在终端输入以上指令即可允许该服务。

1 var arg1 = url.parse(request.url, true).query;
2     var sn=arg1.sn;
3     var en=arg1.en;
4     var req_url="http://api.map.baidu.com/?qt=nav&c=131&sn=2%24%24%24%24%24%24%20"+ 5           urlencode2(sn,'gbk')+"%24%240%24%24%24%24&en=2%24%24%24%24%24%24"+ 6           urlencode2(en,'gbk')+"%24%240%24%24%24%24&sy=0&ie=utf-8&oue=1&fromproduct=jsapi&res=api&callback=BMap._rd._cbk54249";

以上是获取查询参数并拼接请求字符串

然后利用request向目标服务器发送请求,并解析出需要的信息

最重要的是以下代码:

1  response.writeHead(200, {
2       "Content-Type": "text/html; charset=UTF-8", 3       'Access-Control-Allow-Origin':request.headers.origin 4 }); 5 response.end(res+'\n');

允许所有用户跨域访问,因此我们就能访问自己搭建的web服务了。

我在前端页面只需,请求我们的地址http://localhost:8888

并且指定sn(start node)与 en(end node)一并发送到服务器即可。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用nodejs怎么抓取页面的始末

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

android使用Jsoup 抓取页面的数据

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。Jsoup的官方中文地址:http://www.o
2022-06-06

python爬虫时怎么使用R连续抓取多个页面

这篇文章将为大家详细讲解有关python爬虫时怎么使用R连续抓取多个页面,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。当抓取多页的html数据,但容易被困在通用方法部分的功能上,而导致无法实现连续抓取多个
2023-06-20

Python使用lxml模块和Requests模块抓取HTML页面的教程

Web抓取 Web站点使用HTML描述,这意味着每个web页面是一个结构化的文档。有时从中 获取数据同时保持它的结构是有用的。web站点不总是以容易处理的格式, 如 csv 或者 json 提供它们的数据。 这正是web抓取出场的时机。We
2022-06-04

Python使用urllib2模块抓取HTML页面资源的实例分享

先把要抓取的网络地址列在单独的list文件中http://www.lsjlt.com/article/83440.html http://www.lsjlt.com/article/83437.html http://www.lsjlt.c
2022-06-04

Python爬虫之怎么使用BeautifulSoup和Requests抓取网页数据

这篇文章主要介绍了Python爬虫之怎么使用BeautifulSoup和Requests抓取网页数据的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python爬虫之怎么使用BeautifulSoup和Reque
2023-07-05

怎么在JavaScript中使用dom获取页面元素

怎么在JavaScript中使用dom获取页面元素?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应
2023-06-14

怎么用JavaScript获取和计算页面元素的offset

这篇文章主要介绍“怎么用JavaScript获取和计算页面元素的offset”,在日常操作中,相信很多人在怎么用JavaScript获取和计算页面元素的offset问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
2023-06-08

怎么使用nodejs实现一个简单的网页爬虫功能

这篇文章主要介绍了怎么使用nodejs实现一个简单的网页爬虫功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。网页源码  使用http.get()方法获取网页源码,以hao1
2023-06-06

怎么使用PHP实现带参数的页面跳转

本篇内容介绍了“怎么使用PHP实现带参数的页面跳转”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、GET方法传递参数GET方法通过URL传
2023-07-05

vue多页面前端项目的命令怎么使用

今天小编给大家分享一下vue多页面前端项目的命令怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先,让我们创建一个基
2023-07-06

Win10怎么清除主页界面最近使用的文件让界面更简洁些

主页是Win10系统中新引入的一个文件管理器界面,用来使显示最近使用的文件和经常访问的文件,可以说是一个非常快捷的方式,但如果使用久了,你就会发现界面快捷文件会很多很乱,也会暴露隐私,这时候最好的方法就是清除主页界面最近使用的文件。pKyJ
2023-06-10

编程热搜

目录