返回博客
指南
Robert MunceanuLast updated on Mar 31, 20261 min read

如何抓取网站站点地图以提高效率

如何抓取网站站点地图以提高效率

大家好,欢迎回到我们的网络爬虫节目!在本期节目中,我们将通过利用网站站点地图进行爬取,来探讨价格优化如何助力业务增长。

如果你想知道接下来会发生什么,那就找个座位,准备些零食,继续观看——我是说,继续阅读吧!

为何需要产品数据

利用公开信息促进业务增长,是全球企业主的普遍做法。

通过网页抓取工具,您可以获取价格情报、竞争对手监控、收入优化等助力企业繁荣的解决方案。试想一下,如果要手动将数百种产品的信息复制粘贴到表格中,将耗费多少时间。这正是 WebScrapingAPI 改变游戏规则的地方。

使用网络爬虫工具收集信息的传统方式

假设您想批量抓取某个网站的产品信息。使用网络爬虫工具的一种方式是手动选择每个产品页面的 URL 供工具抓取。这意味着您必须对网站进行一番研究,找出每个产品页面的位置等等。

如果网站只有几十个页面,这还算可以应付,但如果网站有数百甚至数千个页面呢?这项工作可能会变得有些枯燥,耗费大量时间,而且体验也不佳。

在这种情况下我们该怎么办?

更快捷的方法

网站地图。它们是什么?

在谈论SEO时,网站地图大有裨益。它们就像网站的蓝图,帮助搜索引擎发现、爬取甚至索引您网站上的所有内容。

通常,大型网站会使用网站地图来优化页面结构,并帮助搜索引擎区分重要页面与次要页面。

在数据抓取时,我们能否利用这些网站地图?当然可以!让我们来了解它们如何帮助我们批量抓取网站内容。

让我们来尝试一下这个方法吧!

要使用 WebScrapingAPI,我们需要创建账户并获取用于 API 身份验证的私有访问密钥。请放心,注册账户是免费的,且无需添加信用卡或其他个人信息。

登录后,系统将自动跳转至仪表盘。在这里,我们会看到稍后将要使用的访问密钥。请务必妥善保管,但如果您认为私有密钥已泄露,随时可以通过点击“重置 API 密钥”按钮进行重置。

若想了解 WebScrapingAPI 的工作原理及其在项目中的集成方式,您可以随时查阅其文档;若需进行测试,API 沙盒将帮助您更直观地查看结果!

介绍到此为止,让我们来看看如何利用 WebScrapingAPI 通过站点地图进行数据抓取。

本示例将使用 NodeJS 作为编程语言,但您也可以使用任何您熟悉的编程语言。接下来,我们将抓取站点地图并解析其中的产品 URL,抓取产品页面,并将数据存储在 CSV 文件中。通过这种方式,您可以使用 WebScrapingAPI 进行批量抓取;如果您只想抓取特定页面,也可以发送针对性的请求。

1. 查找网站地图 URL

本例中,我们将以 Maplin 的站点地图为例,其位置位于 robots.txt 文件底部。

点击上述链接,系统将重定向至包含网站地图链接的 XML 文件。

若点击上述第一个链接,将跳转至包含各类页面(其中部分为产品页面)的网站地图!这些正是我们要提取数据并保存至 CSV 文件以备后续使用的页面。听起来很简单,对吧?

2. 确定选择器

为了只提取我们需要的数据,我们必须知道数据的位置。为此,让我们访问上述智能照明开关的 URL,并使用开发者工具进行检查。

我们注意到列表中的每个产品都位于一个类名为 ais-Hits-itemli 标签下。

在这个节点内部,我们可以看到标题和价格分别位于类名为 result-titleh3 标签下,以及类名为 after_special pricespan 标签下。

3. 安装必要包

这一步非常简单,只需安装以下这组包:

  • jsdom:在解析 HTML 时非常有用。
  • got:该包将协助我们向 WebScrapingAPI 发起 HTTP 请求。
  • xml2js:用于解析 XML 并将其转换为对象,以便于使用。
  • csv-writer:用于将提取的数据存储到 CSV 文件中。

要在项目终端中安装所有这些包,只需执行以下命令:

npm install jsdom got xml2js csv-writer

4. 准备请求参数

在此我们将利用 WebScrapingAPI 的其中一项功能来渲染页面,并等待其所有内容加载完毕。这样我们就能获取更多数据。请务必添加您的私有访问密钥以及您想要抓取的 URL,在本例中,即包含产品页面链接的站点地图 URL。

const api_url = "https://api.webscrapingapi.com/v1"
const url = "https://www.maplin.co.uk/media/sitemap/maplin_uk-1-1.xml"
let params = {
   api_key: "XXXXX",
   url: url,
   render_js: 1,
   wait_until: 'networkidle2'
}

5. 发起请求并解析返回的 XML 字符串

从 API 获取结果后,我们需要将 XML 字符串转换为对象。

const response = await got(api_url, {searchParams: params})

const parser = new xml2js.Parser()
parser.parseString(response.body, async function (err, result) { 
// the rest of the code 
}

下一步将遍历所有产品 URL,针对每个 URL 发起请求以提取产品数据,并筛选出需要存储的信息。

6. 遍历、请求、筛选

本示例中无需遍历站点地图的所有 URL,因此我们仅提取第 5 至 10 位的 URL。接下来,我们将准备 API 请求的参数,并使用 JSDOM 解析返回的 HTML。

要提取商品的标题和价格,我们之前已看到它们分别位于类名为 result-titleh3 标签内,以及类名为 after_special pricespan 标签内。

创建包含刚提取的标题和价格的对象后,将其加入 products 数组。

代码大致如下:

let products = []

for (let index = 5; index < 10; index++) {
   params.url = result['urlset']['url'][index]['loc'][0]

   const res = await got(api_url, {searchParams: params})

   const {document} = new JSDOM(res.body).window

   const elements = document.querySelectorAll('li.ais-Hits-item')
   if (elements) {
       elements.forEach((element) => {
           let element_obj = {}

           const title = element.querySelector('h3.result-title')
           if (title && title.innerHTML) element_obj.title = title.innerHTML
           const price = element.querySelector('.after_special.price')
           if (price && price.innerHTML) element_obj.price = price.innerHTML

           if (element_obj && element_obj.title && element_obj.price)
               products.push(element_obj)
       })
   }
}

7. 存储提取的数据

在此处,我们将使用 csv-writer 库来帮助我们将对象列表转换为 CSV 文件。

只需指定即将创建的文件路径和名称,以及由列对象组成的 headers 数组——其中 id 代表产品对象的属性,title 则是列名。

const csvWriter = require('csv-writer').createObjectCsvWriter({
   path: 'products.csv',
   header: [
       {id: 'title', title: 'Product Name'},
       {id: 'price', title: 'Product Price'}
   ]
})
csvWriter.writeRecords(products).then(() => console.log('Success!!'))

8. 完成!

我们已成功利用站点地图遍历网站的产品页面并提取数据,恭喜!以下是完整的代码:

const {JSDOM} = require("jsdom");
const got = require("got");
const xml2js = require("xml2js");

(async () => {
   const api_url = "https://api.webscrapingapi.com/v1"
   const url = "https://www.maplin.co.uk/media/sitemap/maplin_uk-1-1.xml"
   let params = {
       api_key: "XXXXX",
       url: url,
       render_js: 1,
       wait_until: 'networkidle2'
   }
   const response = await got(api_url, {searchParams: params})

   const parser = new xml2js.Parser()
   parser.parseString(response.body, async function (err, result) {

       let products = []

       for (let index = 5; index < 10; index++) {
           params.url = result['urlset']['url'][index]['loc'][0]

           const res = await got(api_url, {searchParams: params})

           const {document} = new JSDOM(res.body).window

           const elements = document.querySelectorAll('li.ais-Hits-item')
           if (elements) {
               elements.forEach((element) => {
                   let element_obj = {}

                   const title = element.querySelector('h3.result-title')
                   if (title && title.innerHTML) element_obj.title = title.innerHTML
                   const price = element.querySelector('.after_special.price')
                   if (price && price.innerHTML) element_obj.price = price.innerHTML

                   if (element_obj && element_obj.title && element_obj.price)
                       products.push(element_obj)
               })
           }
       }

       const csvWriter = require('csv-writer').createObjectCsvWriter({
           path: 'products.csv',
           header: [
               {id: 'title', title: 'Product Name'},
               {id: 'price', title: 'Product Price'}
           ]
       })

       csvWriter.writeRecords(products).then(() => console.log('Success!!'))
   })
})();

快来亲自尝试一下吧!

希望本教程对您有所帮助,让您更轻松地理解如何利用网站地图进行网络爬取。

这种方法不仅更省时,而且能避免像手动浏览网站时那样遗漏页面。

对于大规模抓取而言,显然使用网站地图比手动选择每个产品页面,甚至使用蜘蛛爬取网站都要好得多。

在我们下期网络爬虫专题节目播出之前,不妨试用一下 WebScrapingAPI 吧?您可免费进行多达 1000 次 API 调用进行测试。下次见!

关于作者
Robert Munceanu, 全栈开发工程师 @ WebScrapingAPI
Robert Munceanu全栈开发工程师

罗伯特·蒙塞阿努(Robert Munceanu)是 WebScrapingAPI 的全栈开发工程师,他在产品各领域均有贡献,并协助构建了支持该平台的可靠工具和功能。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网络数据。