内容简介:需要安装的依赖:使用request向需要爬取的网站发起一个请求,在回调里使用body接收数据我选取百度图库,作为本次爬取的网站
需要安装的依赖:
- requset
使用request向需要爬取的网站发起一个请求,在回调里使用body接收数据
我选取百度图库,作为本次爬取的网站
使用百度搜素二次元萌妹子,然后在地址栏里将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" } } //先打印一下,看看是否抓取到了数据 requset(options,(err,res,body)=>{ console.log(err); console.log(res.statusCode); console.log(body); }) 复制代码
当看到控制台输出一大串信息后(网页源代码),且没有报错,statusCode返回200,说明正确请求到了数据。
接着,我们需要对数据,进行处理(对返回的数据,进行分析,拿到我们想要的数据,这里我们想要得到数据是图片的URL地址)。
处理数据的方式:
- 正则表达式
作为一个程序员,处理字符串,首先想到的当然是正则了
使用正则去匹配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包:
- jsdom
- cheerio
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()); })*/ } }); 复制代码
得到的结果
可以看到操作十分简便,但是如果数据量大,这种方法性能不佳
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 初探python之做一个简单小爬虫
- RecyclerView使用指南(一)—— 基本使用
- 如何使用Meteorjs使用URL参数
- 使用 defer 还是不使用 defer?
- 使用 Typescript 加强 Vuex 使用体验
- [译] 何时使用 Rust?何时使用 Go?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。