我们使用联盟链接。它们让我们能够维持运营,而您无需承担任何费用。

2026 年如何抓取 Facebook 数据

这是如何使用 Python 抓取公开的 Facebook 数据的分步示例。

如何抓取 Facebook

企业收集 Facebook 数据是为了进行情绪和竞争对手分析、保护其在线声誉或寻找有影响力的人。然而,该平台对爬虫程序非常反感——从 IP 屏蔽到速率限制、数据收集 会变得繁琐 没有正确的工具和知识。

在本指南中,您将了解如何合法地抓取 Facebook 数据、哪些工具是获得高成功率的必要条件以及如何避免 IP 地址被封禁。此外,我们还将为您提供使用基于 Python 的抓取工具抓取 Facebook 页面的真实示例。

什么是 Facebook 抓取 – 定义

Facebook 抓取是一种自动从社交媒体平台收集数据的方法。人们通常使用预制的网页抓取工具或定制的抓取工具来抓取 Facebook 数据。然后对收集的数据进行解析(清理)并将其导出为易于分析的格式,例如 .json。  

通过抓取帖子、点赞或关注者等数据点,企业可以收集客户意见、分析市场趋势、监控在线品牌推广工作并保护其声誉。

抓取 Facebook 数据合法吗?

尽管社交媒体平台可能不喜欢网络抓取,但收集公开数据的行为是合法的。2022 年,第九巡回上诉法院裁定,抓取公开数据并不违反 计算机欺诈和滥用法案。然而,这并不能阻止 Facebook 的所有者 Meta 积极打击任何从其平台上窃取数据的人, 从诉讼来看 这项诉讼是在新裁决出台后不久针对搜索引擎抓取工具提起的。看来 Meta 将继续为保持其信息垄断地位而战。

那么,您可以抓取哪些 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 的分步示例

在此示例中,我们将使用基于 Python 的抓取工具 – Facebook-page-scraper 3.0.1。 它预先编写了大部分网页抓取逻辑,不限制您可以发出的请求数量,而且您无需注册或拥有 API 密钥。

开始抓取 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 页面抓取工具的修改

保存更新的代码,然后我们继续抓取。

如何抓取 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
				
			
代理服务器作为房屋

关于 Facebook 网页抓取的常见问题

Facebook 抓取是自动收集公开的 Facebook 数据的过程。

Adam Dubois 的图片
亚当·杜波依斯
代理极客和开发人员。