大多数 API 都可以抓取互联网上无需登录的公共页面。但是,如果您需要访问需要登录才能访问的数据,该怎么办?有什么选择吗?

在本文中,我们将向您展示一种独特的方法,从已登录的会话中提取会话 Cookie,并将其传递给 API,以便 API 登录网站并提取您需要的数据。这个过程听起来可能很复杂,但不妨尝试一下,看看效果如何。 Crawlbase 可以为您简化整个流程 - 看到它在行动.

目录

  1. 网页抓取身份验证的复杂性

  2. 身份验证简介

  3. 什么是会话 Cookie?

  4. 如何从浏览器提取 Cookies

  5. 使用 Python Requests 库进行身份验证抓取

  6. 使用以下方式获取登录信息 Crawlbase

  7. 爬取登录保护网站的最佳实践

  8. 常见问题

网页抓取身份验证的复杂性

网站使用身份验证系统来保护用户特定的内容。与公共页面不同,您不能仅仅发送 GET 请求就期望提取有意义的数据。这些私有或受保护的页面采用各种身份验证方法,包括登录凭据、会话 Cookie、令牌、登录信息,以及偶尔 多因素认证.

此外,如今大多数网站都认真对待拦截机器人和爬虫程序的问题。例如 检测你是不是真人限制你的请求速度、直接封禁你的 IP 地址,或者不断更改安全令牌。许多网站还会监控并屏蔽可疑的 IP 地址,以防止未经授权的访问。

如果您需要抓取需要登录才能访问的内容,那么您的目标网站基本上有两个主要选项:

• 构建一个可以自行登录以抓取网站的脚本 - 教它填写登录表单并在抓取所需内容时保持登录状态。

• 在常规浏览器中自行完成登录部分,然后将这些会话 cookie 复制到您的抓取脚本中,以便网站认为是您。

Crawlbase 允许您将会话 Cookie 传递给 API,使其能够在提取内容之前登录网站。当您需要抓取需要身份验证的网站(例如亚马逊等平台)时,此功能非常有用。某些页面(例如产品评论)现在要求用户登录才能查看。此功能对于访问 Facebook 等社交媒体网站上的内容(包括私人群组或不公开的用户个人资料)也很有用。

身份验证简介

在网页抓取方面,身份验证通常是您遇到的第一个主要障碍。许多网站使用登录表单来保护其宝贵的数据,要求用户输入登录凭据才能访问某些页面。如果您想从这些受保护的区域抓取数据,则需要将登录过程自动化,作为抓取工作流程的一部分。

典型的方法是像普通用户一样向登录页面发送 HTTP 请求。使用 Python 的请求库,您可以以编程方式填写登录表单,并通过 POST 请求提交。这意味着您需要检查登录页面,以确定所需的确切字段,例如用户名、密码,有时还包括隐藏字段,以便将它们包含在登录凭据负载中。

为此,请在浏览器中打开登录页面,并使用浏览器的开发者工具检查 HTML 代码。查找登录表单,记下输入字段的名称,并找到已提交表单的 URL。这些信息对于正确编写 POST 请求至关重要。收集到这些详细信息后,您可以使用请求库发送登录数据并建立经过身份验证的会话,从而可以从原本需要登录才能访问的页面中抓取数据。

通过了解登录表单的工作原理以及如何使用 HTTP 请求与它们交互,您将能够解决大多数网站为保护其内容而设置的身份验证墙。

什么是会话 Cookie?

会话cookie 是一种在您登录网站时存储在浏览器中的临时 Cookie。它们是一些小数据,用于识别用户是否已登录并允许访问受保护的内容。这些数据通常会在您关闭浏览器时失效,有时也会在特定时间段后自动失效。

如果没有这些 Cookie,网站将无法识别用户,也无法记住他们是否已经通过身份验证。您将被要求反复登录,这不太实际。

会话 Cookie 对于数据抓取至关重要。如果您尝试抓取需要登录的页面,但未包含会话 Cookie,网站可能会阻止您的请求或将您跳转到登录页面。但是,如果您包含正确的 Cookie,网站会将您的抓取工具视为已登录用户,并授予其对受保护内容的访问权限,从而允许您发出经过身份验证的请求并授予其对受保护内容的访问权限。您还可以管理已保存的 Cookie 以备将来使用,这样就无需每次抓取时都登录。

简而言之,会话 Cookie 是解锁许多网站上私人或用户特定数据的关键。一旦您学会如何提取和重复使用它们,就能访问通常隐藏在登录信息之后的数据。

接下来,让我们看看如何使用浏览器获取会话 cookie。

在登录后访问数据时,您可以使用会话对象来维护身份验证。通过在多个请求中重复使用同一个会话对象,您可以确保登录状态得到保留,并且会话 Cookie 使您无需重新进行身份验证即可发出后续请求。身份验证后,您可以从受保护的页面检索数据,并从其他方式无法访问的区域提取数据。

处理会话 cookie 时始终遵循负责任的抓取做法,以符合网站条款和法律要求。

如何从浏览器提取 Cookies

提取浏览器 Cookie 的方法有很多,从简单到高难度不等。从使用浏览器插件到使用 Selenium 等自动化工具,应有尽有。在本例中,我们将提供一种最基本的会话 Cookie 提取方法,稍后我们将使用它从需要登录的页面抓取数据。

请注意,此方法可能存在风险,因为它需要您使用自己的账户登录才能从浏览器中提取 Cookie。我们建议您使用虚拟账户,并理解本指南仅供参考。

  • 步骤1: 首先启动浏览器,例如 Google Chrome、Mozilla Firefox 或 Microsoft Edge。

  • 步骤2: 前往 Facebook,输入你的登录信息,然后像平常一样登录。登录成功后,你就可以查看你的新闻动态或个人资料了。

  • 步骤3: 右键点击页面上的空白处,然后选择“检查”或“检查元素”。这将打开浏览器的开发者工具,也就是 开发工具.

  • 步骤4: 在 DevTools 窗口的顶部,你会看到几个标签,分别标有“元素”、“控制台”、“网络”等等。点击 网络.

  • 步骤5: 首次打开“网络”选项卡时,它可能是空白的。按 F5(或点击“重新加载”按钮)刷新页面。页面重新加载后,您会在“网络”面板中看到网络请求列表。

  • 步骤6: 查找列出的第一个网络请求。点击此条目可查看该请求的详细信息。

显示 Chrome 开发者工具界面中的网络面板的图像。
  • 步骤7: 选择网络请求后,查找 Cookies or 子选项卡,通常位于 DevTools 的右侧。您可能会发现“Cookies”是一个单独的选项卡,或者您可能需要滚动浏览响应标头才能在“请求标头”下找到标有“Cookie”的部分。
显示 Chrome 开发者工具中的 Cookies 部分的图像。
  • 步骤8: 现在您应该会看到与您的会话关联的 Cookie 名称和值的列表。复制相关的 Cookie 值。找到 c_userxs cookie,Facebook 经常使用它来管理会话。

  • 步骤9: 打开文本编辑器(例如记事本)。粘贴复制的 Cookie 值,并清晰地标记它们(例如, c_user=[value], xs=[value])。这些是您保存的 Cookie,供将来使用。

注意:这些 Cookie 会允许你的抓取工具访问私人页面,但也可能允许其他人访问你的 Facebook 帐户。请确保安全保存此文件,不要将其共享或上传到任何公共位置。

您可以在 Python 脚本中使用这些保存的 cookie 来自动登录和抓取,从而允许您维护会话身份验证并避免重复登录。

使用 Python Requests 库进行身份验证抓取

让我们将提取的 cookie 付诸实践。首先,确保你的 Python 环境已完全设置。安装最新的 Python 版本,使用您喜欢的任何 IDE,并安装 Python 请求模块。一旦您的环境设置完毕,我们就可以继续练习了。

假设我们想抓取这个 Facebook 标签音乐页面,我们的目标是从受保护的网页中抓取数据,如果您尝试使用 Chrome 隐身模式打开此网页(不登录您的 Facebook 帐户),您将看到登录页面:

显示 Facebook 登录页面的图像。

我们可以尝试 手动抓取此页面 单独使用 Python 看看会发生什么。创建一个文件并命名它 scraping_with_crawlbase.py,然后复制并粘贴下面的代码。

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
进口 要求
请求异常 进口 请求异常

目标网址 = “https://www.facebook.com/hashtag/music”
标头= {
'接受': '文本/html,应用程序/xhtml+xml,应用程序/xml;q=0.9,图像/avif,图像/webp,图像/apng,*/*;q=0.8,应用程序/签名交换;v=b3;q=0.7',
“接受语言”: 'en-US,en',
'用户代理': “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,如 Gecko) Chrome/137.0.0.0 Safari/537.36”,
‘sec-fetch-mode’: '导航',
'曲奇饼': ' '
}
输出文件名 = “输出.html”

尝试:
响应 = 请求.get(TARGET_URL,标头=HEADERS)
响应.raise_for_status()

html_content = 响应. 文本
- open(输出文件名, “w”, 编码=“utf-8”) as 文件:
文件.写入(响应.文本)

打印(f"\n页面已成功保存至'输出文件名'\n")

请求异常 as 错误:
打印(f"\n 无法获取页面: {错误}\n")

确保更换 <cookies-goes-here> 使用您之前从 Facebook 帐户中提取的实际 cookie,然后使用以下命令运行代码。

1
蟒蛇 scraping_with_crawlbase.py

运行脚本后,打开 output.html 文件。你会注意到内容看起来是空白或不完整的。如果你仔细检查,你会发现它大部分都是未执行的 JavaScript。

为什么?因为你要查找的数据是通过 JavaScript 动态加载的,而且 requests 本身无法像浏览器那样执行 JavaScript。

那么,我们该如何解决这个问题呢?我们将在下一节中讨论。

使用以下方式获取登录信息 Crawlbase

现在我们已经看到了使用 Python 的局限性 requests 单独使用库。让我们使用 Crawlbase 处理诸如 JavaScript 渲染和登录墙后工作等问题。具体操作如下:

  • 步骤1: 准备你的脚本。创建或更新你的 scraping_with_crawlbase.py 带有以下代码的文件:
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
进口 JSON
进口 要求
请求异常 进口 请求异常

API_TOKEN = “ “
目标网址 = “https://www.facebook.com/hashtag/music”
刮刀 = “facebook 标签”
饼干= “”“

“”“
国家= “我们”

API_ENDPOINT = “https://api.crawlbase.com/”

参数= {
“令牌”:API_TOKEN,
“网址”:目标网址,
“刮刀”:刮刀,
“饼干”:饼干,
“国家”: 国家
}

尝试:
响应 = 请求.get(API_ENDPOINT,params=params)
响应.raise_for_status()

json_string_content = 响应.文本
json_data = json.loads(json_string_content)
pretty_json = json.dumps(json_data,缩进=2)
打印(漂亮的json)

请求异常 as 错误:
打印(f"\n无法获取页面: {错误}\n")

确保 Cookie 格式正确。否则, Crawlbase 可能会拒绝它们。根据 Cookie 文档,正确的格式应如下所示:

1
cookie:键1=值1;键2=值2;键3=值3
  • 步骤4: 现在使用以下命令运行脚本:
1
蟒蛇 scraping_with_crawlbase.py

如果一切设置正确,您将在终端中看到一个干净的 JSON 输出。这就是成功抓取的 Facebook 标签页面的实际内容。

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
{
“原始状态”: 200,
“电脑状态”: 200,
“网址”: “https://www.facebook.com/hashtag/music”,
“领域复杂性”: “标准”,
“身体”: {
“井号”: "",
“帖子”: [
{
“用户名”: “戴夫·莫法特音乐”,
“文本”: “微笑会让你成功。你不可能事事成功,但你可以尝试!@eraserheads_official #nevada #music #withasmile #song”,
“网址”: "https://www.facebook.com/hashtag/music?__cft__[0]=AZWbgQE-_wYwW47AUbqqhzfqC6moiJrxFQs7glnpepq5ibId2fvbkZe1E3UoNwI-Ywj4gaQp3qbQjOMGmNVD1fu4Ofx-uPcDfWPJGhRCtKrHKV1G-rXqg2mxRSzd93AL281FwDSfjERvTMkdWK6bZI_cJC_CxDD63x_K5WycyUe1lnt5kBwyBOdIk4z2jfeFeRCZASbYvSLGQS9eQ4GQh-c2&__tn__=%2CO%2CP-R#?bee",
“约会时间”: "oSspoenrdt0iS27g8ie7lm4c2gt19779f1mpraaec87et108um8 b3,7 56g",
“喜欢数”: "",
“股票数量”: "",
“评论数”: "",
“链接”: [
{
“关联”: "https://www.facebook.com/hashtag/nevada?__eep__=6&__cft__[0]=AZWbgQE-_wYwW47AUbqqhzfqC6moiJrxFQs7glnpepq5ibId2fvbkZe1E3UoNwI-Ywj4gaQp3qbQjOMGmNVD1fu4Ofx-uPcDfWPJGhRCtKrHKV1G-rXqg2mxRSzd93AL281FwDSfjERvTMkdWK6bZI_cJC_CxDD63x_K5WycyUe1lnt5kBwyBOdIk4z2jfeFeRCZASbYvSLGQS9eQ4GQh-c2&__tn__=*NK-R",
“文本”: #内华达州
},
{
“关联”: "https://www.facebook.com/hashtag/music?__eep__=6&__cft__[0]=AZWbgQE-_wYwW47AUbqqhzfqC6moiJrxFQs7glnpepq5ibId2fvbkZe1E3UoNwI-Ywj4gaQp3qbQjOMGmNVD1fu4Ofx-uPcDfWPJGhRCtKrHKV1G-rXqg2mxRSzd93AL281FwDSfjERvTMkdWK6bZI_cJC_CxDD63x_K5WycyUe1lnt5kBwyBOdIk4z2jfeFeRCZASbYvSLGQS9eQ4GQh-c2&__tn__=*NK-R",
“文本”: “#音乐”
},
{
“关联”: "https://www.facebook.com/hashtag/withasmile?__eep__=6&__cft__[0]=AZWbgQE-_wYwW47AUbqqhzfqC6moiJrxFQs7glnpepq5ibId2fvbkZe1E3UoNwI-Ywj4gaQp3qbQjOMGmNVD1fu4Ofx-uPcDfWPJGhRCtKrHKV1G-rXqg2mxRSzd93AL281FwDSfjERvTMkdWK6bZI_cJC_CxDD63x_K5WycyUe1lnt5kBwyBOdIk4z2jfeFeRCZASbYvSLGQS9eQ4GQh-c2&__tn__=*NK-R",
“文本”: #微笑
},
{
“关联”: "https://www.facebook.com/hashtag/song?__eep__=6&__cft__[0]=AZWbgQE-_wYwW47AUbqqhzfqC6moiJrxFQs7glnpepq5ibId2fvbkZe1E3UoNwI-Ywj4gaQp3qbQjOMGmNVD1fu4Ofx-uPcDfWPJGhRCtKrHKV1G-rXqg2mxRSzd93AL281FwDSfjERvTMkdWK6bZI_cJC_CxDD63x_K5WycyUe1lnt5kBwyBOdIk4z2jfeFeRCZASbYvSLGQS9eQ4GQh-c2&__tn__=*NK-R",
“文本”: “#歌曲”
}
]
}
// 注意:为了简洁起见,省略了一些结果。
]
}
}
  • 奖励步骤:Crawlbase Facebook数据抓取工具 不仅限于抓取标签页面。它还支持其他类型的 Facebook 内容。因此,如果您的目标页面属于以下类别之一,那么您很幸运:

    • facebook-group
    • facebook-page
    • facebook-profile
    • facebook-event

您所要做的就是更新脚本中的两行以匹配您想要抓取的页面类型:

1
2
目标网址 = “https://www.facebook.com/hashtag/music”
刮刀 = “facebook 标签”

例如,如果您想抓取私人 Facebook 群组,请将其更改为类似以下内容:

1
2
目标网址 = “https://www.facebook.com/groups/examplegroup”
刮刀 = “facebook 群组”

只需替换正确的 URL 和相应的 刮板机 名称和 Crawlbase 将照顾其余的。

爬取登录保护网站的最佳实践

在抓取需要登录的页面时,请记住,您正在处理敏感帐户、会话 Cookie 和更严格的安全规则。以下是一些需要注意的重要事项。

了解网站的服务条款

在考虑从任何网站(尤其是需要登录才能访问的网站)提取数据之前,请务必务必了解其服务条款。许多网站都对机器人程序和数据抓取设置了严格的限制,忽视这些限制可能会让您陷入困境。因此,请谨慎抓取数据。

了解要使用哪些 Cookie

要访问受登录保护的页面,您需要在请求中发送正确的会话 Cookie。对于 Facebook,我们的测试表明,您只需要以下两种 Cookie:

  • c_user=[value]
  • xs=[value]

这些足以验证您的会话并加载实际内容。

但是,如果您在其他网站上进行测试,并且不确定需要哪些 cookie,您可以简单地将您登录会话中的所有 cookie 传递给 Crawlbase API。您可以使用以下测试 URL 来测试正在发送哪些 Cookie: https://postman-echo.com/cookies

这是一个例子 卷曲请求 在 Postman 中将 cookie 发送到 Crawlbase API 并从 Postman Echo 测试服务器获取响应:

显示 Postman curl 请求的图像。

这是一种验证您的 cookie 格式是否正确且是否被正确转发的便捷方法。

处理过期的 Cookie

登录 Cookie 并非永久性的。随着时间的推移,它们可能会因帐户活动、注销或会话超时而过期或失效。

如果你发现你的爬虫程序意外地开始抓取登录页面而不是预期的数据。在这种情况下,这强烈表明你的 Cookie 已过期,需要刷新。

以下是你可以做的事情:

  1. 手动重新验证 - 在浏览器中重新登录你的帐户,通过 DevTools 获取新的 Cookie,并在脚本中更新它们。确保用新的 Cookie 替换你保存的 Cookie,以维护会话身份验证。

  2. 使用浏览器扩展 - 这个 Cookie编辑器 该工具可让您轻松地直接从浏览器查看和复制您的活动 cookie。

自动重复使用 Cookie

如果您在短时间内发出多个请求,并希望 cookie 在它们之间保留,则可以使用 Crawlbase“ Cookies 会话参数只需分配任意值(最多 32 个字符);这将把会话 Cookie 从一个请求链接到下一个请求,从而允许您维护相同的会话并使用会话对象持久化身份验证。这确保后续请求可以使用相同的身份验证,而无需再次登录。

这在使用多个步骤或登录页面进行抓取时特别方便,因为请求之间的一致性至关重要,因为维护相同的会话可以实现跨不同页面的经过身份验证的请求。

所以, 报名参加 Crawlbase 现在就可以抓取受登录保护的页面了。只需一个平台,您就可以轻松处理 JavaScript 渲染的内容、管理 Cookie,并在多个请求之间维护会话。

常见问题

问题1: Crawlbase 存储我的会话 cookie?

答:不会,通过 cookies 参数发送的数据仅用于您发送的特定请求。 Crawlbase 默认情况下,我们不会存储任何数据。但是,如果使用以下参数,则可以存储您传递的数据: storecookies_session 被使用。

Q2:使用会话 cookie 进行抓取是否存在账户被封禁的风险?

答:是的,这是可能的,尤其是当网站从您的会话中检测到非人类行为时。 Crawlbase 无法保证您账户的安全。如果您确实需要在登录状态下抓取数据,我们始终建议您使用虚拟账户。

Q3:如何处理CSRF令牌保护

A. 处理 CSRF(跨站请求伪造) 在你的网页抓取项目中,为了实现令牌保护,你首先需要从登录页面提取令牌。这通常需要向登录 URL 发送 GET 请求,然后解析返回的 HTML 代码以查找 CSRF 令牌,该令牌通常存储在表单中隐藏的输入字段中。 美丽汤 库是解析 HTML 和提取这些标记的流行工具。

找到 CSRF 令牌后,在向登录 URL 发送 POST 请求时,请将其包含在登录凭据负载中。某些网站可能使用多个 CSRF 令牌或频繁更改其名称,因此仔细检查登录页面并确保获取所有必需的令牌非常重要。