什么是爬虫
这里所说的爬虫是指通过程序脚本将互联网上的网站信息下载到本地,然后提取需要的数据信息。其原理可以参照https://www.cnblogs.com/xingzc/p/5986464.html。
准备工具
node环境,cheerio(主要是解析下载的网页可以像jquery一样骚操作,必备,使用也很简单可以上npm上查看文档)。iconv-lite(主要解决下载的资源乱码问题)。正则表达式(如果是接口数据的话有些关键参数是在script中,需要通过正则提取出来)
大概的爬去代码如下
const cheerio = require('cheerio');
const http = require('http');
const iconv = require('iconv-lite');
// 如果是https协议的网站,这里改用https就可以了
// 请求头最好设置为user-agent,不然有的网站爬不到,做了限制爬虫爬取网页
const options = {
url: 'http://xxxxx',
header: {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.'
}
}
http.get(options, function(res) {
const chunks = [];
res.on('data', function(chunk) {
chunks.push(chunk);
});
res.on('end', function() {
//查看网页源代码编码方式,设置对应的编码格式
const html = iconv.decode(Buffer.concat(chunks), 'gb2312');
//html就是下载到的资源了,
console.log(html);
const $ = cheerio.load(html);
//接下来就是对数据的处理了,jquery怎样操作,你就怎么操作
});
爬取接口数据,源码中找加密线索
这段代码基本上能爬很多网页了。那么有些网页数据其实是在通过ajax拉取数据在渲染页面的。比如看下https://www.newrank.cn/public/info/list.html?period=day&type=data这个网页我们爬去新榜数据的时候
1537113840975.jpg这里的数据就是通过接口获取。所有我们需要分析接口。 3.jpg
首先分析以下接口是使用post方式提交数据,所有这里可以使用request或者http.post都可以。看一下参数主要是nonce和xyz这两个字段是属于一种加密都方式,所以我们需要获取它的加密方式。那么我们就得去源代码中找信息了。通过chrome的调试工具我们到source下找源代码 2.jpg
因为代码混淆过,但是像这种传输字段是不会被混淆的。首先把代码展开然后ctrl + f 在该js文件中搜索关键字段nonce。找到了之后打上一个断点,刷新浏览器看是否会执行到这个验证我们到猜测。
从上图可以看到,确实是如我们所想,那两个加密字段就是在这里生成的。我们只需要找到对应的算法函数拷贝到本地,然后在每次请求到时候生成对应到加密密码,这样在该网站服务器上就能正确到解析到了。
这里的技巧就是根据关键信息,到源码(chrome浏览器是在source调试tab下)中找线索,因为只要是在前端到东西,都是透明的。还有就是断点的方式,让你更快的找到线索。
爬虫数据来自Jsonp
数据可能不止是网页那么简单。当数据通过Jsonp传输的时候,遇到这种情况下使用eval就可以解决。Jsonp是通过script标签加载一段js脚本,这个脚本会有一个函数,当加载完之后就会执行里面的脚本。一般会在请求路径中加一个callback参数,这个值就是加载脚本中定义的函数名。![ 1537116791260.jpg 1537116778533.jpg这个是腾讯网首页一个jsonp。可以看出js脚本中定义了一个方法,参数是一个数组。那么如果在爬虫中我们要怎样取获取这个数组呢?
const options = {
url: 'https://dp3.qq.com/dynamic?get_type=cm&ch=www&callback=crystal.cookieMapping',
header: {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.'
}
}
https.get(options, function(res) {
const chunks = [];
res.on('data', function(chunk) {
chunks.push(chunk);
});
res.on('end', function() {
const jsonP = iconv.decode(Buffer.concat(chunks));
const crystal = {
cookieMapping (arr) {
return arr
}
}
// 必须定义对象crystal和方法cookieMapping,否则下面执行eval会报错。
// 如果是一些动态的callback 可以这样
// function jqx(obj) {
// return obj
// }
// url: 'https://dp3.qq.com/dynamic?get_type=cm&ch=www&callback=jqx',
// 总之callback的值一定要先定义
//
const data = eval(jsonP); //这里就拿到了数组[{"id":"13","url":"//cm.l.qq.com/?Bid=5bdbc925ad7403a84d1459393b1ddc05"},{"id":"14","url":"//cm.l.qq.com/?Bid=dca6ea17cca2289887e097157db2998a"},{"id":"15","url":"//cm.l.qq.com/?Bid=05d485d64761beaacc678aeefb1269fb"}]
});
爬虫是一个很好玩的编程,小伙伴们可以自行研究研究。
网友评论