须要安装的依赖:javascript
使用request向须要爬取的网站发起一个请求,在回调里使用body接收数据java
我选取百度图库,做为本次爬取的网站程序员
使用百度搜素二次元萌妹子,而后在地址栏里将URL复制下来正则表达式
const request = require('request');
const options = {
method: "GET",
url: "https://image.baidu.com/search/index?isource=infinity&iname=baidu&tn=baiduimage&word=%E4%BA%8C%E6%AC%A1%E5%85%83%E8%90%8C%E5%A6%B9",
headers:{
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
}
}
//先打印一下,看看是否抓取到了数据
request(options,(err,res,body)=>{
console.log(err);
console.log(res.statusCode);
console.log(body);
})
复制代码
接着,咱们须要对数据,进行处理(对返回的数据,进行分析,拿到咱们想要的数据,这里咱们想要获得数据是图片的URL地址)。npm
处理数据的方式:dom
做为一个程序员,处理字符串,首先想到的固然是正则了异步
使用正则去匹配data-url性能
const request = require('request');
const options = {
method: "GET",
url: "https://image.baidu.com/search/index?isource=infinity&iname=baidu&tn=baiduimage&word=%E4%BA%8C%E6%AC%A1%E5%85%83%E8%90%8C%E5%A6%B9",
headers:{
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
}
}
//先打印一下,看看是否抓取到了数据
request(options,(err,res,body)=>{
const reg = /thumbURL":"https?:\/\/.+?&gp=0.jpg/ig;
const urlArr = body.match(reg);
const msgArr = [];
urlArr.forEach(( val,idx ) => {
const reg = /https?:\/\/.+?&gp=0.jpg/;
msgArr.push(val.match(reg)[0]);
})
console.log(msgArr);
})
复制代码
接着,咱们尝试着将图片下载下来网站
//想要下载图片,就必须请求图片的地址
//访问到图片的静态资源后,使用管道流保存到文件中
//由于I/O操做是异步的,因此使用Promise将代码改写一下
const request = require('request');
const fs = require('fs');//写入文件,须要导入fs模块
const options = {
method: "GET",
url: "https://image.baidu.com/search/index?isource=infinity&iname=baidu&tn=baiduimage&word=%E4%BA%8C%E6%AC%A1%E5%85%83%E8%90%8C%E5%A6%B9",
headers:{
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
}
}
new Promise(( res,rej ) => {
request(options,( err,response,body ) => {
const reg = /thumbURL":"https?:\/\/.+?&gp=0.jpg/ig;
const urlArr = body.match(reg);
const msgArr = [];
urlArr.forEach(( val,idx ) => {
const reg = /https?:\/\/.+?&gp=0.jpg/;
msgArr.push(val.match(reg)[0]);
})
res(msgArr);
})
}).then( msgArr => {
msgArr.forEach(( val,idx ) => {
request(val).pipe(fs.createWriteStream("./img/"+idx+".jpg"));
})
})
复制代码
使用正则,能够解析使用JS渲染的页面,若是发起请求后,body接收的数据返回的是一个页面结构,则能够使用如下两个npm包:ui
jsdom能够将数据解析成DOM结构,cheerio则将数据包装成jQuery
以百度搜索为例,若是要抓取搜索结果的标题内容和连接
//
const request = require("request")
const {JSDOM} = require("jsdom")
//const cheerio = require("cheerio")
const word = encodeURI("二次元萌妹")
request({
url : "https://www.baidu.com/s?wd="+word,
headers:{
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
}
},(err,response,body)=>{
if(err)throw err;
if( response.statusCode >=200 && response.statusCode<300 ){
//JSDOM处理body
let {window} = new JSDOM(body);
let aDOM = window.document.querySelectorAll("h3.t a");
[...aDOM].forEach(ele => {
console.log(ele.text,ele.href);
})
//cheerio处理body
/*let $ = cheerio.load(body); $("h3.t a").each((i,ele)=>{ console.log($(ele).attr("href")); console.log($(ele).text()); })*/
}
});
复制代码
获得的结果