全球各大城市最近报告称 房价 由于几个原因。随着越来越多的人采用技术来解决这一挑战,房地产数据是当今最受欢迎的信息之一。 家园网 拥有美国各地房产列表的庞大数据库,是房地产行业的有用资源。大多数潜在客户会使用该网站轻松收集重要信息,例如价格、位置和其他细节。
然而,浏览 Homes.com 上的数百页内容可能是一项艰巨的任务。因此,抓取 homes.com 的内容对于买家、投资者和卖家来说是一个获取有关美国房价的宝贵见解的好机会。
本博客将教你如何使用 Python 和 爬虫库。它将探讨设置环境以处理反抓取措施的基础知识,使您能够创建良好的 homes.com 抓取工具。
目录
- 为什么要抓取homes.com 房产数据?
- 我们可以从homes.com 上抓取什么?
- 使用 Crawlbase 绕过 Homes.com 封锁
- Homes.com 反抓取措施概述
- 使用Crawlbase Crawling API进行平滑抓取
- home.com 抓取的环境设置
- 如何抓取 homes.com 的搜索页面
- 如何爬取 homes.com 的房产页面
- 总结
- 常见问题解答(FAQ)
您想要抓取homes.com 的原因有很多。假设您是房地产专业人士或分析师。在这种情况下,您可以收集homes.com 数据以保持市场领先地位,并深入了解房产价值、租金价格、社区统计数据等。这些信息对于制定投资决策和营销策略至关重要。
如果您是开发人员或数据科学家,使用 Python 抓取 homes.com 可以让您构建一个以数据为基础的强大应用程序。通过创建 homes.com 抓取工具,您可以自动化收集和分析房产数据的过程,从而节省时间和精力。此外,访问最新的房产列表可以帮助您识别房地产市场的新兴趋势和机会。
总的来说,废除 homes.com 可以为任何在房地产行业工作的人带来很多好处,无论是投资者、代理商、数据科学家还是开发商。
我们可以从homes.com 上抓取什么?
以下是您可以从 homes.com 上抓取的内容:
显示可从 Homes.com 抓取的不同类型数据的图像
- 物业清单:Homes.com 房产列表提供有关可用住宅、公寓、公寓等的信息。抓取这些列表可以提供有关重要特征、便利设施和房产图像的数据。
- 价格信息:了解房地产市场价格趋势是占据优势地位的关键。从 homes.com 抓取价格信息可让您分析不同时间和不同地点的价格变化。
- 房产详细信息:除了基本详细信息外,homes.com 还向客户提供有关房产的明确详细信息,其中包括平方英尺、卧室和浴室数量、房产类型等。您可以抓取所有这些信息,以便更好地了解每个列表。
- 位置数据: 位置在房地产中起着重要作用。从homes.com 抓取位置数据可以深入了解社区设施、学校、交通选择等,帮助您评估房产的吸引力。
- 市场趋势:通过定期抓取homes.com,您可以跟踪市场趋势以及供需波动。这些数据使您能够识别新兴模式并预测未来的市场走势。
- Historical Data:保存有关房地产市场历史的数据,历史数据对于研究房地产过去的趋势和模式很有用。假设您已从 homes.com 上抓取了历史列表和定价数据,您现在可以进行纵向研究并了解长期趋势。
- 对比分析:使用 Homes.com 数据,您可以进行比较分析,比较同一社区内的房产与整个城镇或您想要购买或出售房产的多个地点的房产。您可以利用这些数据快速确定您的竞争对手是谁,并用它来确定价格策略。
- 市场动态:了解市场动态对于驾驭房地产格局至关重要。通过 home.com 抓取数据,您可以监控库存水平、上市时间和上市频率等因素,从而深入了解市场健康状况和稳定性。
Homes.com 与许多其他网站一样,采用 JavaScript 渲染 并采取反抓取措施,防止自动机器人访问并提取其页面的数据。
关于 Homes.com 如何阻止数据抓取,你需要知道以下几点:
- JS渲染:Homes.com 与许多其他网站一样,使用 JavaScript(JS)渲染来动态加载内容,这使得仅依赖 HTML 解析的传统抓取方法变得更具挑战性。
- IP阻止:如果 Homes.com 怀疑存在自动抓取活动,它可能会阻止从特定 IP 地址访问其网站。
- 验证码:为了验证用户是人类而不是机器人,Homes.com 可能会显示验证码,这需要手动交互才能继续。
- 速率限制:Homes.com 可能会限制用户在一定时间内发出的请求数量,以防止抓取过载。
这些措施使得使用传统方法从 Homes.com 抓取数据变得具有挑战性。
使用Crawlbase Crawling API进行平滑抓取
Crawlbase 提供了一个可靠的解决方案,可以从 Homes.com 抓取数据,同时绕过其阻止机制。通过利用 Crawlbase 的爬行 API,您可以访问住宅 IP 地址池,确保无缝抓取操作而不会中断。它是 参数 让您轻松处理任何类型的抓取问题。
爬行 API 可以处理 JavaScript 渲染,这使您可以抓取通过简单请求无法访问的动态内容。此外,Crawlbase 管理用户代理轮换和 验证码解决,进一步完善刮削工艺。
Crawlbase 提供自己的 Python 库 以便于集成。以下步骤演示了如何在 Python 项目中使用 Crawlbase 库:
- 装置:安装Crawlbase Python 图书馆 通过运行以下命令。
- 认证:通过以下方式获取访问令牌 创建一个帐户 在爬行基地上。该令牌将用于验证您的请求。对于homes.com,我们需要 JS代币.
这是一个示例函数,演示了如何使用 Crawlbase 库中的 Crawling API 发送请求:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| from 爬行基地 进口 抓取API
爬行 API = 爬行 API({ '令牌': 'YOUR_CRAWLBASE_TOKEN' })
DEF make_crawlbase_request(网址): 响应=crawling_api.get(url)
if 回复[“标题”]['pc_status'] == '200': html_内容=响应['身体']。解码('utf-8') 回报 html_内容 其他: 打印(f"无法获取页面。Crawlbase 状态代码: {回复[“标题”]['pc_status']}") 回报 不包含
|
备注:通过 Crawling API 的前 1000 个请求是免费的,并且不需要信用卡。您可以参考 API 文档了解更多详细信息。
在开始抓取homes.com 之前,必须设置您的环境以确保流程顺利高效。以下是帮助您入门的分步指南:
- 安装Python:首先,确保您的计算机上安装了Python。您可以从以下位置下载并安装最新版本的 Python 官方网站.
- 虚拟环境:建议创建一个虚拟环境来管理项目依赖关系,避免与其他Python项目冲突。导航到终端中的项目目录并执行以下命令来创建名为“homes_scraping_env”的虚拟环境:
1
| python -m venv homes_scraping_env
|
根据您的操作系统运行适当的命令来激活虚拟环境:
在Windows上:
1
| homes_scraping_env\脚本\激活
|
在 macOS/Linux 上:
1
| 资源 homes_scraping_env/bin/激活
|
- 安装所需的库:接下来,安装网页抓取所需的库。您需要像 BeautifulSoup 和 Crawlbase 这样的库来有效地抓取homes.com。您可以使用 Python 包管理器 pip 安装这些库。只需打开命令提示符或终端并运行以下命令:
1 2
| 点安装beautifulsoup4 pip 安装 Crawlbase
|
代码编辑器:选择代码编辑器或集成开发环境 (IDE) 来编写和运行 Python 代码。受欢迎的选项包括 PyCharm, Visual Studio代码及 Jupyter笔记本。安装您首选的代码编辑器并确保其配置为与 Python 一起使用。
创建 Python 脚本:在您选择的 IDE 中创建一个新的 Python 文件,您将在其中编写抓取代码。您可以将此文件命名为“homes_scraper.py”。此脚本将包含抓取 homes.com 并提取所需数据的代码。
通过执行这些步骤,您将拥有一个配置良好的环境,可以有效地抓取homes.com。借助正确的工具和技术,您将能够从homes.com 收集有价值的数据来支持您的房地产工作。
如何抓取 homes.com 的搜索页面
从 Homes.com 上抓取房产列表可以为您提供有关房地产市场的宝贵见解。
在本节中,我们将向您展示如何使用 Python 直接方法抓取 Homes.com 搜索页面。
导入库
我们需要导入所需的库:用于制作HTTP的CrawlingAPI requests
和 BeautifulSoup
用于解析 HTML 内容。
1 2
| from 爬行基地 进口 抓取API from bs4 进口 美丽汤
|
初始化爬取API
从 Crawlbase 获取您的 JS 令牌并使用它初始化 CrawlingAPI 类。
1 2
| 爬行 API = 爬行 API({ '令牌': 'CRAWLBASE_JS_TOKEN' })
|
定义常量
设置 Homes.com 搜索页面和输出 JSON 文件的基本 URL。为了解决 JS 渲染问题,我们可以使用 ajax_等待 和 页面等待 爬取API提供的参数。我们还可以提供定制 USER_AGENT 就像下面的选项一样。我们将对从分页中抓取的页面数量设置限制。
1 2 3 4 5 6 7 8 9
| BASE_URL = 'https://www.homes.com/los-angeles-ca/homes-for-rent' 输出文件 = ‘properties.json’ 最大页数= 2
选项= { 'ajax_等待': '真的', '页面等待': 10000, “用户代理”: “Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0” }
|
刮痧功能
创建一个函数以从 Homes.com 抓取房产列表。该函数将循环指定数量的页面,向 Homes.com 发出请求,并解析 HTML 内容以提取属性详细信息。
我们必须检查页面并找到 CSS 选择器,通过它我们可以获取所有列表元素。
每个列表都位于 div
有课 for-rent-content-container
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| DEF scrap_listings(): 属性=[]
页 in 范围(1, 最大页数 + 1): 网址= f'{基本网址}/p{页}/' 打印(f"抓取页面 {页} of {网址}")
尝试: html_content = make_crawlbase_request(网址) if html_内容: 汤 = BeautifulSoup(html_content, 'html.parser') 属性列表 = 汤.选择(‘div.for-rent-内容容器’) 属性.扩展(属性列表) 除 特殊课程 as e: 打印(f“请求在页面上失败 {页}: {e}")
回报
|
解析日期
为了从 HTML 内容中提取相关详细信息,我们需要一个处理 soup 对象并检索特定信息的函数。我们可以检查页面并找到包含我们所需信息的元素选择器。
在上图中你可以看到标题位于 p
元素智慧类 property-name
,因此我们可以将它们用作选择器来定位 title 元素。同样,我们可以找到包含我们所需的重要信息的其他元素的选择器。
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
| DEF 解析属性详细信息( ): 属性列表 = [] 财产 in 特性: 标题元素 = 财产.select_one(‘p.属性名称’) 地址元素 = 财产.select_one('p.地址') 信息容器= 财产.select_one(‘ul.详细信息容器’) extra_info = info_container.find_all(‘礼’) if 信息容器 其他 [] 描述元素= 财产.select_one(‘p.属性描述’) url_elem = 财产.select_one('一种')
标题 = title_elem.text.strip() if 标题元素 其他 “不适用” 地址 = 地址_elem.text.strip() if 地址元素 其他 “不适用” 价格=额外信息[0].文本.strip() if 额外信息 其他 “不适用” 床位 = 额外信息[1].文本.strip() if LEN(额外信息)> 1 其他 “不适用” 浴室 = extra_info[2].文本.strip() if LEN(额外信息)> 2 其他 “不适用” 描述 = description_elem.text.strip() if 描述元素 其他 “不适用” url = BASE_URL + url_elem.get('href') if 网址元素 其他 “不适用”
属性数据 = { “标题”: 标题, “地址”: 地址, “价钱”: 价格, “床”: 床, “洗澡”: 洗澡, “说明”: 描述, “网址”: 网址 } property_list.append(property_data)
回报 属性列表
|
此函数处理属性元素列表并提取相关详细信息。它返回包含属性详细信息的字典列表。
存储数据
接下来,我们需要一个函数将解析后的属性详细信息存储到 JSON 文件中。
1 2 3 4 5
| 进口 JSON
DEF 保存属性详细信息到 JSON(属性列表,文件名): - 打开(文件名, 'w') as json_文件: json.dump(property_list, json_file, 缩进=4)
|
该函数将收集到的属性数据写入JSON文件,以便于分析。
运行脚本
最后,结合抓取和解析功能,并运行脚本开始从 Homes.com 搜索页面收集数据。
1 2 3 4
| if __名字__ == '__主要__': 属性 = scrape_listings() 属性列表 = 解析属性详细信息 (属性) save_property_details_to_json(属性列表,输出文件)
|
完整的代码
以下是从 homes.com 搜索页面抓取房产列表的完整代码。
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 88
| from bs4 进口 美丽汤 from 爬行基地 进口 抓取API 进口 JSON
爬行 API = 爬行 API({ '令牌': 'CRAWLBASE_JS_TOKEN' })
BASE_URL = 'https://www.homes.com/los-angeles-ca/homes-for-rent' 输出文件 = ‘properties.json’ 最大页数= 2
选项= { 'ajax_等待': '真的', '页面等待': 10000, “用户代理”: “Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0” }
DEF make_crawlbase_request(网址): 响应=crawling_api.get(url,选项) if 回复[“标题”]['pc_status'] == '200': html_内容=响应['身体']。解码('utf-8') 回报 html_内容 其他: 打印(f"无法获取页面。Crawlbase 状态代码: {回复[“标题”]['pc_status']}") 回报 不包含
DEF scrap_listings(): 属性=[]
页 in 范围(1, 最大页数 + 1): 网址= f'{基本网址}/p{页}/' 打印(f"抓取页面 {页} of {网址}")
尝试: html_content = make_crawlbase_request(网址) if html_内容: 汤 = BeautifulSoup(html_content, 'html.parser') 属性列表 = 汤.选择(‘div.for-rent-内容容器’) 属性.扩展(属性列表) 除 特殊课程 as e: 打印(f“请求在页面上失败 {页}: {e}")
回报
DEF 解析属性详细信息( ): 属性列表 = [] 财产 in 特性: 标题元素 = 财产.select_one(‘p.属性名称’) 地址元素 = 财产.select_one('p.地址') 信息容器= 财产.select_one(‘ul.详细信息容器’) extra_info = info_container.find_all(‘礼’) if 信息容器 其他 [] 描述元素= 财产.select_one(‘p.属性描述’) url_elem = 财产.select_one('一种')
标题 = title_elem.text.strip() if 标题元素 其他 “不适用” 地址 = 地址_elem.text.strip() if 地址元素 其他 “不适用” 价格=额外信息[0].文本.strip() if 额外信息 其他 “不适用” 床位 = 额外信息[1].文本.strip() if LEN(额外信息)> 1 其他 “不适用” 浴室 = extra_info[2].文本.strip() if LEN(额外信息)> 2 其他 “不适用” 描述 = description_elem.text.strip() if 描述元素 其他 “不适用” url = BASE_URL + url_elem.get('href') if 网址元素 其他 “不适用”
属性数据 = { “标题”: 标题, “地址”: 地址, “价钱”: 价格, “床”: 床, “洗澡”: 洗澡, “说明”: 描述, “网址”: 网址 } property_list.append(property_data)
回报 属性列表
DEF 保存属性详细信息到 JSON(属性列表,文件名): - 打开(文件名, 'w') as json_文件: json.dump(property_list, json_file, 缩进=4)
if __名字__ == '__主要__': 属性 = scrape_listings() 属性列表 = 解析属性详细信息 (属性) save_property_details_to_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 39 40 41 42 43 44 45 46 47 48
| [ { “标题”: "公寓出租", “地址”: “3824 Keystone Ave Unit 2,卡尔弗城,加利福尼亚州 90232”, “价钱”: “每月 3,300 美元”, “床”: 「2张床」, “洗澡”: “1.5 个浴室”, “说明”: “经过全面改造的宽敞公寓,设有 2 间卧室和 1.5 间浴室,位于卡尔弗城的绝佳位置。步行即可到达卡尔弗城市中心,方便前往 405 号和 10 号高速公路。开放式概念厨房,配有早餐吧,可俯瞰客厅和大型私人浴室。 ”, “网址”: "https://www.homes.com/los-angeles-ca/homes-for-rent/property/3824-keystone-ave-culver-city-ca-unit-2/2er2mwklw8zq6/" }, { “标题”: “房屋出租”, “地址”: “3901 Alonzo Ave,恩西诺,CA 91316”, “价钱”: “每月 17,000 美元”, “床”: 「4张床」, “洗澡”: “3.5 个浴室”, “说明”: “隐藏在恩西诺山上一条安静的小路上,居住着这座经过更新的西班牙住宅,可以欣赏到山谷一览无余的全景。双门欢迎您进入开放式概念平面图,该平面图设有宽敞的正式起居室和餐厅,时尚的现代化厨房配备“, “网址”: “https://www.homes.com/los-angeles-ca/homes-for-rent/property/3901-alonzo-ave-encino-ca/879negnf45nee/” }, { “标题”: “房屋出租”, “地址”: “13463 Chandler Blvd,谢尔曼奥克斯,加利福尼亚州 91401”, “价钱”: “每月 30,000 美元”, “床”: 「5张床」, “洗澡”: “4.5 个浴室”, “说明”: “这座全新改建的单层住宅令人惊叹,位于谢尔曼奥克斯 (Sherman Oaks) 非常理想的钱德勒庄园 (Chandler Estates) 社区。这套 3,600 居室 - 5 卫住宅采用宽敞的平面图,充分利用了 4.5 平方英尺的面积,是真正的住宅表达温暖和美丽,“, “网址”: “https://www.homes.com/los-angeles-ca/homes-for-rent/property/13463-chandler-blvd-sherman-oaks-ca/mnrh1cw3fn92b/?t=forrent” }, { “标题”: “房屋出租”, “地址”: “加利福尼亚州谢尔曼奥克斯,猛犸大街 4919 号,邮编 91423”, “价钱”: “每月 19,995 美元”, “床”: 「5张床」, “洗澡”: “6.5 个浴室”, “说明”: “华丽的新住宅位于谢尔曼奥克斯黄金地段的一个门控地段,可爱的社区!主住宅设有 5 间卧室和 2013 间浴室,宽敞的附属住宅单元面积约 6.5 平方英尺。开放式平面图设有带定制背光装饰墙的客厅,以及配有定制葡萄酒展示的餐厅和”, “网址”: "https://www.homes.com/los-angeles-ca/homes-for-rent/property/4919-mammoth-ave-sherman-oaks-ca/yv8l136ks5f2e/" }, { “标题”: “房屋出租”, “地址”: “12207 Valleyheart Dr,Studio City,加利福尼亚州 91604”, “价钱”: “每月 29,500 美元”, “床”: 「6张床」, “洗澡”: “6.5 个浴室”, “说明”: “优雅宽敞的现代农舍,外观迷人,是山谷最迷人的街道之一,是豪华舒适的度假胜地。该房产位于令人垂涎且交通便利的 Studio City,拥有开放式温馨的楼层平面图,配有 ADU,提供足够的房间和空间”, “网址”: “https://www.homes.com/los-angeles-ca/homes-for-rent/property/12207-valleyheart-dr-studio-city-ca/6104hnkegbnx3/” }, ..... 更多的 ]
|
如何抓取 Homes.com 属性页
抓取 Homes.com 房产页面可以提供有关各个房源的详细信息。
在本节中,我们将指导您完成使用 Python 抓取特定属性页的过程。
导入库
我们需要导入制作HTTP所需的库:crawlbase requests
和 BeautifulSoup
用于解析 HTML 内容。
1 2
| from 爬行基地 进口 抓取API from bs4 进口 美丽汤
|
初始化爬取API
使用您的 Crawlbase JS 令牌初始化 CrawlingAPI 类,如下所示。
1 2
| 爬行 API = 爬行 API({ '令牌': 'CRAWLBASE_JS_TOKEN' })
|
定义常量
设置要抓取的属性页的目标 URL,并定义输出 JSON 文件。为了解决 JS 渲染问题,我们可以使用 ajax_等待 和 页面等待 爬取API提供的参数。我们还可以提供定制 USER_AGENT 就像下面的选项一样。
1 2 3 4 5 6 7 8
| 网址= 'https://www.homes.com/property/14710-greenleaf-st-sherman-oaks-ca/fylqz9clgbzd2/' 输出文件 = 'property_details.json'
选项= { 'ajax_等待': '真的', '页面等待': 10000, “用户代理”: “Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0” }
|
刮痧功能
创建一个函数,从 Homes.com 抓取单个房产的详细信息。此函数将向房产页面发出请求,解析 HTML 内容,并提取必要的详细信息。
1 2 3 4 5 6 7 8 9 10 11
| DEF scrape_property(网址): 尝试: html_content = make_crawlbase_request(网址) if html_内容: 汤 = BeautifulSoup(html_content, 'html.parser') 属性详细信息 = 提取属性详细信息 (汤) 回报 房产详情 除 特殊课程 as e: 打印(f"请求失败: {e}")
回报 不包含
|
创建一个函数以从属性页中提取特定详细信息。该函数将解析 HTML 并提取诸如标题、地址、价格、卧室数量、浴室数量和描述等信息。
我们可以使用浏览器中的“Inspect”工具来查找包含我们需要的信息的元素的 CSS 选择器,就像我们在上一节中所做的那样。
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
| DEF 提取属性详细信息(汤): 地址元素 = soup.select_one(‘div.property-info-地址’) price_elem = soup.select_one('跨度#价格') bed_elem = soup.select_one('span.property-info-feature > span.feature-beds') baths_elem = soup.select_one(‘span.property-info-feature > span.feature-baths’) area_elem = soup.select_one(‘span.property-info-feature.lotsize’) description_elem = soup.select_one('div#ldp-描述文本') agent_elem = soup.select_one('div.代理名称') agent_phone_elem = soup.select_one('div.座席电话')
地址 = 地址_elem.text.strip() if 地址元素 其他 “不适用” 价格 = Price_elem.text.strip() if 价格元素 其他 “不适用” 床 = bed_elem.text.strip() if 床元素 其他 “不适用” 浴室 = baths_elem.text.strip() if 浴场元素 其他 “不适用” 区域=area_elem.text.strip() if 区域元素 其他 “不适用” 描述 = description_elem.text.strip() if 描述元素 其他 “不适用” 代理 = agent_elem.text.strip() if agent_elem 其他 “不适用” agent_phone = agent_phone_elem.text.strip() if 代理电话元素 其他 “不适用”
属性数据 = { '地址': 地址, '价格': 价格, ‘床’: 床, ‘浴室’: 洗澡, '区域': 区域, '描述': 描述, '代理人': 代理人, ‘代理电话’: 代理电话 }
回报 属性数据
|
存储数据
创建一个函数将抓取的数据存储在 JSON 文件中。此函数获取提取的属性数据并将其保存到 JSON 文件中。
1 2 3 4 5
| 进口 JSON
DEF 保存属性详细信息到 JSON(属性数据,文件名): - 打开(文件名, 'w') as json_文件: json.dump(property_data, json_file, 缩进=4)
|
运行脚本
组合这些函数并运行脚本以抓取多个房产页面。在列表中提供要抓取的房产 ID。
1 2 3 4 5
| if __名字__ == '__主要__': 属性数据 = scrape_property(URL)
if 属性数据: 保存属性详细信息到 JSON(属性数据,输出文件)
|
完整的代码
以下是从 homes.com 房产页面抓取房产列表的完整代码。
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
| from 爬行基地 进口 抓取API from bs4 进口 美丽汤 进口 JSON
爬行 API = 爬行 API({ '令牌': 'CRAWLBASE_JS_TOKEN' })
网址= 'https://www.homes.com/property/14710-greenleaf-st-sherman-oaks-ca/fylqz9clgbzd2/' 输出文件 = 'property_details.json'
选项= { 'ajax_等待': '真的', '页面等待': 10000, “用户代理”: “Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0” }
DEF make_crawlbase_request(网址): 响应=crawling_api.get(url,选项) if 回复[“标题”]['pc_status'] == '200': html_内容=响应['身体']。解码('utf-8') 回报 html_内容 其他: 打印(f"无法获取页面。Crawlbase 状态代码: {回复[“标题”]['pc_status']}") 回报 不包含
DEF scrape_property(网址): 尝试: html_content = make_crawlbase_request(网址) if html_内容: 汤 = BeautifulSoup(html_content, 'html.parser') 属性详细信息 = 提取属性详细信息 (汤) 回报 房产详情 除 特殊课程 as e: 打印(f"请求失败: {e}")
回报 不包含
DEF 提取属性详细信息(汤): 地址元素 = soup.select_one(‘div.property-info-地址’) price_elem = soup.select_one('跨度#价格') bed_elem = soup.select_one('span.property-info-feature > span.feature-beds') baths_elem = soup.select_one(‘span.property-info-feature > span.feature-baths’) area_elem = soup.select_one(‘span.property-info-feature.lotsize’) description_elem = soup.select_one('div#ldp-描述文本') agent_elem = soup.select_one('div.代理名称') agent_phone_elem = soup.select_one('div.座席电话')
地址 = 地址_elem.text.strip() if 地址元素 其他 “不适用” 价格 = Price_elem.text.strip() if 价格元素 其他 “不适用” 床 = bed_elem.text.strip() if 床元素 其他 “不适用” 浴室 = baths_elem.text.strip() if 浴场元素 其他 “不适用” 区域=area_elem.text.strip() if 区域元素 其他 “不适用” 描述 = description_elem.text.strip() if 描述元素 其他 “不适用” 代理 = agent_elem.text.strip() if agent_elem 其他 “不适用” agent_phone = agent_phone_elem.text.strip() if 代理电话元素 其他 “不适用”
属性数据 = { '地址': 地址, '价格': 价格, ‘床’: 床, ‘浴室’: 洗澡, '区域': 区域, '描述': 描述, '代理人': 代理人, ‘代理电话’: 代理电话 }
回报 属性数据
DEF 保存属性详细信息到 JSON(属性数据,文件名): - 打开(文件名, 'w') as json_文件: json.dump(property_data, json_file, 缩进=4)
if __名字__ == '__主要__': 属性数据 = scrape_property(URL)
if 属性数据: 保存属性详细信息到 JSON(属性数据,输出文件)
|
示例输出:
1 2 3 4 5 6 7 8 9 10
| { “地址”: “14710 Greenleaf St Sherman Oaks,加利福尼亚州 91403”, “价钱”: “每月 11,000 美元”, “床”: “床”, “洗澡”: “沐浴”, “区域”: “10,744 平方英尺土地”, “说明”: “不适用”, “代理人”: 迈尔斯·刘易斯, “代理电话”: “(747)298-7020” }
|
总结
从 Homes.com 抓取数据对于市场研究、投资分析和营销策略非常有用。使用 Python 和 BeautifulSoup 等库或 Crawlbase 等服务,您可以高效地从 Homes.com 列表中收集数据。
Crawlbase 的爬行 API 自信地执行抓取任务,确保您的请求模拟真实的用户交互。这种方法提高了抓取效率,同时最大限度地降低了被 Homes.com 的反抓取措施检测和阻止的风险。
如果您有兴趣了解如何从其他房地产网站抓取数据,请查看下面的有用指南。
📜 如何抓取 Realtor.com
📜 如何刮 Zillow
📜 如何抓取 Airbnb
📜 如何抓取 Booking.com
📜 如何抓取 Redfin
如果您有任何问题或反馈,我们的 支持团队 随时为您的网络抓取之旅提供帮助。请记住遵守道德准则并尊重网站的服务条款。快乐刮擦!
常见问题解答(FAQ)
是的,只要您遵守 Homes.com 的服务条款并且不参与任何违反其政策的活动,从 Homes.com 抓取数据是合法的。负责任且合乎道德地使用抓取数据至关重要,确保您不会对网站或其用户造成任何伤害或干扰。
虽然由于 Homes.com 的反抓取措施,在不被阻止的情况下抓取 Homes.com 可能具有挑战性,但有一些技术和工具可以帮助降低被阻止的风险。利用 Crawlbase 等 API、轮换 IP 地址和模仿人类行为可以帮助提高顺利抓取数据而不触发阻止机制的机会。
问:我应该多久从 Homes.com 抓取一次数据?
从 Homes.com 抓取数据的频率取决于您的具体需求和目标。在及时收集更新和避免网站服务器过载或触发反抓取措施之间取得平衡至关重要。定期监控列表、市场趋势或其他相关数据的变化有助于确定适合您用例的最佳抓取频率。