网页数据抓取怎么写( 爬虫爬取的流程和最终如何展示数据的地址?)
优采云 发布时间: 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('https://www.lmlc.com/web/product/product_list?pageSize=100&pageNo=1&type=0')
.end(function(err,pres){
// 常规的错误处理
if (err) {
handleErr(err.message);
return;
}
// 在这里清空数据,避免一个文件被同时写入
if(clearProd){
fs.writeFileSync('data/prod.json', JSON.stringify([]));
clearProd = false;
}
let addData = JSON.parse(pres.text).data;
let formatedAddData = formatData(addData.result);
let pageUrls = [];
if(addData.totalPage > 1){
handleErr('产品个数超过100个!');
return;
}
for(let i=0,len=addData.result.length; i