如何抓取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爬取的一种方法是使用Selenium和Playwright等框架构建自己的爬虫。这两个工具都是用于控制无头浏览器的流行工具,对于爬取Facebook来说是必要的。然而,这个平台对于爬虫并不友好,因此自己构建的工具更适合中级和高级用户。

更简单的解决方案是使用预先制作的爬虫。以Facebook-page-scraper为例,这是一个用于爬取Facebook页面前端的Python包。这种爬虫已经包含了提取和结构化相关数据的逻辑。但是,它们在没有额外工具的情况下无法工作,例如代理,这有助于掩盖网络爬虫的数字指纹。

最直接的选择是购买商业网络爬虫。根据您的技术知识和需求,有几个选项可供选择:

  1. 如果您不想涉及代码,可以选择无代码爬虫。像Parsehub、PhantomBuster或Octoparse这样的服务提供了爬虫,让您通过点击视觉元素来提取数据。对于小规模数据收集或不需要运行复杂设置时非常方便。
  2. 或者,您可以获取一个网络爬取API。它们类似于预先制作的网络爬虫,但维护更好,并且内置了所有必要的元素。因此,您只需要发送请求并存储输出。像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

代码修改

现在,让我们对爬虫文件进行一些更改。

为了避免cookie同意提示,您首先需要修改driver_utilities.py文件。否则,爬虫将继续滚动该提示,您将无法获得任何结果。

1)使用show命令在控制台中找到文件。它将返回文件保存的目录。

pip show facebook_page_scraper

2)现在,在driver_utilities.py中,在wait_for_element_to_appear定义的末尾添加以下代码。

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文件。这个更新将把来自不同爬取目标的信息分隔到不同的文件中。

将以下行移动到init()方法中。此外,将这些行的开头加上self.参数,以便可以实例化这些变量。

__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变量。

posts_count = 100

3)之后,指定浏览器。您可以选择使用Google Chrome或Firefox — 这是个人偏好问题。

browser = "firefox"

4)timeout变量将在一段空闲时间后结束爬取。在分配时,以秒为单位编写时间。600秒是标准值,但您可以根据需求进行调整。

timeout = 600

5)继续进行无头浏览器变量的设置。如果要查看爬虫的运行过程,请以布尔值false输入。否则,输入true并在后台运行代码。

headless = False

步骤3. 现在,让我们运行爬虫。如果您的代理提供商需要验证,请在代理变量行中输入您的用户名和密码,然后用冒号分隔。

for page in page_list:
 	proxy = f'username:[email protected]:{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 = 10001posts_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:[email protected]:{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

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *