对于希望获取场地、用户评论或基于位置的见解的开发人员和企业来说,从 Foursquare 抓取数据非常有帮助。Foursquare 是最受欢迎的基于位置的服务之一,拥有超过 50百万活跃月度用户 及以上 全球 95 万个地点通过从 Foursquare 抓取数据,您可以获得用于市场研究、业务开发或构建基于位置的应用程序的有价值的信息。
本文将向您展示如何使用 Python 轻松抓取 Foursquare 数据以及 爬虫库 Crawling API 这对于像 Foursquare 这样严重依赖 JavaScript 渲染的网站来说非常完美。无论您是想获取搜索列表还是详细的场地信息,我们都会逐步向您展示如何操作。
让我们深入了解该过程,从设置 Python 环境到以结构化方式提取和存储 Foursquare 数据。
目录
- 为什么要从 Foursquare 提取数据?
- 从 Foursquare 中提取的关键数据点
- 爬虫库 Crawling API 用于 Foursquare 抓取
- 设置 Python 环境
- 抓取 Foursquare 搜索列表
- 检查 HTML 中的选择器
- 编写 Foursquare 搜索列表抓取工具
- 处理分页
- 将数据存储在 JSON 文件中
- 完整代码示例
- 抓取 Foursquare 场地详细信息
- 检查 HTML 中的选择器
- 编写 Foursquare 场地详细信息抓取工具
- 将数据存储在 JSON 文件中
- 完整代码示例
- 总结
- 常见问题
Foursquare 是一个庞大的平台,拥有数百万个地点的位置数据,例如餐馆、咖啡馆、公园等。无论您是开发基于位置的应用程序、进行市场研究还是分析场地评论,Foursquare 都能满足您的需求。通过提取这些数据,您可以获得洞察力,为您的决策和规划提供参考。
企业可以使用 Foursquare 数据来详细了解客户偏好、热门场所和区域趋势。开发人员可以使用这些数据来构建自定义应用,例如旅游指南或推荐引擎。Foursquare 拥有场所名称、地址、评分和评论,因此从该平台提取数据可以彻底改变您的项目。
抓取 Foursquare 数据时,您需要知道可以收集哪些数据。以下是您可以从 Foursquare 获得的数据:

- 会场名称:商家或地点名称,例如餐厅、咖啡馆、公园。
- 邮寄地址:会场的完整地址,包括街道、城市和邮政编码。
- 类别:按场所类型(例如餐厅、酒吧、博物馆)对数据进行分类。
- 评分和评论:用户生成的评级和评论以了解客户满意度。
- 营业时间:场地的营业时间,适合时间敏感的应用。
- 联系信息:联系场馆的电话号码、电子邮件地址或网站。
- 图片:用户上传照片来了解场地情况。
- 地理坐标:用于地图和基于位置的应用程序的场地经纬度。
爬虫库 Crawling API 用于 Foursquare 抓取
Foursquare 使用 JavaScript 动态加载其内容,这使得使用传统方法很难抓取数据。这就是 爬虫库 Crawling API 出现了。它旨在通过模仿真实的用户交互和渲染整个页面来处理具有大量 JavaScript 渲染的网站。
这就是为什么使用 Crawlbase Crawling API 对于抓取 Foursquare 来说,这是一个不错的选择:
- JavaScript渲染:它负责加载 Foursquare 页面上的所有动态内容,以便您获得完整的数据而不会错过重要信息。
- IP 轮换和代理:Crawlbase 会自动轮换 IP 地址并使用智能代理以避免被网站屏蔽。
- 易于集成:Crawlbase API 很容易与 Python 集成,并提供灵活的选项来控制抓取,例如滚动间隔、等待时间和分页处理。
Crawlbase Python 库
Crawlbase 还拥有 Python 库 使用它,您可以轻松地在项目中使用 Crawlbase 产品。您需要一个访问令牌,您可以通过注册 Crawlbase 来获取该令牌。
以下是向 Crawlbase 发送请求的示例 Crawling API:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 在 爬行基地 进口 抓取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']}") 回报 没有
|
备注:Crawlbase 提供两种类型的令牌:用于静态站点的普通令牌和用于动态或浏览器呈现内容的 JavaScript (JS) 令牌,这对于抓取 Foursquare 必不可少。Crawlbase 还提供 1,000 个免费请求来帮助您入门,并且您无需信用卡即可注册。有关更多详细信息,请查看 爬虫库 Crawling API 文件.
在下一部分中,我们将介绍如何设置 Python 环境以开始抓取。
设置 Python 环境
在开始抓取 Foursquare 数据之前,我们需要设置正确的 Python 环境。这包括安装 Python 和必要的库,以及选择正确的 IDE(集成开发环境)来编写和运行我们的代码。
安装 Python 和所需的库
首先,确保你的电脑上安装了 Python。你可以从以下网址下载最新版本的 Python: 蟒蛇网。安装后,您可以通过在终端或命令提示符中运行以下命令来检查 Python 是否正常运行:
接下来,您需要安装所需的库。在本教程中,我们将使用 Crawlbase 和 BeautifulSoup 来解析 HTML。您可以通过运行以下命令来安装这些库:
1
| pip 安装 crawlbase beautifulsoup4
|
这些库将帮助你与 Crawlbase 进行交互 Crawling API,从HTML中提取有用的信息,并组织数据。
选择 IDE
要编写和运行 Python 脚本,您需要一个 IDE。以下是一些选项:
选择你喜欢的。设置好环境后,你就可以开始编写 Foursquare 搜索列表的代码了。
抓取 Foursquare 搜索列表
在本节中,我们将从 Foursquare 中抓取搜索列表。Foursquare 搜索列表包含有关地点的各种详细信息,例如名称、地址、类别等。我们将分为以下步骤:
检查 HTML 中的选择器
在编写抓取工具之前,我们需要检查 Foursquare 搜索页面,以确定包含要提取的数据的 HTML 结构和 CSS 选择器。具体操作如下:
- 打开搜索列表页面:转到 Foursquare 搜索结果页面(例如,在特定位置搜索“餐厅”)。
- 检查页面:右键单击页面并选择“检查”或按
Ctrl + Shift + I
打开开发人员工具。

- 找到相关元素:
- 地名:地名位于
<div>
带有类的标签 .venueName
,而实际名称位于 <a>
这个 div 里面的标签。 - 邮寄地址:地址位于
<div>
带有类的标签 .venueAddress
. - 类别:可以从中提取地点的类别
<span>
带有类的标签 .categoryName
. - 链接:地点详情的链接位于同一个
<a>
标签内 .venueName
格。
检查页面上是否有您想要提取的任何其他数据,例如评级或评论数量。
编写 Foursquare 搜索列表抓取工具
现在我们有了数据点的 CSS 选择器,我们可以开始编写爬虫了。我们将使用 Crawlbase Crawling API 处理 JavaScript 渲染和 AJAX 请求,利用其 ajax_wait
和 page_wait
参数。
这是代码:
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
| 在 爬行基地 进口 抓取API 在 bs4 进口 美丽汤 进口 JSON
爬行 API = 爬行 API({'令牌': 'YOUR_CRAWLBASE_TOKEN'})
DEF make_crawlbase_request(网址): 选项= { 'ajax_等待': '真的', '页面等待': '5000' }
响应=crawling_api.get(url,选项)
if 回复[“标题”]['pc_status'] == '200': html_内容=响应['身体']。解码('utf-8') 回报 html_内容 其他: 打印(f"无法获取页面。Crawlbase 状态代码: {回复[“标题”]['pc_status']}") 回报 没有
DEF scrape_foursquare_listings(html_内容): 汤 = BeautifulSoup(html_content, 'html.parser') 数据 = []
列表=汤.选择('ul.recommendationList > li.singleRecommendation')
清单 in 列表: 名称 = 列表.select_one('div.venueName a').text.strip() if 列表.选择一个('div.venueName a') 其他 '' 地址 = 列表.select_one(‘div.venueAddress’).text.strip() if 列表.选择一个(‘div.venueAddress’) 其他 '' 类别=列表.select_one(‘span.categoryName’).text.strip() if 列表.选择一个(‘span.categoryName’) 其他 '' 链接 = 列表.select_one('div.venueName a')['href'] if 列表.选择一个('div.venueName a') 其他 ''
数据.附加({ “名称”: 姓名, '地址': 地址, “类别”: 类别, '关联': f“https://foursquare.com{关联}" })
回报 data
|
在上面的代码中,我们使用 Crawlbase 向 Foursquare 搜索页面发出请求 Crawling API。 我们用 BeautifulSoup
解析 HTML 并使用 CSS 选择器提取数据点。然后我们将数据存储在字典列表中。
处理分页
Foursquare 搜索列表使用基于按钮的分页。为了处理分页,我们将使用 css_click_selector
Crawlbase 提供的参数 Crawling API. 这使我们能够模拟按钮单击来加载下一组结果。
我们将设定 css_click_selector
负责分页的按钮类或ID(通常是“查看更多结果”按钮)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| DEF make_crawlbase_request_with_pagination(网址): 选项= { 'ajax_等待': '真的', '页面等待': '5000', ‘css_click_selector’: ‘li.moreResults > 按钮’ }
响应=crawling_api.get(url,选项)
if 回复[“标题”]['pc_status'] == '200': html_内容=响应['身体']。解码('utf-8') 回报 html_内容 其他: 打印(f"无法获取页面。Crawlbase 状态代码: {回复[“标题”]['pc_status']}") 回报 没有
|
将数据存储在 JSON 文件中
一旦我们抓取了数据,我们就可以将其存储在 JSON 文件中以供日后使用。JSON 是一种用于存储和交换数据的流行格式。
1 2 3 4
| DEF 保存数据到json(数据,文件名='foursquare_data.json'): - open(文件名, 'w') as f: json.dump(数据,f,缩进=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 53 54 55 56 57 58
| 在 爬行基地 进口 抓取API 在 bs4 进口 美丽汤 进口 JSON
爬行 API = 爬行 API({'令牌': 'YOUR_CRAWLBASE_TOKEN'})
DEF make_crawlbase_request_with_pagination(网址): 选项= { 'ajax_等待': '真的', '页面等待': '5000', ‘css_click_selector’: ‘li.moreResults > 按钮’ }
响应=crawling_api.get(url,选项)
if 回复[“标题”]['pc_status'] == '200': html_内容=响应['身体']。解码('utf-8') 回报 html_内容 其他: 打印(f"无法获取页面。Crawlbase 状态代码: {回复[“标题”]['pc_status']}") 回报 没有
DEF scrape_foursquare_listings(html_内容): 汤 = BeautifulSoup(html_content, 'html.parser') 数据 = []
列表=汤.选择('ul.recommendationList > li.singleRecommendation')
清单 in 列表: 名称 = 列表.select_one('div.venueName a').text.strip() if 列表.选择一个('div.venueName a') 其他 '' 地址 = 列表.select_one(‘div.venueAddress’).text.strip() if 列表.选择一个(‘div.venueAddress’) 其他 '' 类别=列表.select_one(‘span.categoryName’).text.strip() if 列表.选择一个(‘span.categoryName’) 其他 '' 链接 = 列表.select_one('div.venueName a')['href'] if 列表.选择一个('div.venueName a') 其他 ''
数据.附加({ “名称”: 姓名, '地址': 地址, “类别”: 类别, '关联': f“https://foursquare.com{关联}" })
回报 data
DEF 保存数据到json(数据,文件名='foursquare_data.json'): - open(文件名, 'w') as f: json.dump(数据,f,缩进=4) 打印(f”数据保存至 {文档名称}")
if __名字__ == “__主要的__”: 网址= “https://foursquare.com/explore?near=New%20York&q=Food” html_content = make_crawlbase_request_with_pagination(url)
if html_内容: 数据=scrape_foursquare_listings(html_content) 保存数据到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
| [ { “名称”: “泰式餐厅”, “地址”: “纽约州莫特街 186 号(肯梅尔)”, “类别”: “泰国”, “关联”: "https://foursquare.com/v/thai-diner/5e46e2ec5791a10008c55728" }, { “名称”: “鱼脸颊”, “地址”: “纽约邦德街 55 号(拉斐特街与包厘街之间)”, “类别”: “泰国”, “关联”: "https://foursquare.com/v/fish-cheeks/57c169e3498e784947e307aa" }, { “名称”: “拉库”, “地址”: “纽约麦克杜格尔街 48 号(金和麦克杜格尔)”, “类别”: “乌冬面”, “关联”: "https://foursquare.com/v/raku/5aea422a033693002bf0c1cb" }, { “名称”: “Los Tacos No. 1”, “地址”: “纽约西 229 街 43 号(第 7 大道和第 8 大道之间)”, “类别”: “塔可”, “关联”: "https://foursquare.com/v/los-tacos-no-1/59580ce6db1d8148fee3d383" }, { “名称”: “Mah-Ze-Dahr 面包店”, “地址”: “纽约格林威治大街 (查尔斯街) 28 号”, “类别”: “面包店”, “关联”: "https://foursquare.com/v/mahzedahr-bakery/568c0ce238fafac5f5ffe631" }, .... 更多的 ]
|
抓取 Foursquare 场地详细信息
在本节中,我们将学习如何抓取单个 Foursquare 场所的详细信息。抓取列表后,我们可以深入挖掘并从每个场所的页面收集特定数据。
检查 HTML 中的选择器
在编写爬虫程序之前,我们首先需要检查 Foursquare 场地详情页面,找出哪些 HTML 元素包含我们想要的数据。您应该执行以下操作:
- 访问场地页面:在浏览器中打开 Foursquare 场地页面。
- 使用开发者工具:右键单击页面并选择“检查”(或按
Ctrl + Shift + I
)打开开发者工具。

- 识别 CSS 选择器:查找包含所需信息的 HTML 元素。以下是一些常见详细信息及其可能的选择器:
- 会场名称:发现于
<h1>
带有类的标签 .venueName
. - 地址:在
<div>
带有类的标签 .venueAddress
. - 电话号码:发现于
<span>
带有属性的标签 itemprop="telephone"
. - 评分:发现于
<span>
带有属性的标签 itemprop="ratingValue"
. - 评论数:发现于
<div>
带有类的标签 .numRatings
.
编写 Foursquare 场地详细信息抓取工具
现在我们有了场地详情的 CSS 选择器,让我们来编写抓取工具。就像我们在上一节中所做的那样,我们将使用 Crawlbase 来处理 JavaScript 渲染和 Ajax 请求。
下面是使用 Crawlbase 和 BeautifulSoup 抓取场地详细信息的 Python 脚本示例:
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
| 在 爬行基地 进口 抓取API 在 bs4 进口 美丽汤 进口 JSON
爬行 API = 爬行 API({'令牌': 'YOUR_CRAWLBASE_TOKEN'})
DEF 获取场地详情(网址): 选项= { 'ajax_等待': '真的', '页面等待': '5000' }
响应=crawling_api.get(url,选项)
if 回复[“标题”]['pc_status'] == '200': html_内容=响应['身体']。解码('utf-8') 回报 html_内容 其他: 打印(f“获取场地详情时出错。状态: {回复[“标题”]['pc_status']}") 回报 没有
DEF scrape_venue_details(html_内容): 汤 = BeautifulSoup(html_content, 'html.parser')
名称 = 汤.select_one('h1.场地名称').text.strip() if 汤.select_one('h1.场地名称') 其他 '' 地址 = soup.select_one(‘div.venueAddress’).text.strip() if 汤.select_one(‘div.venueAddress’) 其他 '' 电话=汤.select_one('span[itemprop="电话"]').text.strip() if 汤.select_one('span[itemprop="电话"]') 其他 '' 评分=汤.select_one('span[itemprop="ratingValue"]').text.strip() if 汤.select_one('span[itemprop="ratingValue"]') 其他 '' ratings_count = soup.select_one(‘div.numRatings’).text.strip() if 汤.select_one(‘div.numRatings’) 其他 ''
回报 { “名称”: 姓名, '地址': 地址, '电话': 电话, '评分': 评分, ‘评级计数’:评分数量 }
|
我们使用 Crawlbase 的 get()
方法获取场地页面。 ajax_wait
和 page_wait
选项确保页面在我们开始抓取之前完全加载。我们使用 BeautifulSoup 读取 HTML 并查找场地的名称、地址、电话号码、评分和评论。如果 Crawlbase 无法获取页面,它将显示错误消息。
将数据存储在 JSON 文件中
抓取场地详细信息后,您需要存储数据以供日后使用。我们将提取的数据保存到 JSON 文件中。
这是保存数据的函数:
1 2 3 4
| DEF 保存场地数据(数据,文件名='foursquare_venue_details.json'): - open(文件名, 'w') as f: json.dump(数据,f,缩进=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 53 54 55
| 在 爬行基地 进口 抓取API 在 bs4 进口 美丽汤 进口 JSON
爬行 API = 爬行 API({'令牌': 'YOUR_CRAWLBASE_TOKEN'})
DEF 获取场地详情(网址): 选项= { 'ajax_等待': '真的', '页面等待': '5000' }
响应=crawling_api.get(url,选项)
if 回复[“标题”]['pc_status'] == '200': html_内容=响应['身体']。解码('utf-8') 回报 html_内容 其他: 打印(f“获取场地详情时出错。状态: {回复[“标题”]['pc_status']}") 回报 没有
DEF scrape_venue_details(html_内容): 汤 = BeautifulSoup(html_content, 'html.parser')
名称 = 汤.select_one('h1.场地名称').text.strip() if 汤.select_one('h1.场地名称') 其他 '' 地址 = soup.select_one(‘div.venueAddress’).text.strip() if 汤.select_one(‘div.venueAddress’) 其他 '' 电话=汤.select_one('span[itemprop="电话"]').text.strip() if 汤.select_one('span[itemprop="电话"]') 其他 '' 评分=汤.select_one('span[itemprop="ratingValue"]').text.strip() if 汤.select_one('span[itemprop="ratingValue"]') 其他 '' ratings_count = soup.select_one(‘div.numRatings’).text.strip() if 汤.select_one(‘div.numRatings’) 其他 ''
回报 { “名称”: 姓名, '地址': 地址, '电话': 电话, '评分': 评分, ‘评级计数’:评分数量 }
DEF 保存场地数据(数据,文件名='foursquare_venue_details.json'): - open(文件名, 'w') as f: json.dump(数据,f,缩进=4) 打印(f“数据已成功保存至 {文档名称}")
if __名字__ == “__主要的__”: 网址= 'https://foursquare.com/v/thai-diner/5e46e2ec5791a10008c55728' html_content = 获取场地详情(网址)
if html_内容: 场地数据 = scrape_venue_details(html内容) 保存场地数据(场地数据)
|
示例输出:
1 2 3 4 5 6 7
| { “名称”: “泰式餐厅”, “地址”: “186 Mott St (位于 Kenmare)纽约,NY 10012美国”, “电话”: “(646)559-4140”, “评分”: “9.5”, “评分数量”: “298” }
|
总结
在这篇博客中,我们学习了如何使用 爬虫库 Crawling API 和 BeautifulSoup。我们介绍了一些重要部分,例如检查 HTML 中的选择器、编写搜索列表和场地详细信息的抓取工具以及处理分页。抓取 Foursquare 数据非常有用,但您必须负责任地进行此操作并遵守网站的服务条款。
使用本博客中概述的方法,您可以从 Foursquare 收集各种场所信息,例如名称、地址、电话号码、评分和评论。这些数据可用于研究、分析或构建您的应用程序。
如果您想进行更多网页抓取,请查看我们关于抓取其他主要网站内容的指南。
📜 轻松抓取 Costco 产品数据
📜 如何抓取 Houzz 数据
📜 如何抓取 Tokopedia
📜 使用 Python 抓取 OpenSea 数据
📜 如何通过简单的步骤抓取 Gumtree 数据
如果你有任何疑问或想提供反馈,我们的 支持团队 可以帮助您进行网页抓取。祝您抓取愉快!
常见问题
问:从网站上抓取数据合法吗?
网页抓取的合法性取决于网站的服务条款。许多网站允许个人使用,但有些则不允许。在抓取数据之前,请务必检查网站的政策。请尊重这些规则,不要让网站的服务器超载。如有疑问,请联系网站所有者获取许可。
问:如何从 Foursquare 抓取场地详情?
要从 Foursquare 抓取场地详细信息,您需要使用 BeautifulSoup 等网页抓取工具或库以及 Crawlbase 等服务。首先,检查场地页面的 HTML,找到所需详细信息的 CSS 选择器,例如场地名称、地址和评分。然后,编写一个脚本,使用已识别的选择器获取页面内容并提取数据。
问:抓取 Foursquare 数据时如何处理分页?
Foursquare 有一个“查看更多结果”按钮,可以显示更多场地。处理此问题的解决方案之一是使用 Crawlbase Crawling API。 通过使用 css_click_selector
通过此 API 中的参数,您的抓取工具可以点击“查看更多结果”按钮来获取更多结果。这样,您就可以在抓取时捕获所有数据。