2026 年如何抓取 Facebook 数据
这是如何使用 Python 抓取公开的 Facebook 数据的分步示例。
企业收集 Facebook 数据是为了进行情绪和竞争对手分析、保护其在线声誉或寻找有影响力的人。然而,该平台对爬虫程序非常反感——从 IP 屏蔽到速率限制、数据收集 会变得繁琐 没有正确的工具和知识。
在本指南中,您将了解如何合法地抓取 Facebook 数据、哪些工具是获得高成功率的必要条件以及如何避免 IP 地址被封禁。此外,我们还将为您提供使用基于 Python 的抓取工具抓取 Facebook 页面的真实示例。
什么是 Facebook 抓取 – 定义
Facebook 抓取是一种自动从社交媒体平台收集数据的方法。人们通常使用预制的网页抓取工具或定制的抓取工具来抓取 Facebook 数据。然后对收集的数据进行解析(清理)并将其导出为易于分析的格式,例如 .json。
通过抓取帖子、点赞或关注者等数据点,企业可以收集客户意见、分析市场趋势、监控在线品牌推广工作并保护其声誉。
抓取 Facebook 数据合法吗?
那么,您可以抓取哪些 Facebook 数据?
首先,如果你想 抓取社交媒体数据,您需要确保它 1) 是公开的,并且 2) 不受版权法保护。以下是 Facebook 上主要的公开类别:
简介: 最新帖子、用户名、个人资料 URL、个人资料照片 URL、关注和追随者、喜欢和兴趣以及个人资料中包含的其他公开信息。
文章: 最新帖子、日期、地点、喜欢、浏览量、评论、文本和媒体 URL。
#标签: 帖子 URL、媒体 URL、帖子作者 ID。
Facebook 商业页面: URL、个人资料图片、姓名、喜欢、故事、关注者、联系信息、网站、类别、用户名、头像、类型、已验证、相关页面信息。
如果你要收集个人信息(这很有可能),则需要遵守更多规则,例如需要通知当事人并给予他们选择退出的权利。咨询律师以确保你的权利始终是一个好主意。
如何选择 Facebook 数据抓取工具
处理 Facebook 数据抓取的一种方法是 构建自己的抓取工具 使用像这样的框架 硒和剧作家. 两者都是控制 无头浏览器 这些都是抓取 Facebook 数据所必需的。但是,该平台对抓取工具不友好,因此对于中级到高级用户来说,自建工具是最好的选择。
一个更简单的解决方案是 使用预先制作的刮刀。 让我们以 Facebook-page-scraper 为例。这是一个用于抓取 Facebook 页面前端的 Python 包。此类抓取工具已经包含提取和构造相关数据的逻辑。但是,如果没有其他工具,它们将无法工作,例如 代理 这有助于掩盖网络爬虫的数字指纹。
最直接的选择是 购买商业网络爬虫。 根据您的技术知识和需求,有多种选项可供选择:
- 如果你不想干预代码,可以使用 无代码抓取工具。 Parsehub、PhantomBuster 或 Octoparse 等服务提供抓取工具,让您通过点击视觉元素来提取数据。它们非常适合小规模数据收集或您不需要运行复杂设置时使用。
- 或者,你可以得到 一个网络抓取 API。 它们类似于预制的网页抓取工具,但维护得更好,并且内置了所有必要的元素。因此,您需要做的就是发送请求并存储输出。像 Decodo (以前 Smartproxy), 要么 Bright Data 所有这些都提供了能够抓取 Facebook 数据的 API。
如何抓取 Facebook 帖子:使用 Python 的分步示例
开始抓取 Facebook 数据的必要工具
为了使抓取工具正常工作,您需要使用代理服务器和无头浏览器库。
Facebook 针对爬虫采取了各种措施,从限制请求到封禁 IP 地址。代理可以通过屏蔽您的 IP 地址和位置来帮助规避这种情况。如果您不知道在哪里可以找到优质 IP,我们列出了最好的 Facebook 代理 供应商。
我们需要无头浏览器有两个原因。首先,它将帮助我们加载动态元素。其次,由于 Facebook 使用反机器人保护,它将允许我们模仿真实的浏览器指纹。
管理期望
在进入代码之前,您需要了解一些事情。
Facebook 抓取工具仅限于公开数据。我们不鼓励您抓取登录后的数据,但有些人可能会发现这是一个缺点。
最近,Facebook 进行了一些更新,影响了我们将要使用的抓取工具。如果您想要抓取多个页面或避免出现 Cookie 同意提示,则必须对抓取工具文件进行一些调整。但别担心 - 我们会指导您完成每一步。
如果你想了解有关网页抓取的更多详细信息,请查看 最佳网页抓取实践 在我们的指南。
预赛
在我们开始之前,您需要有 Python 和 JSON 库。然后,您需要安装 Facebook-page-scraper。您可以通过在终端中输入 pip install 命令来执行此操作:
pip install facebook-page-scraper
守则的修改
现在,让我们对 scraper 文件做一些修改。
为了避免出现 Cookie 同意提示,您首先需要修改 驱动程序实用程序.py 文件。否则,抓取工具将继续滚动提示,您将不会获得任何结果。
1) 使用控制台中的 show 命令查找文件。它将返回保存文件的目录。
pip show facebook_page_scraper
2)现在, 驱动程序实用程序.py,将代码添加到 等待元素出现 定义。
allow_span = driver.find_element(
By.XPATH, '//div[contains(@aria-label, "Allow")]/../following-sibling::div')
allow_span.click()
整个函数如下所示:
@staticmethod
def __wait_for_element_to_appear(driver, layout):
"""expects driver's instance, wait for posts to show.
post's CSS class name is userContentWrapper
"""
try:
if layout == "old":
# wait for page to load so posts are visible
body = driver.find_element(By.CSS_SELECTOR, "body")
for _ in range(randint(3, 5)):
body.send_keys(Keys.PAGE_DOWN)
WebDriverWait(driver, 30).until(EC.presence_of_element_located(
(By.CSS_SELECTOR, '.userContentWrapper')))
elif layout == "new":
WebDriverWait(driver, 30).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "[aria-posinset]")))
except WebDriverException:
# if it was not found,it means either page is not loading or it does not exists
print("No posts were found!")
Utilities.__close_driver(driver)
# exit the program, because if posts does not exists,we cannot go further
sys.exit(1)
except Exception as ex:
print("error at wait_for_element_to_appear method : {}".format(ex))
Utilities.__close_driver(driver)
allow_span = driver.find_element(
By.XPATH, '//div[contains(@aria-label, "Allow")]/../following-sibling::div')
allow_span.click()
3)如果你计划同时抓取多个页面,则必须修改 scraper.py 文档。此更新将把来自不同抓取目标的信息分离到单独的文件中。
将以下行移动到 在里面() 方法。此外,添加 自我。 参数到这些行的开头,这样这些变量就可以被实例化。
__data_dict = {}
and __extracted_post = set()
更改后文件应如下所示:
保存更新的代码,然后我们继续抓取。
如何抓取 Facebook 帖子
这是一个真实的例子,使用 住宅代理 和 Selenium。我们使用住宅地址是因为 Facebook 足够智能,可以识别和阻止数据中心 IP。
步骤 1。 在您选择的目录中创建一个新的文本文件并将其重命名为 facebook1.py。然后,打开文档,开始编写主要代码。
1)进口刮刀。
from facebook_page_scraper import Facebook_scraper
2) 然后,让我们选择要抓取的页面。我选择了几个公开的个人资料,并将它们输入为字符串值。或者,您可以一次抓取一个页面。
page_list = ['KimKardashian','arnold','joebiden','eminem',''SmoshGames','Metallica','cnn']
步骤 2。 现在,让我们设置代理和无头浏览器。
1) 为代理端口创建一个带有数值的变量。您可以使用任何轮换住宅或移动代理提供商,但今天我们将坚持使用 Smartproxy“ IP池。
proxy_port = 10001
2)接下来,为帖子计数变量写入您想要抓取的帖子数量。
posts_count = 100
3) 之后,指定浏览器。您可以使用 Google Chrome 或 Firefox – 这取决于您的偏好。
browser = "firefox"
4) 超时变量将在一定时间不活动后结束抓取。分配时,以秒为单位写入时间。600 秒是标准,但您可以根据需要进行调整。
timeout = 600
5)转到无头浏览器变量。输入 false 如果你想查看爬虫的运行情况,请将其设置为布尔值。否则,请写入 true 并在后台运行代码。
headless = False
步骤 3。 现在,让我们运行我们的抓取工具。如果您的代理提供商需要身份验证,请将您的密码和用户名放在代理变量行中。然后用冒号将它们分开。
for page in page_list:
proxy = f'username:password@us.smartproxy.com:{proxy_port}'
之后,初始化抓取工具。这里,页面标题、帖子数、浏览器类型和其他变量作为函数参数传递。
scraper = Facebook_scraper(page, posts_count, browser, proxy=proxy, timeout=timeout, headless=headless)
步骤 4。 输出可以以两种方式呈现。因此,选择一种并输入代码。
1) 第一个是抓取结果并将其打印到控制台窗口。为此,您需要 JSON。写下以下几行。
json_data = scraper.scrap_to_json()
print(json_data)
如果您希望将其导出为 CSV 文件,请创建一个名为 facebook_scrape_results 或任何适合您的方法,然后将其保留为目录变量。
directory = "C:\\facebook_scrape_results"
2) 然后,通过以下两行,每个 Facebook 页面的数据将存储在具有相应标题的文件中。
filename = page
scraper.scrap_to_csv(filename, directory)
scraper.scrap_to_csv(filename, directory)
最后,对于任何一种方法,添加代理轮换代码,该代码将在每次会话后轮换您的 IP。这样,您就不会受到 IP 禁令的威胁。在我们的例子中,这意味着迭代端口号;其他提供商可能会要求您更改会话 ID。
proxy_port += 1
保存代码并在终端中运行。我选择了第一种输出呈现方法。因此,结果将在几秒钟内显示在屏幕上。
以下是完整脚本:
from facebook_page_scraper import Facebook_scraper
page_list = ['KimKardashian','arnold','joebiden','eminem','smosh','SmoshGames','ibis','Metallica','cnn']
proxy_port = 10001
posts_count = 100
browser = "firefox"
timeout = 600 #600 seconds
headless = False
# Dir for output if we scrape directly to CSV
# Make sure to create this folder
directory = "C:\\facebook_scrape_results"
for page in page_list:
#our proxy for this scrape
proxy = f'username:password@us.smartproxy.com:{proxy_port}'
#initializing a scraper
scraper = Facebook_scraper(page, posts_count, browser, proxy=proxy, timeout=timeout, headless=headless)
#Running the scraper in two ways:
# 1
# Scraping and printing out the result into the console window:
# json_data = scraper.scrap_to_json()
# print(json_data)
# 2
# Scraping and writing into output CSV file:
filename = page
scraper.scrap_to_csv(filename, directory)
# Rotating our proxy to the next port so we could get a new IP and avoid blocks
proxy_port += 1