Node.js爬虫实战:搜狗图片爬取

说在前面

当我们在网上寻找图片时,经常会遇到需要批量下载搜索结果中的图片的情况。而搜狗作为中国颇具影响力的搜索引擎之一,其图片搜索功能提供了丰富多样的图片资源。在这种情况下,我们希望能够通过编程的方式,批量下载搜狗图片搜索结果中的图片,以便后续的使用和处理。

本文将介绍如何使用Node.js编写脚本,通过搜狗图片API获取图片搜索结果,并批量下载搜索结果中的图片。我们将深入探讨如何利用Node.js中的模块来发送HTTP请求、处理API返回的数据,并将图片保存到本地文件系统中。

通过本文的指导,读者将学习如何利用编程的方式高效地获取和保存网络上的图片资源,为日常工作和项目开发提供了一种全新的思路和解决方案。

需要注意的是,网络爬虫在使用过程中需要遵守法律法规,尊重网站的隐私政策和使用条款。在进行数据抓取时,请确保遵守相关规定并尊重他人的权益。

准备

1、什么是搜狗图片API?

  • 搜狗图片API是搜狗搜索引擎提供的一项功能接口,用于获取图片搜索结果数据。通过发送HTTP请求到搜狗图片API,我们可以获取包含图片信息的JSON数据,其中包括图片链接、图片标题等相关信息。

2、如何使用axios获取API数据?

  • Axios是一个流行的基于Promise的HTTP客户端,它可以用于发送HTTP请求。我们可以使用Axios库来发送GET请求到搜狗图片API,并获取API返回的数据。Axios提供了简单易用的API,可以轻松地发送异步请求,并处理返回的数据。

3、如何解析API数据中的图片链接?

  • API返回的数据通常是以JSON格式进行传输。在获取到API返回的数据后,我们可以使用JavaScript的JSON解析功能来解析数据并提取所需的信息。在本例中,我们需要解析搜狗图片API返回的JSON数据,并提取每个图片结果的图片链接。

  • 通过遍历API返回的数据对象,我们可以访问每个图片结果的属性。对于每个结果,我们可以检查是否存在pic_url属性,该属性包含了图片的链接。如果存在pic_url属性,则将其保存到一个数组中,以便后续使用。

  • 解析API数据中的图片链接可以采用循环遍历的方式,逐个提取并存储图片链接。这样,我们就可以在后续的步骤中使用这些链接来下载图片。

代码实现

1、引入所需的模块

我们首先引入了Node.js的核心模块之一axios,以及文件系统模块fs。

const axios = require('axios');
const fs = require('fs');

2、定义搜狗图片API的URL

我们设置了搜狗图片API的URL,这是我们将要向其发送请求以获取图片数据的地方。

const apiUrl = 'http://pic.sogou.com/pics/json.jsp';

3、发送HTTP请求并获取数据

使用axios发送GET请求到搜狗图片API,并获取API返回的数据。

axios.get(apiUrl, {
  params: {
    query: keyword,
    start: 0,
    reqType: 'ajax',
    reqFrom: 'result',
    tn: 0
  }
})
.then(response => {})

4、解析API返回的数据

我们解析API返回的JSON数据,提取出其中的图片链接。

 const data = response.data;
if (data.items && data.items.length > 0) {
const imageLinks = data.items.slice(0, num).map(item => item.pic_url);

// 使用fs模块创建保存图片的目录
const dir = './downloaded_images';
if (!fs.existsSync(dir)) {
    fs.mkdirSync(dir);
}

// 根据提取出的图片链接,使用axios下载图片并保存到指定目录中
imageLinks.forEach((link, index) => {
    const filename = `${dir}/image_${index + 1}.jpg`;
    axios({
    method: 'get',
    url: link,
    responseType: 'stream'
    })
    .then(response => {
    response.data.pipe(fs.createWriteStream(filename));
    });
});

5、创建保存图片的目录

我们使用fs模块创建一个名为downloaded_images的目录,用于保存下载的图片。

const dir = './downloaded_images';
if (!fs.existsSync(dir)) {
    fs.mkdirSync(dir);
}

6、下载图片并保存

对于每个提取出的图片链接,我们使用axios再次发送HTTP请求,下载图片并保存到指定的目录中。

imageLinks.forEach((link, index) => {
    const filename = `${dir}/image_${index + 1}.jpg`;
    axios({
    method: 'get',
    url: link,
    responseType: 'stream'
    })
    .then(response => {
        response.data.pipe(fs.createWriteStream(filename));
    })
});

7、完整代码

const axios = require('axios');
const fs = require('fs');

// 定义搜狗图片API的URL
const apiUrl = 'http://pic.sogou.com/pics/json.jsp';

// 定义搜索关键词和需要下载的图片数量
const keyword = '美景'; // 替换为你想要搜索的关键词
const num = 10; // 替换为你想要下载的图片数量

// 使用axios发送HTTP请求到搜狗图片API,并获取API返回的数据
axios.get(apiUrl, {
  params: {
    query: keyword,
    start: 0,
    reqType: 'ajax',
    reqFrom: 'result',
    tn: 0
  }
})
.then(response => {
  // 解析API返回的数据,提取出图片链接
  const data = response.data;
  if (data.items && data.items.length > 0) {
    const imageLinks = data.items.slice(0, num).map(item => item.pic_url);

    // 使用fs模块创建保存图片的目录
    const dir = './downloaded_images';
    if (!fs.existsSync(dir)) {
      fs.mkdirSync(dir);
    }

    // 根据提取出的图片链接,使用axios下载图片并保存到指定目录中
    imageLinks.forEach((link, index) => {
      const filename = `${dir}/image_${index + 1}.jpg`;
      axios({
        method: 'get',
        url: link,
        responseType: 'stream'
      })
      .then(response => {
        response.data.pipe(fs.createWriteStream(filename));
      });
    });
  } else {
    console.log('No images found for the given keyword.');
  }
})
.catch(error => {
  console.error('Error fetching data:', error);
});

公众号

关注公众号『前端也能这么有趣』,获取更多新鲜内容。

说在后面

这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 ,平时也喜欢写些东西,既为自己记录 ,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 ,写错的地方望指出,定会认真改进 ,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 。

你可能感兴趣的:(前端,node,JavaScript,node.js,爬虫)