网页数据抓取怎么写( 爬虫爬取的流程和最终如何展示数据的地址?)

优采云 发布时间: 2021-12-09 12:05

  网页数据抓取怎么写(

爬虫爬取的流程和最终如何展示数据的地址?)

  教你写一个登录+数据展示的NodeJS爬虫

  其实我之前做过利马理财的销售统计,不过是前端js写的。需要在首页的控制台调试面板中粘贴一段代码执行,点击这里。主要目的是通过定时爬取异步接口来获取数据。然后通过一定的去重算法得到最终的数据。但这有以下缺点:

  1. 代码只能在浏览器窗口运行,关闭浏览器或关闭电脑都会失效

  2. 只能抓取一个页面的数据,不能整合其他页面的数据

  3. 爬取的数据无法本地存储

  4. 以上异步接口数据会被部分过滤,导致我们的去重算法失败

  最近学习了节点爬虫,我们可以在后台模拟请求,爬取页面数据。而且我开通了阿里云服务器,我可以把代码放到云端运行。这样1、2、3都可以解决。4因为我们不知道这个ajax界面每三分钟更新一次,这样我们就可以以此为基础对权重进行排序,保证数据不会重复。说起爬虫,大家想到的更多的是python。确实,python有Scrapy等成熟的框架,可以实现非常强大的爬虫功能。但是node也有自己的优势。凭借其强大的异步特性,可以轻松实现高效的异步并发请求,节省CPU开销。其实节点爬虫比较简单,让'

  在线地址

  一、 爬虫进程

  我们的最终目标是爬取利马财经每天的销售额,知道销售了哪些产品,哪些用户在什么时间点购买了每种产品。首先介绍一下爬取的主要步骤:

  1. 结构分析

  我们要抓取页面的数据。第一步当然是分析页面结构,抓取哪些页面,页面的结构是什么,不需要登录;有没有ajax接口,返回什么样的数据等

  2. 数据采集

  分析清楚要爬取哪些页面和ajax,需要爬取数据。现在网页的数据大致分为同步页面和ajax接口。同步页面数据的爬取需要我们首先分析网页的结构。Python爬取数据一般是通过正则表达式匹配来获取需要的数据;node有一个cheerio工具,可以将获取到的页面内容转换成jquery对象。然后就可以使用jquery强大的dom API来获取节点相关的数据了。其实看源码,这些API本质上都是正则匹配。ajax接口数据一般都是json格式,处理起来比较简单。

  3. 数据存储

  捕获数据后,它会做一个简单的筛选,然后将需要的数据保存起来,以便后续的分析和处理。当然我们可以使用MySQL、Mongodb等数据库来存储数据。这里,为了方便,我们直接使用文件存储。

  4. 数据分析

  因为我们最终要展示数据,所以需要按照一定的维度对原创数据进行处理和分析,然后返回给客户端。这个过程可以在存储过程中进行处理,也可以在显示过程中,前端发送请求,后端获取存储的数据后再进行处理。这取决于我们希望如何显示数据。

  5. 结果展示

  做了这么多功课,一点显示输出都没有,怎么不甘心?这又回到我们的老本行了,前端展示页面大家应该都很熟悉了。将数据展示更直观,方便我们进行统计分析。

  二、常见爬虫库介绍1. Superagent

  Superagent 是一个轻量级的 http 库。是nodejs中一个非常方便的客户端请求代理模块。当我们需要进行get、post、head等网络请求时,试试吧。

  2. 啦啦队

  Cheerio可以理解为jquery的一个Node.js版本,用于通过css选择器从网页中检索数据,用法和jquery完全一样。

  3. 异步

  async 是一个流程控制工具包,提供了直接强大的异步函数mapLimit(arr,limit,iterator,callback),我们主要使用这个方法,可以去官网看API。

  4. arr-del

  arr-del 是我自己写的一个删除数组元素的工具。通过传入由要删除的数组元素的索引组成的数组,可以一次性删除它。

  5. arr-sort

  arr-sort 是我自己写的一个数组排序方法的工具。可以根据一个或多个属性进行排序,支持嵌套属性。而且可以在每个条件中指定排序方向,传入比较函数。

  三、页面结构分析

  让我们重复爬行的想法。利马理财网上的产品主要是普通的和利马金库(新推出的光大银行理财产品,手续繁琐,初期投资额高,所以基本没人买,所以我们不在这里计算它们)。定期我们可以爬取财富管理页面的ajax界面:。(更新:近期定期断货,可能看不到数据,1月19日前可以看到数据) 数据如下图:

  

  这包括所有在线销售的常规产品。Ajax数据只有产品本身的信息,比如产品id、募集金额、当前销售额、年化收益率、投资天数等,没有关于谁购买了产品的信息。. 所以我们需要去它的商品详情页面用id参数进行爬取,比如Lima Jucai-December HLB01239511。详情页有一栏投资记录,里面有我们需要的信息,如下图:

  

  但是,详情页只有在我们登录后才能查看,这就需要我们访问cookies,cookies是有有效期的。如何让我们的 cookie 保持登录状态?请稍后再看。

  其实Lima Vault也有类似的ajax接口:,只是里面的相关数据是硬编码的,毫无意义。并且金库的详情页也没有投资记录信息。这就需要我们爬取我们开头所说的主页的ajax接口:。但是后来我发*敏*感*词*库的统计数据会比真实的少。

  四、爬虫代码分析1. 获取登录cookie

  因为商品详情页需要登录,所以我们需要先获取登录cookie。getCookie 方法如下:

  function getCookie() {

superagent.post('https://www.lmlc.com/user/s/web/logon')

.type('form')

.send({

phone: phone,

password: password,

productCode: "LMLC",

origin: "PC"

})

.end(function(err, res) {

if (err) {

handleErr(err.message);

return;

}

cookie = res.header['set-cookie']; //从response中得到cookie

emitter.emit("setCookeie");

})

}

  手机号和密码参数是从命令行传入的,就是用你的手机号登录的账号和密码。我们使用superagent来模拟请求即时理财登录界面:。传入相应的参数。在回调中,我们获取头部的 set-cookie 信息,并发送一个 setCookeie 事件。因为我们设置了*敏*感*词*事件:emitter.on("setCookie", requestData),一旦拿到cookie,就会执行requestData方法。

  2. 财务管理页面的Ajax爬取

  requestData方法的代码如下:

<p>function requestData() {

superagent.get(&#39;https://www.lmlc.com/web/product/product_list?pageSize=100&pageNo=1&type=0&#39;)

.end(function(err,pres){

// 常规的错误处理

if (err) {

handleErr(err.message);

return;

}

// 在这里清空数据,避免一个文件被同时写入

if(clearProd){

fs.writeFileSync(&#39;data/prod.json&#39;, JSON.stringify([]));

clearProd = false;

}

let addData = JSON.parse(pres.text).data;

let formatedAddData = formatData(addData.result);

let pageUrls = [];

if(addData.totalPage > 1){

handleErr(&#39;产品个数超过100个!&#39;);

return;

}

for(let i=0,len=addData.result.length; i

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线