为什么您需要产品数据
利用公开信息促进企业发展,是全球企业主普遍采用的做法。
通过使用网络爬虫工具,您可以获取价格情报、竞争对手监控、收入优化等有助于企业蓬勃发展的解决方案。试想一下,如果要手动将数百种产品的信息复制粘贴到表格中,将耗费多少时间。这正是 WebScrapingAPI 改变游戏规则之处。
使用网络爬虫工具收集信息的经典方法
假设你想批量抓取某个网站上的产品信息。使用网页抓取工具的一种方法是手动选择每个产品页面的 URL 供工具抓取。这意味着你必须对该网站进行一番调研,找出每个产品页面的位置等等。
如果网站只有几十个页面,还算容易管理,但如果网站有数百甚至数千个页面呢?这项工作可能会变得有些枯燥,既费时又令人不快。
在这种情况下,我们该怎么办?
更快捷的方法
网站地图。什么是网站地图?
在谈论搜索引擎优化(SEO)时,网站地图大有裨益。它们就像网站的蓝图,能帮助搜索引擎发现、抓取甚至收录您网站上的所有内容。
通常,大型网站会使用它们来优化页面结构,并帮助搜索引擎区分重要页面与次要页面。
在抓取数据时,我们能否利用这些网站地图?当然可以!让我们来看看它们如何帮助我们批量抓取网站内容。
我们来试一试这个方法吧!
要使用WebScrapingAPI,我们需要先注册账户并获取用于 API 身份验证的私有访问密钥。请放心,注册账户是免费的,且无需绑定银行卡或其他个人信息。
登录后,系统将自动跳转至仪表盘。在这里,您会看到自己的访问密钥,稍后我们将用到它。请务必妥善保管该密钥;如果您认为私钥已泄露,随时可以点击“重置 API 密钥”按钮进行重置。
如需了解 WebScrapingAPI 的工作原理及其如何集成到您的项目中,您可以随时查阅其文档;若想进行测试,API 演示工具能帮助您更直观地查看结果!
介绍就到这里,接下来让我们看看如何利用 WebScrapingAPI 通过网站地图进行数据抓取。
在本示例中,我们将使用 NodeJS 作为编程语言,但您也可以使用自己熟悉的任何编程语言。接下来,我们将抓取网站地图并解析其中的产品 URL,抓取产品页面,并将数据存储到 CSV 文件中。这样,您可以使用 WebScrapingAPI 进行批量抓取;如果您只想抓取特定页面,也可以发送针对性的请求。
1. 查找网站地图的 URL
在这个示例中,我们将查看Maplin 的网站地图,这些地图位于其 robots.txt 文件底部。
点击上面的链接,我们将被重定向到包含网站地图链接的 XML 文件。

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

2. 识别选择器
为了只提取我们需要的数据,我们必须知道这些数据位于何处。为此,让我们访问上文提到的智能照明开关的网址,并使用开发者工具进行检查。
我们注意到,列表中的每个产品都位于一个类名为ais-Hits-item 的li 标签 之下。
在这个节点中,我们可以看到标题和价格分别位于类名为result-title的h3标签下,以及类名为after_special price的span 标签 内。

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




