node爬虫(转)

我们先来看看今天的目标: mmjpg.com的美腿频道下的图片

一、实现步骤

使用superagent库来获取页面
分析页面结构,使用cheerio 获取有效信息
保存图片到本地
开撸
不断优化

这儿我们用到了superagent cheerio fs-extra这三个库

$ npm i superagent cheerio fs-extra --save

1.superagent 是nodejs里一个非常方便的客户端请求代理模块
2.cheerio:为服务器特别定制的,快速、灵活、实施的jQuery核心实现
3.fs-extra: 丰富了fs模块,同时支持async/await

二.请求URL获取HTML

app.js 使用superagent发起请求并打印出页面内容

const request = require(‘superagent‘)
const cheerio = require(‘cheerio‘)
const fs = require(‘fs-extra‘)

let url = ‘http://www.mmjpg.com/tag/meitui/‘

request.get(url + ‘1‘).then(function (res) {
    console.log(res.text)
})
// 你就可以看见HTML内容打印到了控制台

三.分析页面结构

使用cheerio来操作了,cheerio语法和jQuery基本一样。

找到class为pic那个div下的列表中,现在我们就可以使用cheerio来获取

async function getUrl() {
    const res = await request.get(url + 1)
    const $ = cheerio.load(res.text)
    $(‘.pic li‘).each(function(i, elem) {
        const href = $(this).find(‘a‘).attr(‘href‘)
        const title = $(this).find(‘.title‘).text()
        console.log(title, href)
    })
}

getUrl()
/*
$ node app.js
长腿美女白一晗巨胸丝袜写真精美图片 http://www.mmjpg.com/mm/1255
大美女尹菲开档网袜写真令人眼花缭乱 http://www.mmjpg.com/mm/1230
宅男女神丰满诱人的胴体令人想入非非 http://www.mmjpg.com/mm/1164
性感美女浴室写真高耸的酥胸诱惑十足 http://www.mmjpg.com/mm/1162
长相清纯甜美的97年妹子苗条美腿图片 http://www.mmjpg.com/mm/1157
丽质美女柔美修长美腿带给你曼妙感受 http://www.mmjpg.com/mm/1153
容貌似杨幂的美女馨怡美腿极致诱惑图 http://www.mmjpg.com/mm/1148
丝袜美腿诱惑!甜美女神杨晨晨私房套图 http://www.mmjpg.com/mm/1130
性感美女刘钰儿透视内衣私密照真撩人 http://www.mmjpg.com/mm/1127
肤白貌美的模特李晨晨十分惹人怜爱 http://www.mmjpg.com/mm/1126
萌妹林美惠子穿黑丝浴室私房写真福利 http://www.mmjpg.com/mm/1124
美女赵小米修长双腿丝袜写真能玩几年 http://www.mmjpg.com/mm/1111
微博高颜值美胸萌妹子少女映画写真集 http://www.mmjpg.com/mm/1107
性感妹子修长的双腿真是让人爱不释目 http://www.mmjpg.com/mm/1106
翘臀妹子绮里嘉饱满胸部美的夺人心目 http://www.mmjpg.com/mm/1103
*/

四.分析URL地址

在很多时候我们都需要分析URL,就像点击不同的页码观察URL变化 http://www.mmjpg.com/home/2,我们可以很容易发现页码对应为URL最后的数字。查看mmjpg.com的美腿频道我们可以发现它一共有10页内容,我们就不写代码判断页数了直接写死为10。当然了这儿你可以自己实现动态判断总页数,就当是留的小练习吧。

async function getUrl() {
    let linkArr = []
    for (let i = 1; i <= 30; i++) {
        const res = await request.get(url + i)
        const $ = cheerio.load(res.text)
        $(‘.pic li‘).each(function(i, elem) {
            let link = $(this).find(‘a‘).attr(‘href‘)
            linkArr.push(link)
        })
    }
    console.log(linkArr);
    return linkArr;
}

  

五.获取图片地址

async function getPic(url) {
  const res = await request.get(url)
  const $ = cheerio.load(res.text)
  // 以图集名称来分目录
  const dir = $(‘.article h2‘).text()
  console.log(`创建${title}文件夹`)
  await fs.mkdir(path.join(__dirname, ‘/mm‘, title))
  const pageCount = parseInt($(‘#page .ch.all‘).prev().text())
  for (let i = 1; i <= pageCount; i++) {
    let pageUrl = url + ‘/‘ + i
    const data = await request.get(pageUrl)
    const _$ = cheerio.load(data.text)
    // 获取图片的真实地址
    const imgUrl = _$(‘#content img‘).attr(‘src‘)
    download(dir, imgUrl) // TODO
  }
}

六.保存图片到本地

现在我们就来实现下载保存图片的方法,这儿我们使用了stream(流) 来保存图片

function download(dir, imgUrl) {
  console.log(`正在下载${imgUrl}`)
  const filename = imgUrl.split(‘/‘).pop()
  const req = request.get(imgUrl)
    .set({ ‘Referer‘: ‘http://www.mmjpg.com‘ }) // mmjpg.com根据Referer来限制访问
  req.pipe(fs.createWriteStream(path.join(__dirname, ‘mm‘, dir, filename)))
}
ok,现在我们就来把之前写的各个功能的函数连起来

async function init(){
  let urls = await getUrl()
  for (let url of urls) {
    await getPic(url)
  }
}

init()

 

代码:

const request = require(‘superagent‘)
const cheerio = require(‘cheerio‘)
const fs = require(‘fs-extra‘)
const path = require(‘path‘)

let url = "http://www.u-cpc.com/product/list.html";

// http://www.u-cpc.com/Product/List.html?page=3&cid=0&bid=0

// request.get(url).then(function(res){
//   console.log(res.text);
// })

// async function getUrl(){
//     const res = await request.get(url);
//     const $ = cheerio.load(res.text);
//     $(".product_ul li").each(function(i, elem){
//         const href = $(this).find("img").attr("data-original")
//         const title = $(this).find(".productlist_title").text();
//         console.log("标题是: " + title)
//         console.log("地址是: " + href)
//     })
// }
// getUrl();

/**
 * 获取图集的URL
 */
async function getUrl(){
    let linkArr = [];
    for(let i = 0; i <= 10; i++){
      const res = await request.get(url);
      const $ = cheerio.load(res.text);

      $(".product_ul li").each(function(i, elem){
          const href = $(this).find("img").attr("data-original")
          const title = $(this).find(".productlist_title").text();
          linkArr.push(href)
      })
    }
}
async function getPic(url) {
  const res = await request.get(url)
  const $ = cheerio.load(res.text)
  // 以图集名称来分目录
  const dir = $(‘.curr‘).text()
  console.log(`创建${dir}文件夹`)
  await fs.mkdir(path.join(__dirname, ‘/images‘, dir))
  for(let i = 1; i <= 10; i++){
    let pageUrl = url + ‘?page=‘ + i + ‘&cid=0&bid=0‘;
    const data = await request.get(pageUrl)
    const _$ = cheerio.load(data.text)
    _$(".product_ul li").each(function(i, elem){
      const imgUrl = $(this).find("img").attr("data-original");
      download(dir, imgUrl)
    })
  }
}

// 下载图片
function download(dir, imgUrl) {
  console.log(`正在下载${imgUrl}`)
  const filename = imgUrl.split(‘/‘).pop()
  const req = request.get(imgUrl)
      .set({
          ‘Referer‘: ‘http://www.u-cpc.com/product/list.html‘
      })
  req.pipe(fs.createWriteStream(path.join(__dirname, ‘images‘, dir, filename)))
}

async function init() {
  getUrl();
  getPic(url)
}
// init();
download();
function download() {
  const url2 = "https://codeload.github.com/cheeriojs/cheerio/zip/master"
  const filename = url2.split(‘/‘).pop() + ".zip"
  const req = request.get(url2)
  req.pipe(fs.createWriteStream(path.join(__dirname, ‘images‘, filename)))
}

七:注意并发的,毕竟爬取频率会有限制

问: err:Error: connect ETIMEDOUT 博主做爬虫的时候有没有遇到报这个错的,我按你的代码写爬我们的网站,好多页面都报这个错误

答: 并发爬取的数量太高 或者爬的太快。你爬的网站有做爬虫保护限制。把并发量调低 把 延迟调大 就可以了。

PHP, Python, Node.js 哪个比较适合写爬虫?
1.PHP对多线程、异步支持较差,不建议采用。PHP 4.3.0以后引入的PHP Command Line特性,实现了让PHP脱离Web服务器,和Phthon一样独立运行。因此用来写爬虫也是非常方便的。
2.NodeJS:对一些垂直网站爬取倒可以,但由于分布式爬取、消息通讯等支持较弱,根据自己情况判断。
3.Python:强烈建议,对以上问题都有较好支持。尤其是Scrapy框架值得作为第一选择, 专门用来做爬虫的一个框架。优点诸多:支持xpath;基于twisted,性能不错;有较好的调试工具;
4.C、C++虽然性能不错,但不推荐,尤其是考虑到成本等诸多因素;

 

参考: https://github.com/ogilhinn/mm-spider

原文地址:https://www.cnblogs.com/alantao/p/8446613.html

时间: 2024-10-13 19:39:32

node爬虫(转)的相关文章

node爬虫解决网页编码为gb2312结果为乱码的方法

最近需要对某消防网站进行宣传力度区域进行统计,使用一般采用的http模块进行数据抓取的时候发现结果是乱码,翻看原网站才发现,该消防网站是gb2312的编码,而http模块爬出的数据不能进行gbk解析,因此本片文章主要为解决用node对网站编码为gb2312爬虫时得到乱码这一问题. 1. 使用工具:webstorm,node开发神器,强烈推荐 2. 再说思路:先对新闻列表页面进行爬虫,再对抓到的链接一一进行目标网页的标题显示和新闻来源的统计,本页面新闻统计完毕后再跳转下一页,重新进行该过程. 备注

node爬虫(简版)

做node爬虫,首先像如何的去做这个爬虫,首先先想下思路,我这里要爬取一个页面的数据,要调取网页的数据,转换成页面格式(html+div)格式,然后提取里面独特的属性值,再把你提取的值,传送给你的页面上,在你前端页面显示,或者让你的前端页面能够去调取这些返回的值. 首先要安装以下的依赖 // 调取 npm install --save request-promise // 转换成页面格式 npm install --save cheerio // 打开node使用 npm install --s

node爬虫的几种简易实现方式

说到爬虫大家可能会觉得很NB的东西,可以爬小电影,羞羞图,没错就是这样的.在node爬虫方面,我也是个新人,这篇文章主要是给大家分享几种实现node 爬虫的方式.第一种方式,采用node,js中的 superagent+request + cheerio.cheerio是必须的,它相当于node版的jQuery,用过jQuery的同学会非常容易上手.它 主要是用来获取抓取到的页面元素和其中的数据信息.superagent是node里一个非常方便的.轻量的.渐进式的第三方客户端请求代理模块,用他来

有趣的Node爬虫,数据导出成Excel

最近一直没更新了诶,因为学习Backbone好头痛,别问我为什么不继续AngularJs~因为2.0要出来了啊,妈蛋!好,言归正传,最近帮我的好基友扒数据,他说要一些股票债券的数据.我一听,那不就是要做爬虫了么...果断用Node做!(其实也有一个股票数据API,sina提供的,但是由于不适用于债券,没办法,只好自己动手丰衣足食了) 工欲善其事,必先利其器嘛,蓬勃的Node社区提供了非常多的好的工具,下面我列出将要使用的工具: request,封装了Node的原生的http模块,使API更加简洁

Node爬虫——利用superagent模拟登陆

一.概述 最近学习了node,试着写了个爬虫,这是模拟登陆的一部分. 1.需要的工具 2.superagent用法的简述 3.抓包分析 4.最小示例 二.需要的工具 nodejs,superagent,wireshark. nodejs没什么可介绍的. superagent是nodejs众多插件之一,用npm命令安装.是一个超轻的ajax api,有着可读性强,高度灵活,学习曲线低的优点. wireshark是一个抓包工具,很强大.之后我们需要用它来分析post请求与cookie. 三.supe

node爬虫入门

爬虫其实就是模仿浏览器访问页面,然后把页面保存起来备用. 爬虫的方法,直接上代码: function getUrl(url,success,error){ let urlObj = urlParser.parse(url); let mod = null; //判断用是哪个协议,对应用哪个模块 if(urlObj.protocol=='http:'){ mod = require('http'); }else{ mod = require('https'); } let req = mod.re

使用node爬虫,爬取指定排名网站的JS引用库

前期准备 本爬虫将从网站爬取排名前几的网站,具体前几名可以具体设置,并分别爬取他们的主页,检查是否引用特定库. github地址 所用到的node主要模块 express 不用多说 request http模块 cheerio 运行在服务器端的jQuery node-inspector node调试模块 node-dev 修改文件后自动重启app 关于调试Node 在任意一个文件夹,执行node-inspector,通过打开特定页面,在页面上进行调试,然后运行app,使用node-dev app

node爬虫 - imooc

var http = require('http'); var cheerio = require('cheerio'); var url = 'http://www.imooc.com/learn/348'; // 过滤章节信息 function filterChapters(html) { var $ = cheerio.load(html); var chapters = $(".chapter"); //.chapter和课程有关的最外层 var courseData = []

Node 爬虫,批量爬取头条视频并保存

项目地址:GitHub 目标网站:西瓜视频项目功能:下载头条号[维辰财经]下的最新20个视频姊妹项目:批量下载美女图集 简介 一般批量爬取视频或者图片的套路是,使用爬虫获得文件链接集合,然后通过 writeFile 等方法逐个保存文件.然而,头条的视频,在需要爬取的 html 文件(服务端渲染输出)中,无法捕捉视频链接.视频链接是页面在客户端渲染时,通过某些 js 文件内的算法或者解密方法,根据视频的已知 key 或者 hash 值,动态计算出来并添加到 video 标签的.这也是网站的一种反爬