返回博客
指南
罗伯特·蒙切阿努2021年5月20日阅读时间:8分钟

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

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

为什么您需要产品数据

利用公开信息促进企业发展,是全球企业主普遍采用的做法。

通过使用网络爬虫工具,您可以获取价格情报、竞争对手监控、收入优化等有助于企业蓬勃发展的解决方案。试想一下,如果要手动将数百种产品的信息复制粘贴到表格中,将耗费多少时间。这正是 WebScrapingAPI 改变游戏规则之处。

使用网络爬虫工具收集信息的经典方法

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

如果网站只有几十个页面,还算容易管理,但如果网站有数百甚至数千个页面呢?这项工作可能会变得有些枯燥,既费时又令人不快。

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

更快捷的方法

网站地图。什么是网站地图?

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

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

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

我们来试一试这个方法吧!

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

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

如需了解 WebScrapingAPI 的工作原理及其如何集成到您的项目中,您可以随时查阅其文档;若想进行测试,API 演示工具能帮助您更直观地查看结果!

介绍就到这里,接下来让我们看看如何利用 WebScrapingAPI 通过网站地图进行数据抓取。

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

1. 查找网站地图的 URL

在这个示例中,我们将查看Maplin 的网站地图,这些地图位于其 robots.txt 文件底部。

点击上面的链接,我们将被重定向到包含网站地图链接的 XML 文件。

maplin.co.uk 的 XML 网站地图索引,列出了网站地图的 URL 及其最后修改时间戳

如果我们点击上面的第一个链接,就会进入网站地图页面,其中包含各种页面,有些是产品页面!我们将从这些页面中提取数据,并将其保存到 CSV 文件中以备后用。听起来很简单,对吧?

XML 网站地图条目,显示页面 URL 及其最后修改日期、更新频率和优先级

2. 识别选择器

为了只提取我们需要的数据,我们必须知道这些数据位于何处。为此,让我们访问上文提到的智能照明开关的网址,并使用开发者工具进行检查。

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

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

使用浏览器开发者工具检查一个名为“Netatmo 智能恒温器”的产品列表,该列表包含价格和“加入购物车”按钮

3. 安装必要的软件包

这一步非常简单;只需安装这组软件包即可:

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

要安装所有这些软件包,只需在项目的终端中输入以下命令:

npm install jsdom 并获取了 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 
}

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

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 调用进行测试。下次见!

关于作者
罗伯特·蒙切阿努,WebScrapingAPI 全栈开发工程师
罗伯特-蒙恰努全栈开发工程师

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

开始构建

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

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