Houzz 是一个平台,房主、设计师和建筑商可以在这里找到产品、灵感和服务。它是家居装修、室内设计和家具购物的顶级在线平台之一。Houzz 拥有超过 65 万独立用户和 10 万个产品列表,是企业、开发商和研究人员的数据宝库。该平台提供的见解可用于建立电子商务、进行市场研究或分析设计趋势。

在本博客中,我们将向您介绍如何使用 Python 抓取 Houzz 搜索列表和产品页面。我们将向您展示如何使用 爬虫库 Smart Proxy 因此,即使是从具有反抓取措施的网站上,您也可以顺利、高效地进行抓取。

让我们开始吧!

目录

  1. 为什么要抓取 Houzz 数据?
  2. 从 Houzz 中提取的关键数据点
  3. 设置 Python 环境
  • 安装 Python 和所需的库
  • 选择 IDE
  1. 抓取 Houzz 搜索列表
  • 检查 HTML 结构
  • 编写 Houzz 搜索列表抓取工具
  • 处理分页
  • 将数据存储在 JSON 文件中
  • 完整代码示例
  1. 抓取 Houzz 产品页面
  • 检查 HTML 结构
  • 编写 Houzz 产品页面抓取工具
  • 将数据存储在 JSON 文件中
  • 完整代码示例
  1. 使用 Crawlbase 进行优化 Smart Proxy
  • 为什么使用 Crawlbase Smart Proxy?
  • 如何将其添加到你的 Scraper?
  1. 总结
  2. 常见问题解答 (FAQs)

为什么要抓取 Houzz 数据?

出于多种原因,抓取 Houzz 数据非常有用。Houzz 拥有大量家居产品、家具和装饰,可提供大量数据,帮助企业和个人做出明智的决策。以下是抓取 Houzz 数据的一些原因。

抓取 Houzz 数据的原因图片
  1. 市场调查:如果您从事家居装饰或家具行业,您可以通过从 Houzz 抓取产品详细信息和客户评论来分析产品趋势、定价策略和客户偏好。
  2. 竞争对手分析:对于电子商务企业,抓取 Houzz 将为您提供竞争对手的定价、产品可用性和客户评级,以便您保持竞争力。
  3. 产品数据聚合:如果您正在构建一个可跨多个平台比较产品的网站或应用程序,请抓取 Houzz 的数据以将其海量产品目录包含在您的数据中。
  4. 客户情感分析:收集评论和评分,分析客户对特定产品或品牌的看法。帮助品牌改进产品或帮助买家做出更好的决策。
  5. 数据驱动的决策:抓取 Houzz 的数据以便做出明智的决定,确定要储存哪些产品、如何定价以及客户需要什么。

从 Houzz 中提取的关键数据点

从 Houzz 抓取数据时,你可以关注几个关键信息。以下是从 Houzz 中提取的数据点:

  • 姓名:产品名称。
  • 价格:商品价格。
  • 描述:关于功能和材料的完整详细信息。
  • 图片:产品的高分辨率图像。
  • 评分和评论:客户对产品的反馈。
  • 规格:尺寸、材料等。
  • 卖家:卖家或商店的信息。
  • 公司简介:公司名称。
  • 地址: 营业地点。
  • 电话:公司电话号码。
  • 网站:商业网站。
  • 电子邮箱:商业电子邮件(如果在网站上)。

设置 Python 环境

要开始抓取 Houzz 数据,您需要设置 Python 环境。这包括安装 Python、必要的库和集成开发环境 (IDE),以简化编码。

安装 Python 和所需的库

首先,你需要在电脑上安装 Python。你可以从以下网址下载最新版本: 蟒蛇网。安装后,打开终端或命令提示符,输入以下命令确保 Python 已安装:

1
python --version

接下来,你需要安装用于网页抓取的库。主要有两个库: requests 用于获取网页和 BeautifulSoup 用于解析 HTML。输入以下命令安装:

1
pip 安装请求 beautifulsoup4

这些库对于从 Houzz 的 HTML 结构中提取数据并使流程顺畅至关重要。

选择 IDE

IDE 可让您更轻松地编写和管理 Python 代码。一些常用的选项包括:

  • Visual Studio代码:一款轻量级、免费的编辑器,具有出色的 Python 开发扩展功能。
  • PyCharm:专用的 Python IDE,具有许多用于调试和代码导航的内置功能。
  • Jupyter笔记本:非常适合交互式编码并立即查看结果。

选择适合您和您的编码风格的 IDE。设置好环境后,您就可以开始构建 Houzz 抓取工具了。

抓取 Houzz 搜索列表

在本节中,我们将重点介绍如何抓取 Houzz 搜索列表,这些列表会显示网站上的所有产品。我们将介绍如何通过检查 HTML 来查找 CSS 选择器、编写抓取工具来提取数据、处理分页以及将数据存储在 JSON 文件中。

检查 HTML 结构

首先,您需要检查要从中抓取产品列表的 Houzz 页面的 HTML。例如,要抓取浴室盥洗台和水槽控制台,请使用以下 URL:

1
https://www.houzz.com/products/bathroom-vanities-and-sink-consoles/best-sellers--best-sellers

在浏览器中打开开发人员工具并导航到此 URL。

屏幕截图显示了 Houzz 搜索列表的 HTML 结构

以下是一些需要关注的关键选择因素:

  • 产品名称:发现于 <a> 用类标记 hz-product-card__product-title 其中包含产品名称。
  • 价格:在 <span> 用类标记 hz-product-price 显示产品价格。
  • 评分:在 <span>用类标记 star-rating 显示产品的平均评分(可通过 aria-label 属性)。
  • 图片网址:产品图片为 <img> 标签,你可以从 src 属性。
  • 产品链接:每个产品都链接到其详细页面 <a> 标签可以通过 href 属性。

通过查看这些选择器,您可以定位抓取工具所需的数据。

编写 Houzz 搜索列表抓取工具

现在您知道了数据的位置,让我们编写爬虫程序。以下代码使用 requests 库来获取页面和 BeautifulSoup 解析 HTML。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
进口 要求
bs4 进口 美丽汤

DEF scrape_houzz_search_listings(网址):
产品 = []

响应 = requests.get(url)
if 响应.status_code == 200:
汤 = BeautifulSoup(response.content, 'html.parser')

项目 in 汤.选择('div[data-container="产品列表"] > div.hz-product-card'):
标题 = 项目.select_one(‘a.hz-产品卡__产品标题’).text.strip() if item.select_one(‘a.hz-产品卡__产品标题’) 其他 “不适用”
价格 = item.select_one(‘span.hz-产品价格’).text.strip() if item.select_one(‘span.hz-产品价格’) 其他 “不适用”
评级=项目.select_one(‘span.star-rating’)[‘aria 标签’]。代替(‘平均评分:’, '') if item.select_one(‘span.star-rating’) 其他 “不适用”
图片网址 = item.find('img')['源代码'] if 项目.查找('img') 其他 “不适用”
产品链接 = 产品.find('一种')['href'] if 项目.查找('一种') 其他 “不适用”

产品数据 = {
'标题': 标题,
'价格': 价格,
'评分': 评分,
'图片网址':图片网址,
‘产品链接’:产品链接,
}
产品.附加(产品数据)

其他:
打印(f'无法检索页面: {响应.status_code}')

回报 产品

处理分页

要抓取多个页面,我们需要实现一个单独的函数来处理分页逻辑。此函数将检查是否有“下一页”链接并返回该页面的 URL。然后我们可以循环遍历所有列表。

您可以按照以下方式编写分页功能:

1
2
3
DEF 获取下一页的网址():
next_button = soup.find('一种', 类_='下一页')
回报 下一个按钮['href'] if 下一个按钮 其他 没有

我们将在主抓取函数中调用此函数,继续从所有可用页面获取产品。

将数据存储在 JSON 文件中

接下来,我们将创建一个函数,将抓取的数据保存到 JSON 文件中。检索列表后可以调用此函数。

1
2
3
4
DEF 保存到json(数据,文件名=‘houzz_products.json’):
- open(文件名, 'w') as json_文件:
json.dump(数据,json_file,缩进=4)
打印(f'数据保存至 {文档名称} 成功地!')

完整代码示例

现在,让我们将所有内容(包括分页)合并为一个完整的代码片段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
进口 要求
bs4 进口 美丽汤
进口 JSON

DEF scrape_houzz_search_listings(网址):
产品 = []

网址:
打印(刮擦 {网址}')
响应 = requests.get(url)
if 响应.status_code == 200:
汤 = BeautifulSoup(response.content, 'html.parser')

项目 in 汤.选择('div[data-container="产品列表"] > div.hz-product-card'):
标题 = 项目.select_one(‘a.hz-产品卡__产品标题’).text.strip() if item.select_one(‘a.hz-产品卡__产品标题’) 其他 “不适用”
价格 = item.select_one(‘span.hz-产品价格’).text.strip() if item.select_one(‘span.hz-产品价格’) 其他 “不适用”
评级=项目.select_one(‘span.star-rating’)[‘aria 标签’]。代替(‘平均评分:’, '') if item.select_one(‘span.star-rating’) 其他 “不适用”
图片网址 = item.find('img')['源代码'] if 项目.查找('img') 其他 “不适用”
产品链接 = 产品.find('一种')['href'] if 项目.查找('一种') 其他 “不适用”

产品数据 = {
'标题': 标题,
'价格': 价格,
'评分': 评分,
'图片网址':图片网址,
‘产品链接’:产品链接,
}
产品.附加(产品数据)

# 处理分页
url = 获取下一页网址 (汤)

其他:
打印(f'无法检索页面: {响应.status_code}')
打破

回报 产品

DEF 获取下一页的网址():
next_button = soup.find('一种', 类_='hz-分页-链接-下一步')
回报 'https://www.houzz.com' + 下一个按钮['href'] if 下一个按钮 其他 没有

DEF 保存到json(数据,文件名=‘houzz_products.json’):
- open(文件名, 'w') as json_文件:
json.dump(数据,json_file,缩进=4)
打印(f'数据保存至 {文档名称} 成功地!')

# 运行抓取工具的主要函数
if __名字__ == '__主要__':
起始网址 = 'https://www.houzz.com/products/bathroom-vanities-and-sink-consoles/best-sellers--best-sellers'
列表 = scrape_houzz_search_listings(start_url)
保存到json(列表)

这个完整的抓取工具将从 Houzz 中提取产品列表,并顺利处理分页。

示例输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[
{
“标题”: “Sequoia 浴室盥洗台,金合欢,30”,单水槽,独立式”,
“价钱”: “ $ 948”,
“评分”: “4.9 颗星,最多 5 颗星”,
“图片网址”: "https://st.hzcdn.com/fimgs/abd13d5d04765ce7_1626-w458-h458-b1-p0--.jpg",
“产品链接”: “https://www.houzz.com/products/the-sequoia-bathroom-vanity-acacia-30-single-sink-freestand-prvw-vr~170329010”
},
{
“标题”: “Bosque 浴室盥洗台,浮木,42”,单水槽,台下安装,独立式”,
“价钱”: “ $ 1,249”,
“评分”: “4.699999999999999 颗星,最多 5 颗星”,
“图片网址”: "https://st.hzcdn.com/fimgs/4b81420b03f91a0a_3904-w458-h458-b1-p0--.jpg",
“产品链接”: “https://www.houzz.com/products/bosque-bath-vanity-driftwood-42-single-sink-undermount-freestand-prvw-vr~107752516”
},
{
“标题”: “渲染浴室盥洗台,橡木白色”,
“价钱”: “ $ 295”,
“评分”: “4.5 颗星,最多 5 颗星”,
“图片网址”: "https://st.hzcdn.com/fimgs/4b31b0e601395a74_7516-w458-h458-b1-p0--.jpg",
“产品链接”: “https://www.houzz.com/products/render-bathroom-vanity-oak-white-prvw-vr~176775440”
},
{
“标题”: “威雷亚浴室盥洗台,单水槽,42”,风化杉木,独立式”,
“价钱”: “ $ 1,354”,
“评分”: “4.9 颗星,最多 5 颗星”,
“图片网址”: "https://st.hzcdn.com/fimgs/81e1d4ca045d1069_1635-w458-h458-b1-p0--.jpg",
“产品链接”: “https://www.houzz.com/products/the-wailea-bathroom-vanity-single-sink-42-weathered-fir-freestand-prvw-vr~188522678”
},
.... 更多的
]

接下来,我们将探讨如何抓取单个产品页面以获取更详细的信息。

抓取 Houzz 产品页面

抓取搜索列表后,我们接下来从各个产品页面收集更多信息。这将为我们提供有关每种产品的更多信息,包括规格和额外图片。在本节中,我们将查看产品页面的 HTML,编写抓取程序以提取数据,然后将该数据存储在 JSON 文件中。

检查 HTML 结构

要抓取产品页面,首先需要查看特定产品页面的 HTML 结构。

1
https://www.houzz.com/products/the-sequoia-bathroom-vanity-acacia-30-single-sink-freestanding-prvw-vr~170329010

在浏览器中打开开发人员工具并导航到此 URL。

屏幕截图显示了 Houzz 产品页面的 HTML 结构

以下是一些需要关注的关键选择因素:

  • 产品名称:在 span 有课 view-product-title.
  • 价格:在 span 有课 pricing-info__price.
  • 描述:在 div 有课 vp-redesign-description.
  • 图片: 附加图片 img 内的标签 div.alt-images__thumb.

了解这一点是编写抓取工具的关键。

编写 Houzz 产品页面抓取工具

现在我们知道在哪里可以找到数据,我们可以创建一个函数来抓取产品页面。以下是编写代码以提取必要详细信息的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
进口 要求
bs4 进口 美丽汤

DEF scrape_houzz_product_page(网址):
响应 = requests.get(url)
产品数据 = {}

if 响应.status_code == 200:
汤 = BeautifulSoup(response.content, 'html.parser')

标题=汤.select_one(‘span.view-产品标题’).text.strip() if 汤.select_one(‘span.view-产品标题’) 其他 “不适用”
价格=汤.select_one(‘span.pricing-info__price’).text.strip() if 汤.select_one(‘span.pricing-info__price’) 其他 “不适用”
描述 = soup.select_one(‘div.vp-重新设计-描述’).text.strip() if 汤.select_one(‘div.vp-重新设计-描述’) 其他 “不适用”
图像_url = [img['源代码'] IMG in 汤.选择(‘div.alt-images__thumb > img’)] if 汤.选择(‘div.alt-images__thumb > img’) 其他 “不适用”

产品数据 = {
'标题': 标题,
'价格': 价格,
'描述': 描述,
'图片网址':图片网址,
‘产品链接’: 网址
}
其他:
打印(f'无法检索产品页面: {响应.status_code}')

回报 产品数据

将数据存储在 JSON 文件中

就像搜索列表一样,我们可以将从产品页面抓取的数据保存到 JSON 文件中,以便于访问和分析。以下函数可获取产品数据并将其保存在 JSON 文件中:

1
2
3
4
DEF 保存产品到json(产品数据,文件名=‘houzz_product.json’):
- open(文件名, 'w') as json_文件:
json.dump(product_data,json_file,缩进=4)
打印(f'产品数据已保存至 {文档名称} 成功地!')

完整代码示例

为了结合我们讨论的所有内容,这里有一个完整的代码示例,其中包括抓取单个产品页面并将数据保存到 JSON 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
进口 要求
bs4 进口 美丽汤
进口 JSON

DEF scrape_houzz_product_page(网址):
响应 = requests.get(url)
产品数据 = {}

if 响应.status_code == 200:
汤 = BeautifulSoup(response.content, 'html.parser')

标题=汤.select_one(‘span.view-产品标题’).text.strip() if 汤.select_one(‘span.view-产品标题’) 其他 “不适用”
价格=汤.select_one(‘span.pricing-info__price’).text.strip() if 汤.select_one(‘span.pricing-info__price’) 其他 “不适用”
描述 = soup.select_one(‘div.vp-重新设计-描述’).text.strip() if 汤.select_one(‘div.vp-重新设计-描述’) 其他 “不适用”
图像_url = [img['源代码'] IMG in 汤.选择(‘div.alt-images__thumb > img’)] if 汤.选择(‘div.alt-images__thumb > img’) 其他 “不适用”

产品数据 = {
'标题': 标题,
'价格': 价格,
'描述': 描述,
'图片网址':图片网址,
‘产品链接’: 网址
}
其他:
打印(f'无法检索产品页面: {响应.status_code}')

回报 产品数据

DEF 保存产品到json(产品数据,文件名=‘houzz_product.json’):
- open(文件名, 'w') as json_文件:
json.dump(product_data,json_file,缩进=4)
打印(f'产品数据已保存至 {文档名称} 成功地!')

# 运行产品页面抓取工具的主要功能
if __名字__ == '__主要__':
产品网址 = 'https://www.houzz.com/product/204153376'
产品详情 = scrape_houzz_产品页面(产品网址)
保存产品到json(产品详情)

此代码将从单个 Houzz 产品页面抓取详细信息并将其保存到 JSON 文件中。

示例输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
“标题”: “Sequoia 浴室盥洗台,金合欢,30”,单水槽,独立式”,
“价钱”: “ $ 948”,
“说明”: “30 英寸红杉单水槽浴室盥洗台将成为您浴室改造的核心。采用 100% 实心冷杉木精心打造,经久耐用。木材经过精心打磨,纹理凸起,呈现出仿古和再生木材的外观。一个实木燕尾抽屉配有全伸展滑轨,为您提供存放日常洗漱用品所需的所有空间,并配有石英台面。实心冷杉木结构美丽的 V 形前门设计实木燕尾抽屉盒软关闭抽屉配有全伸展滑轨木材表面处理可防止翘曲、开裂并承受浴室湿度白色石英台面组装尺寸:30 英寸宽 x 22 英寸深 x 34.50 英寸高黑色五金件预钻孔,可安装 8 英寸宽水龙头风化冷杉饰面 - 质朴和再生木材外观。”,
“图片网址”: [
"https://st.hzcdn.com/fimgs/abd13d5d04765ce7_1626-w100-h100-b0-p0--.jpg",
"https://st.hzcdn.com/fimgs/9c617c9c04765ce8_1626-w100-h100-b0-p0--.jpg",
"https://st.hzcdn.com/fimgs/7af1287304765cea_1626-w100-h100-b0-p0--.jpg",
"https://st.hzcdn.com/fimgs/a651c05404765ced_1626-w100-h100-b0-p0--.jpg",
.... 更多的
],
“产品链接”: “https://www.houzz.com/products/the-sequoia-bathroom-vanity-acacia-30-single-sink-freestand-prvw-vr~170329010”
}

在下一节中,我们将讨论如何使用 Crawlbase 优化你的爬取过程 Smart Proxy.

使用 Crawlbase 进行优化 Smart Proxy

当抓取 Houzz 等网站时,IP 阻止和 CAPTCHA 可能会减慢您的速度。 爬虫库 Smart Proxy 通过轮换 IP 和自动处理 CAPTCHA 来帮助绕过这些问题。这可让您不间断地抓取数据。

为什么使用 Crawlbase Smart Proxy?

  • IP旋转:通过使用数千个轮换代理池来避免 IP 禁止。
  • 验证码处理:Crawlbase 会自动绕过 CAPTCHA,因此您无需手动解决它们。
  • 提高效率:通过发出请求而不受速率限制或阻止的干扰,更快地抓取数据。
  • 全球覆盖:您可以通过选择来自世界各地不同地区的代理来从任何位置抓取数据。

如何将其添加到您的抓取工具中?

集成 Crawlbase Smart Proxy,修改你的请求 URL 以通过他们的 API 进行路由:

1
2
3
4
5
6
7
8
9
10
进口 要求

# 代替 _USER_TOKEN_ 使用您的 Crawlbase 令牌
# 您可以通过在 Crawlbase 上创建帐户来获取
代理网址 = 'http://[电子邮件保护]:8012'
代理={“http”:代理网址, “https”: 代理网址}

DEF scrape_houzz_product_page(网址):
响应= requests.get(url=url,代理=代理,验证=)
# 抓取代码与之前相同

这将确保您的刮板在刮取 Houzz 内容时能够顺利且高效地运行。

使用 Crawlbase 优化 Houzz Scraper

Houzz 为您的项目提供宝贵的见解。您可以探索家居装修趋势并分析市场价格。通过遵循本博客中的步骤,您可以轻松收集重要信息,例如产品详细信息、价格和客户评论。

使用 Requests 和 BeautifulSoup 等 Python 库可以简化抓取过程。此外,使用 爬虫库 Smart Proxy 帮助您访问所需的数据,而不会遇到 IP 禁止或 CAPTCHA 等问题。

如果您有兴趣探索从其他电子商务平台进行抓取,请随意探索以下综合指南。

📜 如何抓取亚马逊
📜 如何刮沃尔玛
📜 如何抓取全球速卖通
📜 如何抓取 Zalando
📜 如何抓取 Costco 信息

如果您有任何问题或反馈,我们的 支持团队 随时为您提供帮助,助您完成网络抓取之旅。祝您抓取之旅顺利!

常见问题

是的,只要您遵守 Houzz 的服务条款,就可以从 Houzz 抓取产品数据。请务必阅读 Houzz 的服务条款并尊重他们的 robots.txt 文件,以便您以负责任且合乎道德的方式进行抓取。

问:为什么我应该使用像 Crawlbase 这样的代理 Smart Proxy 用于抓取 Houzz?

使用类似 爬虫库 Smart Proxy 防止在短时间内向网站发出过多请求时可能出现的 IP 封禁。代理还可以绕过 CAPTCHA 挑战和地理限制,因此您可以顺利地从 Houzz 或任何其他网站抓取数据。

问:我可以从 Houzz 抓取产品列表和产品详细信息吗?

是的,您可以同时抓取两者。在这篇博客中,我们演示了如何从 Houzz 的搜索列表和单个产品页面中提取重要信息。通过遵循类似的步骤,您可以扩展抓取工具以收集各种数据点,例如价格、评论、规格,甚至业务联系方式。