Node JS爬虫:爬取瀑布流网页高清图
原文链接:Node JS爬虫:爬取瀑布流网页高清图
静态为主的网页往往用get方法就能获取页面所有内容。动态网页即异步请求数据的网页则需要用浏览器加载完成后再进行抓取。本文介绍了如何连续爬取瀑布流网页。
在知乎提到python
就必有一大帮人提起爬虫,咱Node JS
爬虫也是非常简单的,和python
相比仅仅是“异步”和“多线程”的性能对比而已。对python
了解不多,故对此不做评价。
phantomjs是一个‘无壳’的chrome
,具体安装方法查看phantomjs.org。phantomjs
提供命令行工具运行,运行需使用命令phantom xxx.js
。使用phantom-node
这个库可以在Node Js
中把玩phantomjs
,这样就可以使用pm2
进行进程守护和负载均衡了。
目标
爬取200张以上的1920*1080
分辨率的动漫壁纸,网页是百度瀑布流图片
方式
瀑布流是根据页面滚动位置来判断是否继续往下加载,故要利用phantomjs
滚动页面来获取更多图片链接。单个图片详细页面刚进入时是压缩过的图片,这是百度优化访问速度的措施,等待几秒图片src就会替换成大图的链接。因此,进入图片详细页时应延迟几秒再获取图片src,具体延迟几秒视你网速而定。
步骤
获取链接
首先利用phantom打开网页
const phantom = require('phantom')
(async function() {
const instance = await phantom.create();
const page = await instance.createPage();
const status = await page.open(url);
const size = await page.property('viewportSize', {
width: 1920,
height: 1080
})
}())
获取链接数量,不足200则滚动网页
// 添加一个延时函数,等待页面加载后再滚动
function delay(second) {
return new Promise((resolve) => {
setTimeout(resolve, second * 1000);
});
}
async function pageScroll(i) {
await delay(5)
await page.property('scrollPosition', {
left: 0,
top: 1000 * i
})
let content = await page.property('content')
let $ = cheerio.load(content)
console.log($('.imgbox').length)
if($('.imgbox').length < 200) {
await pageScroll(++i)
}
}
await pageScroll(0)
提取图片链接
let urlList = []
$('.imgbox').each(function() {
urlList.push('https://image.baidu.com'+$(this).find('a').attr('href'))
})
保存图片
定义保存图片的函数
const request = require('request')
const fs = require('fs')
function save(url) {
let ext = url.split('.').pop()
request(url).pipe(fs.createWriteStream(`./image/${new Date().getTime()}.${ext}`));
}
遍历urlList
,建议用递归遍历,循环遍历delay
不起作用
async function imgSave(i) {
let page = await page.open(urlList[i])
delay(1)
let content = await page.property('content')
$ = cheerio.load(content)
let src = $('#currentImg').attr('src')
save(src)
if(i<urlList.length) {
await imgSave(++i)
}
}
await imgSave(0)
最后爬取结果如图,都是高分辨率的,部分图片做了防爬处理
完整代码
const phantom = require('phantom')
const cheerio = require('cheerio')
const request = require('request')
const fs = require('fs')
function delay(second) {
return new Promise((resolve) => {
setTimeout(resolve, second * 1000);
});
}
let url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%8A%A8%E6%BC%AB+%E5%A3%81%E7%BA%B8&oq=%E5%8A%A8%E6%BC%AB+%E5%A3%81%E7%BA%B8&rsp=-1'
function save(url) {
let ext = url.split('.').pop()
request(url).pipe(fs.createWriteStream(`./image/${new Date().getTime()}.${ext}`));
}
(async function() {
let instance = await phantom.create();
let page = await instance.createPage();
let status = await page.open(url);
let size = await page.property('viewportSize', {
width: 1920,
height: 1080
})
let $
async function pageScroll(i) {
await delay(1)
await page.property('scrollPosition', {
left: 0,
top: 1000 * i
})
let content = await page.property('content')
$ = cheerio.load(content)
if($('.imgbox').length < 200) {
await pageScroll(++i)
}
}
await pageScroll(0)
let urlList = []
$('.imgbox').each(function() {
urlList.push('https://image.baidu.com'+$(this).find('a').attr('href'))
})
async function imgSave(i) {
let status = await page.open(urlList[i])
await delay(1)
let content = await page.property('content')
$ = cheerio.load(content)
let src = $('#currentImg').attr('src')
save(src)
if(i<urlList.length) {
await imgSave(++i)
}
}
await imgSave(0)
await instance.exit()
}());
我的博客:www.bougieblog.cn,欢迎前来尬聊。
Node JS爬虫:爬取瀑布流网页高清图的更多相关文章
- Node.js 爬虫爬取电影信息
Node.js 爬虫爬取电影信息 我的CSDN地址:https://blog.csdn.net/weixin_45580251/article/details/107669713 爬取的是1905电影 ...
- Node.js爬虫-爬取慕课网课程信息
第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让 ...
- 养只爬虫当宠物(Node.js爬虫爬取58同城租房信息)
先上一个源代码吧. https://github.com/answershuto/Rental 欢迎指导交流. 效果图 搭建Node.js环境及启动服务 安装node以及npm,用express模块启 ...
- node.js爬虫爬取拉勾网职位信息
简介 用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京.上海.广州.深圳.杭州.西安.成都7个城市的数据,分别以前端.PHP.java.c++.python.Androi ...
- 手把手教你用Node.js爬虫爬取网站数据
个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 开始之前请先确保自己安装了Node.js环境,还没有安装的的童鞋请自行百度 ...
- node js 爬虫爬取静态页面,
先打一个简单的通用框子 //根据爬取网页的协议 引入对应的协议, http||https var http = require('https'); //引入cheerio 简单点讲就是node中的jq ...
- node:爬虫爬取网页图片
代码地址如下:http://www.demodashi.com/demo/13845.html 前言 周末自己在家闲着没事,刷着微信,玩着手机,发现自己的微信头像该换了,就去网上找了一下头像,看着图片 ...
- Node.js/Python爬取网上漫画
某个周日晚上偶然发现了<火星异种>这部漫画,便在网上在线看了起来.在看的过程中图片加载很慢,而且有时候还不小心点到广告,大大延缓了我看的进度.后来想到能不能把先把漫画全部抓取到本地再去看. ...
- Node.js爬虫抓取数据 -- HTML 实体编码处理办法
cheerio DOM化并解析的时候 1.假如使用了 .text()方法,则一般不会有html实体编码的问题出现 2.如果使用了 .html()方法,则很多情况下(多数是非英文的时候)都会出现,这时, ...
随机推荐
- JavaEE中的Cookie的基本使用方法
之前一直使用的是统一登录系统,相关的登录由别的部门开发以及维护.但由于最近项目的需要,我们需要自己开发一套简单的登录功能.因此这里就涉及到了一个Cookie的功能.之前也了解过相关的内容,但这次需要独 ...
- 如何平衡MMO游戏
转自:http://blog.sina.com.cn/s/blog_9f56a65f01013eti.html 前言 这是一篇出自国外博客“Elder Game”的一篇文章,笔者觉得里面很多东西说的很 ...
- CentOS 配置XWIN/VNC
Xwin服务器 CentOS上运维Xwin,在这之前需要理清一些关系: 一, X window 包括xserver 和x client.linux下的xserver 主要有xorg.xfree86, ...
- How to Enabling and Diabling VxDMP devices for use with Oracle ASM
Enable DMP support for ASM to make DMP devices visible to ASM as available disks To make DMP devices ...
- spring与struts有什么区别?
Struts只是一个MVC框架(Framework),用于快速开发Java Web应用.Struts实现的重点在C(Controller),包括ActionServlet/RequestProcess ...
- 问题:C#Chart控件自动添加Series;结果:图形组件Chart动态添加Series
Chart1.DataSource = dtb; string[] strcolor = new string[20]; strcolor[0] = "220, 224, 64, 10&qu ...
- List里将某字段相同的元素合并
工作中遇到将List中某字段相同的元素合并,笔者觉得有必要记录下来,以备以后参考,好了,直接上代码 import java.util.ArrayList; import java.util.List; ...
- DAY8-python异常处理
一.什么是异常 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下 而错误分两种 #语 ...
- windows系统中启动应用需要的端口被别的程序占用
开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...
- with上下文管理基础
import queue import contextlib import time @contextlib.contextmanager def worker_state(xxx,val): xxx ...