对于房地产行业,获取准确和最新的数据可以为您带来竞争优势。 Zillow 是已成为房地产数据首选来源的平台之一。凭借其庞大的房产列表、市场趋势和社区信息数据库,Zillow 已成为购房者、卖家和房地产专业人士的宝贵数据宝库。

Zillow 拥有令人印象深刻的网站统计数据,每天记录数百万次访问,并拥有数量惊人的房产列表。 Zillow 凭借用户友好的界面和多样化的功能,吸引了大量寻求房地产趋势和房产详细信息的受众。

Zillow 访客

房地产专业人士在很大程度上依赖准确、全面的数据来做出明智的决策。无论是研究市场趋势、评估房地产价格还是寻找投资机会,获得可靠的数据都至关重要。但从 Zillow 手动提取数据可能是一项乏味且耗时的任务。这就是数据抓取发挥作用的地方。 Zillow 的数据抓取使房地产专业人士能够快速有效地收集和分析大量数据,从而节省时间和精力。

跟随我们一起探索 Zillow 数据抓取的世界 蟒蛇。我们将从一种常用的方法开始,了解其局限性,然后深入研究该方法的效率 Crawlbase 爬取 API。与我们一起体验 Zillow 上错综复杂的网络抓取的冒险之旅!

目录

  1. 了解 Zillow 网站
  • Zillow 的搜索路径
  • Zillow 的前端技术
  • Zillow SERP 布局
  • Zillow 属性页面布局
  • Zillow 上提供的关键数据点
  1. 设置 Python 环境
  • 安装Python
  • 安装必要的库
  • 选择合适的开发IDE
  1. Zillow Scraper 采用通用方法
  • 使用Python的requests库
  • 检查 Zillow 页面中的 CSS 选择器
  • 使用 BeautifulSoup 解析 HTML
  • 通用方法的缺点和挑战
  1. 使用 Zillow 的 Crawlbase 抓取 API
  • Crawlbase 注册和 API 令牌
  • 使用 Crawlbase 库访问 Crawling API
  • 从 SERP 中抓取属性页 URL
  • 处理大量数据检索的分页
  • 从属性页 URL 中提取所需数据
  • 将抓取的数据保存在数据库中
  • 使用 Crawlbase 的 Crawling API 进行 Zillow 抓取的优势
  1. 房地产洞察:分析 Zillow 数据
  • 房地产专业人士的潜在用例和应用
  • 数据分析和可视化的可能性
  1. 最后的思考
  2. 常见问题解答(FAQ)

了解 Zillow 网站

Zillow 提供用户友好的界面和庞大的房产列表数据库。借助 Zillow,您可以根据所需位置、价格范围和其他特定条件轻松搜索房产。该平台提供详细的房产信息,包括卧室和浴室的数量、平方英尺,甚至在某些情况下还提供虚拟游览或 3D 演练。

此外,Zillow 不仅仅提供房产列表。它还提供了有关社区和市场趋势的宝贵见解。您可以探索特定区域的犯罪率、学校评级和便利设施,以确定它是否符合您的偏好和生活方式。 Zillow 的交互式地图工具可让您直观地了解房产与附近设施(例如学校、公园和购物中心)的距离。

Zillow 的搜索路径

了解 Zillow 搜索引擎结果页面 (SERP) URL 的结构可以深入了解该平台如何组织和呈现其数据。 Zillow 允许用户搜索特定城市、社区甚至邮政编码的房产。

Zillow 提供各种其他搜索过滤器,例如价格范围、房产类型、卧室数量等。通过有效地利用这些过滤器,您可以缩小搜索范围并提取符合您需求的特定数据。 URL 根据用户查询和偏好分为不同的部分。以下是 SERP URL 中一些主要类别的示例:

  • 房产买卖: https://www.zillow.com/{location}/sale/?searchQueryState={...}
  • 已售物业: https://www.zillow.com/{location}/sold/?searchQueryState={...}
  • 房屋租赁: https://www.zillow.com/{location}/rentals/?searchQueryState={....}

这些 URL 代表 Zillow 数据库的特定部分,允许用户浏览特定位置的待售房产、最近出售的房产或出租列表。

Zillow 的前端技术

了解 Zillow 的前端技术对于有效的数据抓取至关重要。该平台采用先进技术来确保无缝的用户体验:

  • 响应式网页设计:这使得网站可以在计算机、平板电脑和手机等不同设备上正常运行,为用户提供一致的体验。
  • 动态用户界面:Zillow 使用 JavaScript 来显示实时更新。这有助于动态加载网站的内容和交互部分。
  • 异步 JavaScript (AJAX):该技术允许在网站上进行更新,而无需重新加载整个页面。它使网站具有响应性和交互性。
  • 单页应用程序 (SPA) 架构:Zillow 的网站就像单个页面一样工作,减少了重新加载整个页面的需要。这使得网站浏览更加顺畅。
  • RESTful API:这些工具帮助前端(用户看到的)与后端(幕后部分)对话。它们允许 Zillow 获取和更改用户交互的数据。

了解这些前端技术可以为在 Zillow 上制定有效的网络抓取策略提供宝贵的见解。它有助于破译网页结构,确保高效、准确的数据提取。

Zillow SERP 布局

Zillow 搜索引擎结果页面
  • 搜索:这些位于个性化房产搜索的顶部。用户可以按位置、价格范围和房产类型进行过滤,因此在抓取特定条件的数据时需要考虑这一点。
  • 物业清单:列表显示房产类型、价格、平方英尺、卧室和浴室等详细信息。这些详细信息对于集中数据提取至关重要,可确保您捕获所需的信息。
  • 地图整合:虽然它通过提供财产位置的视觉表示来增强用户体验,但它并不直接参与抓取。这是需要注意的事情,但不会影响提取过程。
  • 排序和过滤选项:用户可以根据“最新”或“价格”等参数来组织列表。在制定抓取策略时,重要的是要考虑这些选项,以确保以符合用户偏好的方式收集数据。
  • 分页:Zillow 将搜索结果分解为多个页面。这对于捕获所有相关列表至关重要。抓取策略需要考虑分页以确保全面的数据检索。
  • 特色列表和广告:这些间歇性地出现在搜索引擎结果页面 (SERP) 中。了解这些元素有助于在抓取过程中区分有机内容和赞助内容,从而更准确地理解数据。

了解 Zillow 的 SERP 布局对于有效的网络抓取、确保准确的数据提取和访问有价值的房地产信息的系统方法至关重要。

Zillow 属性页面布局

Zillow 产品页面
  • 基本房产信息:房产类型、地址、价格、面积(平方英尺)、卧室和浴室等关键详细信息均显着显示,以供快速参考。抓取时,捕获这些信息可确保全面了解该属性。
  • 高分辨率图像:展示酒店不同区域的多张图像为用户提供视觉帮助。虽然不直接参与抓取,但识别图像的存在对于数据解释和呈现至关重要。
  • 说明和功能:详细的房产描述和功能可帮助用户了解列表的独特之处。在抓取、捕获和分析此文本时,可以提供有关该房产特征的宝贵见解。
  • 邻里见解:有关社区、学校和当地便利设施的信息对于潜在购房者评估周围环境非常有价值。抓取策略应考虑捕获这些数据以获得更全面的属性概况。
  • 财产历史和税务信息:历史概览和税务详细信息为感兴趣的各方提供透明度和更多背景信息。在抓取时,捕获这些信息可以加深对房产背景的理解。
  • 联系信息 :方便与挂牌经纪人直接沟通,联系信息使用户可以轻松查询或安排看房时间。这个细节对于用户交互和参与至关重要。

了解 Zillow 属性页面的布局对于有效导航和信息提取至关重要。每个部分都有特定的目的,引导用户全面了解所列财产。

Zillow 上提供的关键数据点

从 Zillow 抓取数据时,确定与您的目标相符的关键数据点至关重要。 Zillow 提供大量信息,从房产详细信息到市场趋势。您可以从 Zillow 提取的一些重要数据点包括:

刮Zillow
  • 房产详细信息:包括有关房产的详细信息,例如平方英尺、卧室和浴室的数量以及房产类型(例如单户住宅、公寓、普通公寓)。
  • 价格历史:跟踪房产的历史定价信息,允许用户分析价格趋势和随时间的波动。
  • 热情:Zillow 的专有房屋估价工具,可根据各种因素提供房产的估计市场价值。它提供了对房产潜在价值的见解。
  • 邻里信息:提供有关社区的数据,包括附近的学校、便利设施、犯罪率和其他有助于全面了解该地区的相关详细信息。
  • 当地市场趋势:提供对当地房地产市场的洞察,展示房价中位数、库存水平以及房产在市场上花费的平均时间等趋势。
  • 可比房屋销售:允许用户将房产的详细信息和价格与该地区的类似房屋进行比较,有助于市场分析和决策。
  • 租赁信息:对于出租物业,Zillow 提供月租金、租赁条款和便利设施等详细信息,帮助租户和房东做出明智的选择。
  • 财产税信息:提供财产税数据,帮助用户了解与特定财产相关的税收影响。
  • 家居特色和便利设施:列出房产中可用的具体功能和便利设施,为潜在买家或租户提供详细概述。
  • 互动地图:利用地图显示房产位置、社区边界和附近的兴趣点,增强空间理解。

了解和利用 Zillow 上的这些关键数据点对于参与房地产研究的任何人都至关重要,无论是用于个人使用、投资决策还是市场分析。

设置 Python 环境

设置有利的 Python 环境是从 Zillow 高效抓取房地产数据的基础步骤。以下是准备 Python 环境的简要指南:

安装Python

首先在您的计算机上安装 Python。访问Python官方网站(https://www.python.org/)下载与您的操作系统兼容的最新版本。

在安装过程中,请确保选中“将 Python 添加到 PATH”框,以便可以从任何命令提示符窗口访问 Python。

安装 Python 后,打开命令提示符或终端窗口并使用以下命令验证安装:

1
python --version

安装必要的库

对于网页抓取,您需要安装必要的库,例如用于发出 HTTP 请求的 requests 和用于解析 HTML 的 beautifulsoup4。要无缝利用 Crawlbase 爬网 API,还需安装 Crawlbase Python 库。使用以下命令:

1
2
3
点安装请求
点安装beautifulsoup4
点安装爬虫库

选择合适的开发 IDE:

选择正确的集成开发环境 (IDE) 可以极大地增强您的编码体验。有多种 IDE 可供选择;以下是一些受欢迎的:

  • PyCharm:专为 Python 开发而设计的强大且功能丰富的 IDE。它提供智能代码帮助、可视化调试器以及对 Web 开发的内置支持。
  • VSCode(Visual Studio 代码):一个轻量级但功能强大的代码编辑器,支持Python开发。它配备了各种扩展,可以根据您的喜好进行定制。
  • Jupyter笔记本:非常适合数据分析和可视化任务。 Jupyter 提供了一个交互式环境,广泛应用于数据科学项目中。
  • Spyder的:类似 MATLAB 的 IDE,非常适合科学计算和数据分析。它与 Anaconda 发行版捆绑在一起。

根据您的偏好和房地产数据抓取项目的具体要求选择 IDE。确保所选的 IDE 支持 Python 并提供高效编码和调试所需的功能。

Zillow Scraper 采用通用方法

在本节中,我们将介绍使用 Python 创建 Zillow 抓取工具的常见方法。该方法涉及使用 requests 获取网页的库和 BeautifulSoup 用于解析 HTML 以提取所需的信息。

在我们的示例中,让我们重点关注位于“华盛顿特区哥伦比亚高地”的待售房产。让我们把这个过程分解成几个容易理解的块:

利用 Python 的请求库

requests 库允许我们向 Zillow 的服务器发送 HTTP 请求并检索网页的 HTML 内容。以下是向 Zillow 网站发出请求的代码片段:

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

网址= “https://www.zillow.com/columbia-heights-washington-dc/sale/”
响应 = requests.get(url)

if 响应.status_code == 200:
html_content = 响应. 文本
打印(html_内容)
其他:
打印(f“获取页面失败。状态代码: {响应.status_code}")

打开您喜欢的文本编辑器或 IDE,复制提供的代码,并将其保存在 Python 文件中。例如,将其命名为 zillow_scraper.py.

运行脚本:

打开终端或命令提示符并导航到您保存的目录 zillow_scraper.py。使用以下命令执行脚本:

1
蟒蛇 zillow_scraper.py

当您按下 Enter 键时,您的脚本就会生效,向 Zillow 网站发送请求,检索 HTML 内容并将其显示在您的终端上。

输出 HTML 快照

检查 Zillow 页面中的 CSS 选择器

有了从页面获取的 HTML 内容,下一步就是分析网页并精确定位我们需要的数据点的位置。

Zillow SERP 检查
  1. 打开开发者工具:只需右键单击浏览器中的网页并选择“检查”(或“检查元素”)。这将显示开发人员工具,允许您探索 HTML 结构。
  2. 遍历 HTML 元素:进入开发人员工具后,浏览 HTML 元素以找到您要抓取的特定数据。查找与所需信息关联的唯一标识符、类或标签。
  3. 精确定位 CSS 选择器:记下与您感兴趣的元素相对应的 CSS 选择器。这些选择器充当 Python 脚本的基本标记,帮助它识别和收集所需的数据。

使用 BeautifulSoup 解析 HTML

一旦我们使用 requests 库从 Zillow 获取 HTML 内容并且 CSS 选择器掌握在我们手中,下一步就是解析该内容并提取我们需要的信息。这就是 BeautifulSoup 发挥作用的地方,帮助我们轻松导航和搜索 HTML 结构。

在我们的示例中,我们将获取所选 Zillow 搜索页面上列出的每个属性的 Web 链接。之后,我们将利用这些链接提取有关每个属性的关键详细信息。现在,让我们增强现有脚本以直接从 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
进口 要求
bs4 进口 美丽汤
进口 JSON

DEF 获取属性网址(网址):
标头= {'用户代理': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/122.0'}

响应 = requests.get(url, headers=headers)

property_page_urls = []

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

属性页面 URL = [财产['href'] 财产 in 汤.选择('div[id="grid-search-results"] > ul > li[class^="ListItem-"] 文章[data-test="property-card"] a[data-test="property-card-link ”]')]

其他:
打印(f'错误: {响应.status_code}')

回报 属性_页面_url

DEF ():
网址= “https://www.zillow.com/columbia-heights-washington-dc/sale/”
结果 = get_property_urls(url)

打印(json.dumps(结果,缩进=2))

if __名字__ == “__主要的__”:
主()

但是我们使用请求收到的 HTML 会包含所需的信息吗?让我们看看上面脚本的输出:

1
2
3
4
5
6
7
8
9
10
11
[
“https://www.zillow.com/homedetails/1429-Girard-St-NW-101-Washington-DC-20009/2053968963_zpid/”,
“https://www.zillow.com/homedetails/1439-Euclid-St-NW-APT-301-Washington-DC-20009/68081615_zpid/”,
“https://www.zillow.com/homedetails/1362-Newton-St-NW-Washington-DC-20010/472850_zpid/”,
“https://www.zillow.com/homedetails/1362-Parkwood-Pl-NW-Washington-DC-20010/472302_zpid/”,
“https://www.zillow.com/homedetails/1458-Columbia-Rd-NW-APT-300-Washington-DC-20009/82293130_zpid/”,
“https://www.zillow.com/homedetails/1438-Meridian-Pl-NW-APT-106-Washington-DC-20010/467942_zpid/”,
“https://www.zillow.com/homedetails/2909-13th-St-NW-Washington-DC-20009/473495_zpid/”,
“https://www.zillow.com/homedetails/1421-Columbia-Rd-NW-APT-B4-Washington-DC-20009/467706_zpid/”,
“https://www.zillow.com/homedetails/2516-12th-St-NW-Washington-DC-20009/473993_zpid/”
]

您将观察到输出仅捕获预期结果的一部分。出现此限制是因为 Zillow 利用 JavaScript/Ajax 在其 SERP 页面上动态加载搜索结果。当您向 Zillow URL 发出 HTTP 请求时,HTML 响应缺少搜索结果的很大一部分,从而导致缺少有价值的信息。动态加载的内容不存在于初始 HTML 响应中,这使得通过静态请求检索完整的数据集变得困难。

通用方法的缺点和挑战

虽然使用 Python 的 requests 库和 BeautifulSoup 进行 Zillow 抓取的常见方法是一种简单的方法,但它存在某些缺点和挑战:

  • 动态内容加载:Zillow 与许多现代网站一样,经常使用 JavaScript 动态内容加载技术。常见方法依赖于静态 HTML 解析,这使得检索初始页面加载后动态加载的数据变得困难。
  • 网站结构变更:网页抓取对网站 HTML 结构的变化很敏感。如果 Zillow 更新其网站布局、添加新元素或修改类名称,则可能会破坏抓取工具。需要定期维护以适应任何结构变化。
  • 速率限制和 IP 阻止:Zillow 可能设有速率限制机制,以防止短时间内来自单个 IP 地址的过多请求。使用常见方法进行连续且积极的抓取可能会导致暂时或永久的 IP 阻塞,从而影响抓取工具的可靠性。
  • 有限的可扩展性:由于常见的方法依赖于同步请求,因此在处理大量数据时,可扩展性成为一个问题。发出大量连续请求可能非常耗时,从而降低了抓取过程的效率。
  • 没有内置的 JavaScript 处理:由于常见方法不处理 JavaScript 执行,因此将丢失通过 JavaScript 动态加载的任何数据。此限制对于 Zillow 等严重依赖 JavaScript 进行内容呈现的网站尤其重要

为了克服这些挑战并确保更强大和可扩展的解决方案,我们将在本指南的后续部分中探讨使用 Crawlbase 爬网 API 的优势。该 API 为常见方法带来的许多限制提供了解决方案,提供了一种更可靠、更高效的方式来从 Zillow 抓取房地产数据。

使用 Zillow 的 Crawlbase 抓取 API

现在,让我们探索一种使用 Crawlbase Crawling API 进行 Zillow 抓取的更高级、更高效的方法。与常见方法相比,这种方法具有多种优点并解决了其局限性。它是 参数 让我们能够毫不费力地处理各种抓取任务。

以下是有关利用此专用 API 功能的分步指南:

Crawlbase 帐户创建和 API 令牌检索

要启动通过 Crawlbase 抓取 API 提取 Target 数据的过程,首先要在 Crawlbase 平台上建立您的存在。让我们引导您完成创建帐户和获取基本 API 令牌的步骤:

  1. 访问爬行基地:启动您的网络浏览器并转到 注册 Crawlbase 网站上的页面开始注册。
  2. 输入您的凭据:提供您的电子邮件地址并为您的 Crawlbase 帐户创建安全密码。填写所需详细信息的准确性至关重要。
  3. 验证步骤:提交您的详细信息后,请检查您的收件箱中是否有验证电子邮件。完成电子邮件中概述的步骤来验证您的帐户。
  4. 登录到您的帐户:验证您的帐户后,返回 Crawlbase 网站并使用您建立的凭据登录。
  5. 获取您的 API 令牌:访问 Crawlbase Crawling API 需要 API 令牌,您可以在您的 账户文件.

快速注意:Crawlbase 提供两种类型的令牌 - 一种是为静态网站量身定制的,另一种是为动态或 JavaScript 驱动的网站设计的。由于我们的重点是抓取 Zillow,因此我们将使用 JS 代币。作为一项额外的福利,Crawlbase 为 Crawling API 提供了 1,000 个免费请求的初始限额,使其成为我们网络抓取工作的最佳选择。

使用 Crawlbase 库访问 Crawling API

Python 中的 Crawlbase 库有助于与 API 无缝交互,使您可以轻松地将其集成到 Zillow 抓取项目中。提供的代码片段演示了如何通过 Crawlbase Python 库初始化和使用 Crawling API。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 爬行基地 进口 抓取API

API_TOKEN = 'YOUR_CRAWLBASE_JS_TOKEN'
爬行 API = 爬行 API({'令牌':API_TOKEN})

网址= “https://www.zillow.com/columbia-heights-washington-dc/sale/”

响应=crawling_api.get(url)

if 回复[“标题”]['pc_status'] == '200':
html_内容=响应['身体']。解码('utf-8')
打印(html_内容)
其他:
打印(f"无法获取页面。Crawlbase 状态代码: {回复[“标题”]['pc_status']}")

Crawlbase 平台上提供了 Crawling API 的详细文档。你可以阅读它 点击此处。如果您想了解有关 Crawlbase Python 库的更多信息并查看其使用的其他示例,您可以找到文档 点击此处.

从 SERP 中抓取属性页 URL

为了从 Zillow 的 SERP 中提取属性页的所有 URL,我们将通过引入爬行 API 来增强我们的通用脚本。 Zillow 与许多现代网站一样,采用通过 JavaScript 异步加载的动态元素。我们将纳入 ajax_waitpage_wait 参数以确保我们的脚本捕获所有相关的属性 URL。

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
 爬行基地 进口 抓取API
bs4 进口 美丽汤
进口 JSON

DEF 获取属性网址(API、网址):
选项= {
'用户代理': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/122.0',
'ajax_等待': '真的',
'页面等待': 5000
}

响应 = api.get(url, 选项)

property_page_urls = []

if 回复[“标题”]['pc_status'] == '200':
html_内容=响应['身体']。解码('utf-8')
汤 = BeautifulSoup(html_content, 'html.parser')

属性页面 URL = [财产['href'] 财产 in 汤.选择('div[id="grid-search-results"] > ul > li[class^="ListItem-"] 文章[data-test="property-card"] a[data-test="property-card-link ”]')]

其他:
打印(f'错误: {回复[“标题”][“电脑状态”]}')

回报 属性_页面_url

DEF ():
API_TOKEN = 'YOUR_CRAWLBASE_JS_TOKEN'
爬行 API = 爬行 API({'令牌':API_TOKEN})
serp_url = “https://www.zillow.com/columbia-heights-washington-dc/sale/”

结果 = get_property_urls(crawling_api, serp_url)

打印(json.dumps(结果,缩进=2))

if __名字__ == “__主要的__”:
主()

示例输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[
“https://www.zillow.com/homedetails/1429-Girard-St-NW-101-Washington-DC-20009/2053968963_zpid/”,
“https://www.zillow.com/homedetails/1439-Euclid-St-NW-APT-301-Washington-DC-20009/68081615_zpid/”,
“https://www.zillow.com/homedetails/1362-Newton-St-NW-Washington-DC-20010/472850_zpid/”,
“https://www.zillow.com/homedetails/1362-Parkwood-Pl-NW-Washington-DC-20010/472302_zpid/”,
“https://www.zillow.com/homedetails/1458-Columbia-Rd-NW-APT-300-Washington-DC-20009/82293130_zpid/”,
“https://www.zillow.com/homedetails/1438-Meridian-Pl-NW-APT-106-Washington-DC-20010/467942_zpid/”,
“https://www.zillow.com/homedetails/2909-13th-St-NW-Washington-DC-20009/473495_zpid/”,
“https://www.zillow.com/homedetails/1421-Columbia-Rd-NW-APT-B4-Washington-DC-20009/467706_zpid/”,
“https://www.zillow.com/homedetails/2516-12th-St-NW-Washington-DC-20009/473993_zpid/”,
“https://www.zillow.com/homedetails/2617-University-Pl-NW-1-Washington-DC-20009/334524041_zpid/”,
“https://www.zillow.com/homedetails/1344-Kenyon-St-NW-Washington-DC-20010/473267_zpid/”,
“https://www.zillow.com/homedetails/2920-Georgia-Ave-NW-UNIT-304-Washington-DC-20001/126228603_zpid/”,
"https://www.zillow.com/homedetails/2829-13th-St-NW-1-Washington-DC-20009/2055076326_zpid/",
“https://www.zillow.com/homedetails/1372-Monroe-St-NW-UNIT-A-Washington-DC-20010/71722141_zpid/”
..... 更多的
]

处理大量数据检索的分页

为了确保从 Zillow 检索全面的数据,我们需要解决分页问题。 Zillow 在多个页面上组织搜索结果,每个页面都由 URL 中的页码标识。 Zillow 采用 {pageNo}_p 分页管理的路径参数。让我们修改现有的脚本来处理分页并从多个页面收集属性 URL。

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
 爬行基地 进口 抓取API
bs4 进口 美丽汤
进口
进口 JSON

DEF 获取html(api、url、选项、max_retries=2):
重试= 0
重试次数 <= max_retries:
尝试:
响应 = api.get(url, 选项)

if 回复[“标题”]['pc_status'] == '200':
回报 回复['身体']。解码('utf-8')
其他:
提高 例外(f' 响应 pc_status: {回复[“标题”][“电脑状态”]}')

特殊课程 as e:
打印(f'异常: {STR(e)}')
重试+= 1
if 重试次数 <= max_retries:
打印(f'重试({重试}/{最大重试次数})...')
时间.睡眠(1)

打印(f'已达到最大重试次数。无法从中获取数据 {网址}')
回报 不包含

DEF 获取属性网址(api、base_url、选项、max_pages):
# 获取第一页以确定实际页数
第一页网址 = f"{base_url}1_p/"
first_page_html = fetch_html(api,first_page_url,选项)

if 第一页_html is 不能 不包含:
第一页汤 = BeautifulSoup(第一页_html, 'html.parser')

# 提取可用页面总数
pagination_max_element = first_page_soup.select_one('div.search-pagination > 导航 > li:nth-last-child(3)')
总页数= INT(pagination_max_element.text) if 分页最大元素 其他 1
其他:
回报 []

# 确定最终要抓取的页面数
实际最大页数 = 分钟(总页数,最大页数)

all_property_page_urls = []

页码 in 范围(1, 实际最大页数 + 1):
网址= f"{base_url}{页码}_p/”
page_html = fetch_html(api, url, 选项)

if 页面_html is 不能 不包含:
汤 = BeautifulSoup(page_html, 'html.parser')

属性页面 URL = [财产['href'] 财产 in 汤.选择('div[id="grid-search-results"] > ul > li[class^="ListItem-"] 文章[data-test="property-card"] a[data-test="property-card-link ”]')]

all_property_page_urls.extend(property_page_urls)

回报 所有属性页面网址

DEF ():
API_TOKEN = 'YOUR_CRAWLBASE_JS_TOKEN'
爬行 API = 爬行 API({'令牌':API_TOKEN})
serp_url = “https://www.zillow.com/columbia-heights-washington-dc/sale/”
选项= {
'用户代理': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/122.0',
'ajax_等待': '真的',
'页面等待': 5000
}
最大页数 = 2 # 根据需要调整要抓取的页面数

property_page_urls = get_property_urls(crawling_api, serp_url, 选项, max_pages)

# 进一步处理 property_page_urls

if __名字__ == “__主要的__”:
主()

第一个功能, fetch_html,旨在使用 API 检索给定 URL 的 HTML 内容,并可以指定参数。它包含重试机制,在出现错误或超时的情况下,尝试请求最多指定的次数(默认为 2)。如果服务器以成功状态 (HTTP 200) 进行响应,则该函数将返回解码后的 HTML 内容,否则,它将引发异常并提供有关响应状态的详细信息。

第二个函数, get_property_urls,旨在从指定网站的多个页面收集属性 URL。它首先获取初始页面的 HTML 内容以确定可用页面的总数。然后,它遍历页面,获取并解析 HTML 以提取属性 URL。要抓取的最大页面数由可用页面总数中的最小值和指定的最大页面参数确定。该函数返回从指定数量的页面收集的属性 URL 列表。

从属性页 URL 中提取所需数据

现在我们已经有了属性页 URL 的完整列表,下一步是从每个属性页中提取必要的数据。让我们增强脚本以浏览这些 URL 并收集相关详细信息,例如房产类型、地址、价格、面积、卧室和浴室数量以及其他重要数据点。

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
53
54
55
56
57
58
59
60
61
62
 爬行基地 进口 抓取API
bs4 进口 美丽汤
进口
进口 JSON

DEF 获取html(API、URL、选项):
# ...(不变)

DEF 获取属性网址(api、base_url、选项、max_pages):
# ...(不变)

DEF scrap_properties_data(api、url、选项):
属性数据 = []

网址 in 网址:
page_html = fetch_html(api, url, 选项)

if 页面_html is 不能 不包含:
汤 = BeautifulSoup(page_html, 'html.parser')
type_element = soup.select_one('div[data-testid="macro-data-view"] > div[data-renderstrat="inline"]:nth-child(3) div.dBmBNo:first-child > span')
builtin_year_element = soup.select_one('div[data-testid="macro-data-view"] > div[data-renderstrat="inline"]:nth-child(3) div.dBmBNo:nth-child(2) > 跨度')

地址元素 = soup.select_one('div[data-testid="macro-data-view"] > div[data-renderstrat="inline"]:nth-child(2) div[class^="styles__AddressWrapper-"] > h1')
Price_element = soup.select_one('div[data-testid="macro-data-view"] > div[data-renderstrat="inline"]:nth-child(2) span[data-testid="price"] > span')
size_element = soup.select_one('div[data-testid="macro-data-view"] > div[data-renderstrat="inline"]:nth-child(2) div[data-testid="bed-bath-sqft-facts"] > div[data-testid="bed-bath-sqft-fact-container"]:last-child > span:first-child')
卧室元素 = soup.select_one('div[data-testid="macro-data-view"] > div[data-renderstrat="inline"]:nth-child(2) div[data-testid="bed-bath-sqft-facts"] > div[data-testid="bed-bath-sqft-fact-container"]:第一个孩子 > span:第一个孩子')
Bathrooms_element = soup.select_one('div[data-testid="macro-data-view"] > div[data-renderstrat="inline"]:nth-child(2) div[data-testid="bed-bath-sqft-facts"] >按钮 > div[data-testid="bed-bath-sqft-fact-container"] > span:first-child')

属性数据 = {
'属性网址':网址,
'类型': type_element.text.strip() if 类型元素 其他 不包含,
'地址': 地址元素.text.strip() if 地址元素 其他 不包含,
'尺寸': size_element.text.strip() if 尺寸元素 其他 不包含,
'价格': Price_element.text.strip() if 价格元素 其他 不包含,
'卧室': 卧室_element.text.strip() if 卧室元素 其他 不包含,
“浴室”: Bathrooms_element.text.strip() if 浴室元素 其他 不包含,
'内置年份':builtin_year_element.text.strip() if 内置年份元素 其他 不包含,
}

属性_数据.append(属性_数据)

回报 属性数据

DEF ():
API_TOKEN = 'YOUR_CRAWLBASE_JS_TOKEN'
爬行 API = 爬行 API({'令牌':API_TOKEN})
serp_url = “https://www.zillow.com/columbia-heights-washington-dc/sale/”
选项= {
'用户代理': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/122.0',
'ajax_等待': '真的',
'页面等待': 5000
}
最大页数 = 2 # 根据需要调整要抓取的页面数

property_page_urls = get_property_urls(crawling_api, serp_url, 选项, max_pages)

property_data = scrape_properties_data(crawling_api, property_page_urls, 选项)

打印(json.dumps(properties_data, 缩进=2))

if __名字__ == “__主要的__”:
主()

该脚本介绍了 scrape_properties_data 函数,它从每个属性页 URL 检索 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
[
{
“属性网址”: “https://www.zillow.com/homedetails/1008-Fairmont-St-NW-Washington-DC-20001/473889_zpid/”,
“类型”: 「联排别墅」,
“地址”: “1008 Fairmont St NW,华盛顿,DC 00”,
“尺寸”: “1,801”,
“价钱”: “ $ 850,000”,
“卧室”: “3”,
“浴室”: “4”,
“内置年份”: “建于1910年”
},
{
“属性网址”: “https://www.zillow.com/homedetails/1429-Girard-St-NW-101-Washington-DC-20009/2053968963_zpid/”,
“类型”: 《股份合作社》,
“地址”: “1429 Girard St NW #101,华盛顿,DC 00”,
“尺寸”: “965”,
“价钱”: “ $ 114,745”,
“卧室”: “2”,
“浴室”: “1”,
“内置年份”: “建于1966年”
},
{
“属性网址”: “https://www.zillow.com/homedetails/1362-Parkwood-Pl-NW-Washington-DC-20010/472302_zpid/”,
“类型”: 《单身家庭住宅》,
“地址”: “1362 Parkwood Pl NW,华盛顿,DC 00”,
“尺寸”: “1,760”,
“价钱”: “ $ 675,000”,
“卧室”: “3”,
“浴室”: “2”,
“内置年份”: “建于1911年”
},
{
“属性网址”: “https://www.zillow.com/homedetails/3128-Sherman-Ave-NW-APT-1-Washington-DC-20010/2076798673_zpid/”,
“类型”: 《股份合作社》,
“地址”: “3128 Sherman Ave NW APT 1,华盛顿,DC 00”,
“尺寸”: “610”,
“价钱”: “ $ 117,000”,
“卧室”: “1”,
“浴室”: “1”,
“内置年份”: “建于1955年”
},
{
“属性网址”: “https://www.zillow.com/homedetails/1438-Meridian-Pl-NW-APT-106-Washington-DC-20010/467942_zpid/”,
“类型”: “公寓”,
“地址”: “1438 Meridian Pl NW APT 106,华盛顿,DC 00”,
“尺寸”: “634”,
“价钱”: “ $ 385,000”,
“卧室”: “2”,
“浴室”: “2”,
“内置年份”: “建于1910年”
},
{
“属性网址”: “https://www.zillow.com/homedetails/2909-13th-St-NW-Washington-DC-20009/473495_zpid/”,
“类型”: 「联排别墅」,
“地址”: “2909 13th St NW,华盛顿特区 00”,
“尺寸”: “3,950”,
“价钱”: “ $ 1,025,000”,
“卧室”: “7”,
“浴室”: “3”,
“内置年份”: “建于1909年”
},
{
“属性网址”: “https://www.zillow.com/homedetails/1412-Chapin-St-NW-APT-1-Washington-DC-20009/183133784_zpid/”,
“类型”: “公寓”,
“地址”: “1412 Chapin St NW APT 1,华盛顿,DC 00”,
“尺寸”: “724”,
“价钱”: “ $ 550,000”,
“卧室”: “2”,
“浴室”: “2”,
“内置年份”: “建于2015年”
},
..... 更多的
]

将抓取的数据保存在数据库中

一旦您成功地从 Zillow 属性页提取所需的数据,最好系统地存储这些信息。一种有效的方法是利用 SQLite 数据库来组织和管理抓取的房地产数据。下面是该脚本的增强版本,用于集成 SQLite 功能并保存抓取的数据:

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
 爬行基地 进口 抓取API
bs4 进口 美丽汤
进口 sqlite3
进口

DEF 获取html(API、URL、选项):
# ...(不变)

DEF 获取属性网址(api、base_url、选项、max_pages):
# ...(不变)

DEF scrap_properties_data(api、url、选项):
# ...(不变)

DEF 初始化数据库(数据库路径='zillow_properties_data.db'):
# 建立与SQLite数据库的连接
连接= sqlite3.connect(数据库路径)
光标 = 连接.cursor()

# 如果'properties'表不存在则创建它
游标.执行('''
如果不存在则创建表属性(
id 整数主键,
网址文本,
输入文本,
地址文本,
价格文本,
文本大小,
卧室文本,
浴室文本,
内置年份文本
)
''')

# 提交更改并关闭连接
连接提交()
连接.close()

DEF 插入数据库(属性数据、数据库路径='zillow_properties_data.db'):
# 建立与SQLite数据库的连接
连接= sqlite3.connect(数据库路径)
光标 = 连接.cursor()

# 将属性数据插入“properties”表中
游标.执行('''
INSERT INTO 属性(url、类型、地址、价格、大小、卧室、浴室、builtin_year)
值 (?, ?, ?, ?, ?, ?, ?, ?)
'''
属性数据.get('属性网址'),
属性数据.get('类型'),
属性数据.get('地址'),
属性数据.get('价格'),
属性数据.get('尺寸'),
属性数据.get('卧室'),
属性数据.get(“浴室”),
属性数据.get('内置年份')
))

# 提交更改并关闭连接
连接提交()
连接.close()

DEF ():
API_TOKEN = 'YOUR_CRAWLBASE_JS_TOKEN'
爬行 API = 爬行 API({'令牌':API_TOKEN})
serp_url = “https://www.zillow.com/columbia-heights-washington-dc/sale/”
选项= {
'用户代理': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/122.0',
'ajax_等待': '真的',
'页面等待': 5000
}
最大页数 = 2 # 根据需要调整要抓取的页面数

# 初始化数据库
初始化数据库()

property_page_urls = get_property_urls(crawling_api, serp_url, 选项, max_pages)

property_data = scrape_properties_data(crawling_api, property_page_urls, 选项)

# 向数据库中插入数据
属性数据 in 属性数据:
insert_into_database(属性数据)


if __名字__ == “__主要的__”:
主()

该脚本引入了两个函数: initialize_database 设置 SQLite 数据库表,以及 insert_into_database 将每个属性的数据插入数据库。 SQLite 数据库文件(zillow_properties_data.db) 将在脚本目录中创建。根据您的具体数据点调整表结构和插入逻辑。

properties 表快照:

属性表快照

使用 Crawlbase 的 Crawling API 进行 Zillow 抓取的优势

使用 Crawlbase 的 Crawling API 从 Zillow 抓取房地产数据变得更加高效。这就是它脱颖而出的原因:

  • 高效的动态内容处理:Crawlbase 的 API 能够熟练地管理 Zillow 上的动态内容,确保您的抓取工具捕获所有相关数据,即使存在延迟或动态变化。
  • 最小化 IP 阻塞风险:Crawlbase 通过允许您切换 IP 地址来降低 IP 封锁的风险,从而提高 Zillow 抓取项目的成功率。
  • 定制的抓取设置:使用以下设置自定义 API 请求 user_agent, formatcountry 根据特定需求进行适应性和高效的刮擦。
  • 分页变得简单:Crawlbase 使用类似参数简化分页处理 ajax_waitpage_wait,确保通过 Zillow 页面无缝导航以进行广泛的数据检索。
  • Tor 网络支持:为了增加隐私,Crawlbase 通过以下方式支持 Tor 网络: tor_network 参数,实现洋葱网站的安全抓取。
  • 异步爬取:API支持通过async参数进行异步抓取,提升Zillow大规模抓取任务的效率。
  • 用于数据提取的自动解析: 使用 autoparse 用于简化 JSON 格式数据提取的参数,减少后处理工作。

总之,Crawlbase 的 Crawling API 简化了 Zillow 抓取,提高了效率和适应性,使其成为房地产数据提取项目的可靠选择。

房地产洞察:分析 Zillow 数据

一旦您成功地从 Zillow 中抓取了房地产数据,您所收集的大量信息将为房地产行业的分析和应用提供多种可能性。以下是对潜在用例以及令人兴奋的数据分析和可视化领域的重要见解:

房地产专业人士的潜在用例

Zillow 数据房地产用例

识别市场趋势:Zillow 数据使房地产专业人士能够识别市场趋势,例如价格波动、需求模式和热门社区。这种洞察力有助于就房地产投资和销售策略做出明智的决策。

财产估价和比较:分析 Zillow 数据使专业人士能够评估房产价值并进行准确比较。这些信息对于确定有竞争力的定价、了解市场竞争力以及为客户提供实际的房地产估值建议至关重要。

有针对性的营销策略:通过深入研究 Zillow 数据,房地产专业人士可以定制他们的营销策略。他们可以针对特定的人口统计数据,创建有效的广告活动,并吸引正在积极搜索符合特定条件的房产的潜在客户。

投资机会:Zillow 数据提供了对潜在投资机会的见解。房地产专业人士可以识别具有高增长潜力、新兴趋势和利润丰厚的房地产开发或投资机会的领域。

客户咨询和建议:借助全面的 Zillow 数据,专业人员可以在咨询期间为客户提供准确和最新的信息。这提高了建议的可信度,并使客户能够做出明智的决策。

数据分析和可视化的可能性

Zillow数据分析

交互式仪表板:房地产专业人士可以使用 Zillow 数据创建交互式仪表板。这些仪表板提供了市场趋势、房地产价值和其他关键指标的可视化表示,使您更容易掌握复杂的信息。

地理空间制图:利用地理空间测绘,专业人士可以直观地表示房产位置、社区边界和市场热点。这有助于了解地理趋势并规划战略性房地产搬迁。

预测分析:将预测分析应用于 Zillow 数据可以让专业人士预测未来的市场趋势。这种积极主动的方法使他们能够领先于市场变化并为客户做出明智的决策。

比较市场分析 (CMA):Zillow 数据支持创建比较市场分析报告。这些报告包括详细的房产比较,帮助专业人士指导客户定价策略和房产估值。

最后的思考

在从 Zillow 抓取房地产数据的世界中,简单性和有效性发挥着至关重要的作用。虽然通用方法可能达到其目的,但 Crawlbase 爬网 API 成为一个更明智的选择。告别挑战,采用适用于 Zillow 抓取的 Crawlbase 爬行 API 的简化、可靠且可扩展的解决方案。

对于那些渴望探索从各种平台抓取数据的人,请随时深入了解我们的综合指南:

📜 如何抓取亚马逊
📜 如何爬取 Airbnb 价格
📜 如何抓取 Booking.com
📜 如何抓取 Expedia

快乐刮擦!如果您遇到任何障碍或需要指导,我们的 敬业的团队 在这里为您的房地产数据领域之旅提供支持。

常见问题解答(FAQ)

网络抓取是一个复杂的法律领域。虽然 Zillow 的服务条款通常允许浏览,但系统数据提取可能会受到限制。建议查看 Zillow 的条款和条件,包括 robots.txt 文件。始终尊重网站的政策并考虑网络抓取的道德影响。

Q2:我可以将 Zillow 数据用于商业目的吗?

抓取数据的使用,特别是用于商业目的,取决于 Zillow 的政策。请务必仔细审查并遵守 Zillow 的服务条款,包括与数据使用和版权相关的任何准则。如果您打算将抓取的数据用于商业目的,建议寻求法律建议。

问题 3:使用 Crawlbase Crawling API 进行 Zillow 抓取有任何限制吗?

虽然 Crawlbase 爬网 API 是一个强大的工具,但用户应该意识到某些限制。这些可能包括 API 施加的速率限制、与 API 使用相关的政策以及由于目标网站结构的变化而需要的潜在调整。建议参阅 Crawlbase 文档以获取有关 API 限制的全面信息。

问题 4:如何使用 Crawlbase 抓取 API 处理 Zillow 上的动态内容?

Crawlbase 爬网 API 提供了处理动态内容的机制。参数如 ajax_waitpage_wait 是确保 API 捕获所有相关内容的重要工具,即使网页在抓取过程中发生动态变化。根据网站的行为调整这些参数有助于有效的内容检索。