大家好,欢迎回到我们的网络爬虫节目!在本期节目中,我们将通过利用网站站点地图进行爬取,来探讨价格优化如何助力业务增长。
如果你想知道接下来会发生什么,那就找个座位,准备些零食,继续观看——我是说,继续阅读吧!

大家好,欢迎回到我们的网络爬虫节目!在本期节目中,我们将通过利用网站站点地图进行爬取,来探讨价格优化如何助力业务增长。
如果你想知道接下来会发生什么,那就找个座位,准备些零食,继续观看——我是说,继续阅读吧!
利用公开信息促进业务增长,是全球企业主的普遍做法。
通过网页抓取工具,您可以获取价格情报、竞争对手监控、收入优化等助力企业繁荣的解决方案。试想一下,如果要手动将数百种产品的信息复制粘贴到表格中,将耗费多少时间。这正是 WebScrapingAPI 改变游戏规则的地方。
假设您想批量抓取某个网站的产品信息。使用网络爬虫工具的一种方式是手动选择每个产品页面的 URL 供工具抓取。这意味着您必须对网站进行一番研究,找出每个产品页面的位置等等。
如果网站只有几十个页面,这还算可以应付,但如果网站有数百甚至数千个页面呢?这项工作可能会变得有些枯燥,耗费大量时间,而且体验也不佳。
在这种情况下我们该怎么办?
网站地图。它们是什么?
在谈论SEO时,网站地图大有裨益。它们就像网站的蓝图,帮助搜索引擎发现、爬取甚至索引您网站上的所有内容。
通常,大型网站会使用网站地图来优化页面结构,并帮助搜索引擎区分重要页面与次要页面。
在数据抓取时,我们能否利用这些网站地图?当然可以!让我们来了解它们如何帮助我们批量抓取网站内容。
要使用 WebScrapingAPI,我们需要创建账户并获取用于 API 身份验证的私有访问密钥。请放心,注册账户是免费的,且无需添加信用卡或其他个人信息。
登录后,系统将自动跳转至仪表盘。在这里,我们会看到稍后将要使用的访问密钥。请务必妥善保管,但如果您认为私有密钥已泄露,随时可以通过点击“重置 API 密钥”按钮进行重置。
若想了解 WebScrapingAPI 的工作原理及其在项目中的集成方式,您可以随时查阅其文档;若需进行测试,API 沙盒将帮助您更直观地查看结果!
介绍到此为止,让我们来看看如何利用 WebScrapingAPI 通过站点地图进行数据抓取。
本示例将使用 NodeJS 作为编程语言,但您也可以使用任何您熟悉的编程语言。接下来,我们将抓取站点地图并解析其中的产品 URL,抓取产品页面,并将数据存储在 CSV 文件中。通过这种方式,您可以使用 WebScrapingAPI 进行批量抓取;如果您只想抓取特定页面,也可以发送针对性的请求。
本例中,我们将以 Maplin 的站点地图为例,其位置位于 robots.txt 文件底部。
点击上述链接,系统将重定向至包含网站地图链接的 XML 文件。
若点击上述第一个链接,将跳转至包含各类页面(其中部分为产品页面)的网站地图!这些正是我们要提取数据并保存至 CSV 文件以备后续使用的页面。听起来很简单,对吧?
为了只提取我们需要的数据,我们必须知道数据的位置。为此,让我们访问上述智能照明开关的 URL,并使用开发者工具进行检查。
我们注意到列表中的每个产品都位于一个类名为 ais-Hits-item 的 li 标签下。
在这个节点内部,我们可以看到标题和价格分别位于类名为 result-title 的 h3 标签下,以及类名为 after_special price 的 span 标签下。
这一步非常简单,只需安装以下这组包:
要在项目终端中安装所有这些包,只需执行以下命令:
npm install jsdom got xml2js csv-writer
在此我们将利用 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'
}从 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 发起请求以提取产品数据,并筛选出需要存储的信息。
本示例中无需遍历站点地图的所有 URL,因此我们仅提取第 5 至 10 位的 URL。接下来,我们将准备 API 请求的参数,并使用 JSDOM 解析返回的 HTML。
要提取商品的标题和价格,我们之前已看到它们分别位于类名为 result-title 的 h3 标签内,以及类名为 after_special price 的 span 标签内。
创建包含刚提取的标题和价格的对象后,将其加入 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)
})
}
}在此处,我们将使用 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!!'))我们已成功利用站点地图遍历网站的产品页面并提取数据,恭喜!以下是完整的代码:
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 的全栈开发工程师,他在产品各领域均有贡献,并协助构建了支持该平台的可靠工具和功能。