如果您有一款卓越的产品或一个颠覆性的创意想要与世界分享,如果人们不知道它的存在,岂不是太可惜了?
大家好,欢迎收看今天的特别节目!本文的主菜是“潜在客户开发”,我们将探讨为何使用网络爬虫工具能帮助我们高效地收集潜在客户信息。
若您能坚持看到最后,将看到一个网页抓取工具的快速演示,并了解它如何帮助企业发掘潜在客户。事不宜迟,让我们磨利刀锋,从开胃菜开始吧!

如果您有一款卓越的产品或一个颠覆性的创意想要与世界分享,如果人们不知道它的存在,岂不是太可惜了?
大家好,欢迎收看今天的特别节目!本文的主菜是“潜在客户开发”,我们将探讨为何使用网络爬虫工具能帮助我们高效地收集潜在客户信息。
若您能坚持看到最后,将看到一个网页抓取工具的快速演示,并了解它如何帮助企业发掘潜在客户。事不宜迟,让我们磨利刀锋,从开胃菜开始吧!
建立一个优质的潜在客户库可能需要一些时间,因为您需要相当多的联系人来发展业务,而手动搜索每个网站非常耗时。您也不需要所有人的电话号码,只需要那些符合您业务兴趣的,因此高质量的筛选将占用您更多的时间。
对此我们该如何应对?
有些人甚至以此为生——即收集潜在客户信息并出售给其他公司使用。这听起来像是快速简便的解决方案,但他们提供的潜在客户库质量可能达不到您的标准。此外,选择这种方式无疑需要花费一笔费用。
那么,如何才能快速高效地自己动手呢?这时,网络爬虫工具就能派上用场。通过这种方式,您可以筛选出自己感兴趣的潜在客户,例如根据他们的评价进行分类。
假设我们是一家新开业的本地精酿啤酒厂,希望让更多人了解我们的产品。为实现这一目标,我们需要联系当地的餐厅或酒吧,询问他们是否有意在店内销售我们的产品。
具体采用何种方式由您决定。我们将协助您完成数据抓取,而非代您沟通!
首先,我们需要知道去哪里寻找所需信息,而互联网是最佳途径。有许多企业目录网站,其中按行业、位置、业务类型甚至规模对商家进行了分类。在本例中,我们将使用 Yell。
接下来,我们将创建 WebScrapingAPI 账户并继续进行示例操作。
这一步很简单,因为注册过程非常直观,而且别担心,它是免费的!通过电子邮件确认注册后,我们可以继续进行下一步。
在此步骤中,我们需要为项目进行抓取准备。您可以使用最适合您的任何 IDE 和编程语言,但在本示例中,我们将使用 WebStorm 作为 IDE,并使用 NodeJS 编写代码。
要在项目终端中安装上述包,只需执行以下命令行:npm install got jsdom csv-writer
在此处,我们将指定要抓取的网站 URL(本例中为 Yell),当然还需提供访问密钥,以便 WebScrapingAPI 正常运行。
const url = "https://www.yell.com/ucs/UcsSearchAction.do?keywords=restaurants%26location=United+Kingdom%26scrambleSeed=1024089043"
const params = {
api_key: "XXXXX",
url: url
}const response = await got('https://api.webscrapingapi.com/v1', {searchParams: params})系统将带着之前设定的参数向 WebScrapingAPI 发起请求,并收到包含被抓取页面原始 HTML 的响应。接下来,我们需要了解如何在 HTML 中定位所需的信息。
此时,我们需要浏览待抓取的网站,并使用开发者工具查找包含各商家信息的元素。在本例中,每个项目都带有“businessCapsule--mainRow”类。
在上方的图片中,我们深入查看了商家条目元素,发现每个商家的名称位于类名为“businessCapsule--name”的标签内。
重复此过程,我们将在类名为“business--telephoneNumber”的元素中找到电话号码,而平均评分和总评分分别位于类名为“startRating--average”和“starRating--total”的元素中。
JSDOM 将帮助我们解析 WebScrapingAPI 提供的信息,因为它会以 HTML 格式返回完整页面。
const {document} = new JSDOM(response.body).window在此阶段,我们将遍历所有具有“businessCapsule--mainRow”类的元素,并从中提取前面提到的信息。提取的数据随后将作为对象添加到列表中。
const relatedElements = document.querySelectorAll('.businessCapsule--mainRow')
relatedElements.forEach(el => {
const businessName = el.querySelector('.businessCapsule--name')
const businessRatingAverage = el.querySelector('.starRating--average')
const businessRatingTotal = el.querySelector('.starRating--total span')
const businessContact = el.querySelector('.business--telephoneNumber')
leads.push({
businessName: businessName ? businessName.innerHTML : 'No business name',
businessRatingAverage: businessRatingAverage ? businessRatingAverage.innerHTML : 'No ratings',
businessRatingTotal: businessRatingTotal ? businessRatingTotal.innerHTML : 'No ratings',
businessContact: businessContact ? businessContact.innerHTML : 'No phone number'
})
})将数据存储为 CSV 文件似乎是个不错的解决方案,而 csv-writer 正能帮上忙。 我们需要在 path 参数和 header 参数中指定 CSV 文件的路径和名称,并提供一个对象列表。每个对象将代表 CSV 文件中的一列。这些对象的 title 属性代表各列的标题,而 id 属性则需与潜在客户列表中对象的 id 属性相匹配。
现在,如果我们将整个代码封装在一个异步函数中,并添加一个循环来抓取前 5 页的企业数据,代码应如下所示:
const {JSDOM} = require("jsdom");
const got = require("got");
(async () => {
const leads = []
const nrPages = 5
for (let page = 1; page <= nrPages; page++) {
const url = "https://www.yell.com/ucs/UcsSearchAction.do?keywords=restaurants%26location=United+Kingdom%26scrambleSeed=1024089043%26pageNum=" + page
const params = {
api_key: "XXX",
url: url
}
const response = await got('https://api.webscrapingapi.com/v1', {searchParams: params})
const {document} = new JSDOM(response.body).window
const relatedElements = document.querySelectorAll('.businessCapsule--mainRow')
if (relatedElements) {
relatedElements.forEach(el => {
const businessName = el.querySelector('.businessCapsule--name')
const businessRatingAverage = el.querySelector('.starRating--average')
const businessRatingTotal = el.querySelector('.starRating--total span')
const businessContact = el.querySelector('.business--telephoneNumber')
leads.push({
businessName: businessName ? businessName.innerHTML : 'No business name',
businessRatingAverage: businessRatingAverage ? businessRatingAverage.innerHTML : 'No ratings',
businessRatingTotal: businessRatingTotal ? businessRatingTotal.innerHTML : 'No ratings',
businessContact: businessContact ? businessContact.innerHTML : 'No phone number'
})
})
}
}
const csvWriter = require('csv-writer').createObjectCsvWriter({
path: 'leads.csv',
header: [
{id: 'businessName', title: 'Business Name'},
{id: 'businessRatingAverage', title: 'Business Average Rating'},
{id: 'businessRatingTotal', title: 'Business No. of Ratings'},
{id: 'businessContact', title: 'Business Phone Number'},
]
})
csvWriter.writeRecords(leads).then(() => console.log('Success!!'))
})();干得漂亮!您已经完成了潜在客户信息的收集。
这是快速建立您自己的潜在客户和商业合作伙伴资源库的捷径。除了生成潜在客户外,WebScrapingAPI 还能在其他场景中为您提供帮助。您可以在我们的博客上了解更多相关内容。
WebScrapingAPI 提供多种套餐以满足您的项目需求。如果您还不确定我们的产品如何为您的业务增色,不妨先尝试免费套餐?它提供 1000 次免费 API 调用,助您轻松入门。

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