支持我(patreon)[https://www.patreon.com/tonywang_dev]写更多这样的教程!
简介
在本教程中,我们将引导您完成一个可以有效刮擦数百万个顶级Tiktok配置文件的分布式爬网的过程。在我们启动本教程之前,至关重要的是要坚实地了解网络刮擦, Golang编程语言, docker和kubernetes(K8S)(K8S)至关重要。 )。此外,熟悉Golang Colly等基本图书馆,以进行有效的网络刮擦和Golang Gin来构建强大的API,这将大大增强您的学习体验。通过遵循本教程,您将深入了解构建可扩展和分布式系统以从Tiktok提取个人资料信息。
对要刮擦的网站有更深入的了解。
在进行编写代码之前,必须彻底分析和了解Tiktok网站的结构。为了促进此过程,我们建议使用方便的快速JavaScript切换器 - Chrome插件,可用here。这个宝贵的工具使您可以使用单个鼠标单击禁用和重新启用JavaScript。通过这样做,我们旨在优化我们的刮擦工作流程,提高效率,并通过最大程度地减少对JavaScript渲染的依赖。
使用插件禁用JavaScript后,我们将把注意力集中在Tiktok的个人资料页面上 - 我们旨在刮擦的特定页面。彻底分析此页面将使我们能够对其基本结构,关键要素和相关数据点有全面的了解。通过检查HTML结构,识别关键标签和属性以及检查页面加载期间触发的网络请求,我们可以揭示我们寻求提取的基本信息。
此外,通过仔细检查Tiktok剖面页面的结构和行为,而不会受到JavaScript的干扰,我们可以确保刮板的效率和有效性。绕过JavaScript代码的渲染使我们能够直接定位必要的HTML元素并迅速准确地检索所需的数据。
想象一下启用JavaScript的Tiktok配置文件,例如https://www.tiktok.com/@linisflorez09'。 JavaScript文件,图像和视频大约需要5秒钟。数据软件包将积聚十多种terabytes。,这甚至不考虑无头铬实例消耗的计算资源。这种主动的方法不仅简化了刮擦过程,而且还可以帮助减轻不必要的费用,最终节省不必要的费用您,您的老板或您的客户大量的钱。
在处理如此大规模的数据刮擦操作时,要确认手头的巨大任务至关重要。通过将时间和精力用于分析预先分析网页,我们可以发现提取所需数据的创新方法,同时最小化请求数量,减少数据传输大小并优化资源利用率。这种战略方法可确保我们的刮擦过程不仅有效,而且具有成本效益。
实施用于刮擦Tiktok配置文件的代码
在刮擦Tiktok的个人资料页面时,Golang内置 net/http 软件包提供了可靠的解决方案,用于制作HTTP请求。如果您不需要更直接的方法而无需使用回调功能,例如 onerror 和 onResponse golang colly提供的, net/http 是一个合适的选择。
在下面,您会找到一个代码片段,以指导您构建tiktok配置文件刮板。但是,有意省略了代码的某些部分以防止潜在的滥用,例如向Tiktok平台发送过多的请求。 至关重要的是遵守道德刮擦实践并尊重平台的服务条款。
使用Golang中的CSS选择器从HTML页面中提取信息,可以使用各种教程和资源来证明使用Goquery之类的库。探索这些资源将为您提供有关从HTML页面提取特定数据点的全面指导。
请注意,提供的代码段是供参考。确保您根据自己的要求对其进行修改和增强,并遵守负责任的数据刮擦实践。
发现流行视频和配置文件的入口点
到目前为止,我们已经完成了Tiktok配置文件刮板。但是,还有更多探索。我们如何找到数百万的顶级资料来刮擦?那是我接下来讨论的。
如果您访问https://www.tiktok.com/的tiktok主页,您会在左上方注意四个部分: for you , surst , explore 和 live 。为您单击 和探索部分每次都会产生随机的流行视频。因此,这两个部分是我们发现大量病毒视频的切入点。让我们单独分析它们:
探索页面
我们导航到探索页面后,建议在进行任何进一步操作之前清理DevTools的网络部分,以便更好地清晰。
要确保请求的准确过滤,请记住选择 fetch/xhr 选项。此选择将排除JavaScript从前端未提出的任何请求。设置了所有设置后,请滚动向下浏览 explore 页面。这样,Tiktok将继续根据您的国家和行为等因素推荐病毒视频。同时密切关注网络面板。您的目标是找到包含关键字的特定请求 - 在所提出的众多请求中。
最初,可能无法立即清楚要关注哪种确切请求。花点时间,仔细检查每个请求。我们正在寻找返回基本信息的请求,例如作者详细信息,视频内容,视图计数和其他相关数据。尽管检查过程可能需要一些耐心,但绝对值得付出努力。
继续该过程,向下滚动“探索页面”,以探索针对您所在国家,行为和其他因素量身定制的更多病毒视频。当您更深入研究时,在提出的众多请求中,您最终会遇到一个包含关键字 explore 的特定请求。这个特定的请求是我们正在搜索提取所需数据的请求。要继续,请右键单击此请求,然后选择“ curl ”选项复制,如随附的屏幕截图所示。通过选择此选项,您可以以卷曲命令的形式捕获请求详细信息,该命令将作为进一步分析和集成到刮擦工作流程的宝贵资源。
使用先前确定的请求,我们可以将其导入到Postman中以模拟相同的请求。单击“发送”按钮后,我们应该收到类似的响应。这表明该请求不需要烦人的 csrf 令牌进行加密,并且可以多次发送以获得不同的结果。
要进一步探讨该请求,我们将在Postman中进行检查。在参数和标题面板中,您可以选择取消选中各种框,然后单击 send 按钮。通过这样做,您可以验证是否成功返回响应而不包括特定参数。如果确实返回响应,则意味着可以在进一步的开发和请求中省略相应的参数。此步骤允许我们确定需要哪些参数,并且可以排除哪些参数以进行更有效的刮擦。
潜入代码实施之前,我们需要获得一项重要信息来获取类别ID。在探索页面上,您会发现顶部显示的各种类别,包括舞蹈和音乐, sports 和娱乐 。这些类别在针对特定类型的内容进行刮擦方面起着至关重要的作用。
要进行,我们将遵循类似的方法,如前所述。首先清理网络会话以提高清晰度并确保重点分析。然后,系统地单击每个类别按钮,一一单击,并观察与每个请求关联的类别类别参数的值。通过检查类别TypeType 值,我们可以识别每个类别的相应ID。
此步骤至关重要,因为它使我们能够将刮擦过程定制为特定类别的兴趣类别。通过检索相关类别ID,我们可以精确地针对所需的内容并提取必要的数据。因此,请花点时间探索和记录类别ID,因为它将大大提高刮擦实施的有效性。
最后,在进行必要的分析之后,我们将编译一个综合地图,将每个类别类型与其唯一ID相关联:
var categoryTypeMap = map[string]string{
"1": "comoedy & drama",
"2": "dance & music",
"3": "relationship",
"4": "pet & nature",
"5": "lifestyle",
"6": "society",
"7": "fashion",
"8": "enterainment",
"10": "informative",
"11": "sport",
"12": "auto",
}
在这一点上,我们几乎已经完成了探索页面的分析,我们准备开始代码实现阶段。为了简化流程并节省时间,有几种在线服务可以帮助我们将JSON数据转换为GO结构格式。我强烈推荐的一项服务是https://mholt.github.io/json-to-go/.
这种方便的工具使我们能够粘贴从探索页面获得的JSON响应,并自动生成相应的GO结构表示。通过利用此服务,我们可以轻松地将检索到的JSON数据转换为结构化的GO对象,这将在我们的代码中极大地促进数据操纵和提取。
我设定的标准确定tiktok上流行的概况是基于两个因素:喜欢其内容的数量及其追随者的数量。具体来说,如果它们具有至少250k喜欢的内容或至少累积了至少10k关注者,我认为个人资料很受欢迎。这些阈值有助于确定在平台上引起了广泛关注和参与度的概况。
我旨在从这些受欢迎的配置文件中提取的关键信息包括其唯一标识符(ID),该标识符(ID)是输入变量刮擦配置文件详细信息及其追随者数量,并为受众的影响和影响提供了见解。此外,我有兴趣捕获其视频的Digg count,这代表了用户与他们的内容进行交互并欣赏其内容的次数。这些信息提供了有价值的指标来评估Tiktok概况的受欢迎程度和影响。
值得注意的是,尽管上述信息对于我的特定项目至关重要,但您可以灵活地自定义和保留与您自己承诺的要求和目标保持一致的任何其他数据。这使您可以量身定制刮擦过程,以满足您的独特需求并提取最相关的信息以进行分析或应用。
对于 geturl 函数中的参数,您可以灵活地根据我们之前进行的分析删除或自定义任何特定参数。这使您可以微调请求并从 explore 响应中检索更准确的结果。在此演示中,我选择保留所有参数,除了 categoryType 之外,我已将其作为变量保留。这种方法将使我们能够从所有类别中刮擦数据,从而提供我们打算提取的Tiktok配置文件的全面视图。
构建API服务以监视刮板统计
到目前为止,我们已经完成了大多数Tiktok刮刀。当我们利用Redis作为存储任务的消息队列时,监视关键统计信息以确保刮板的平稳功能至关重要。我们需要跟踪指标,例如刮擦每个类别的次数,成功和失败的计数以及作业队列中的其余任务。为了实现这一目标,有必要构建一项服务,该服务随时提供API端点,以查询统计信息。此外,为了保护敏感的统计数据,建议保护端点,实施适当的身份验证和授权措施。这将确保只有授权的个人才能访问刮板的监视API并保持收集数据的机密性。
在这里,我们将完成代码的最后一部分,这是主要函数。为了简化部署过程,我们将将所有Golang代码编译到一个二进制文件中,然后将其包装到Docker映像中。但是,出现一个问题:我们如何部署不同的服务,例如配置文件刮板,探索刮板和API服务,具有不同数量的副本?
为了应对这一挑战,我们将在运行 tiktok-crawler binary时使用不同参数的主函数。通过修改workerMap
,我们可以添加尽可能多的不同类型的工人,因为我们需要扩展功能。例如,对于个人资料刮刀,我们可能需要20名工人和3个复制品,而对于探索刮板,我们可能需要40名工人和4个副本。主功能的灵活性使我们能够为每个刮板配置所需的工人数量。默认情况下,我们将每个刮刀的工人数量设置为20。
构建Docker图像并将其部署到Kubernetes群集
这是使我们能够构建二进制文件并将其包装到Docker映像中的Dockerfile,然后将其部署到Kubernetes(K8S)群集中。
在将代码部署到kubernetes(K8S)群集中之前,建议使用Docker Compose在本地测试代码和Docker映像的功能。 Docker组成使我们能够定义和管理多范围的应用程序。在这种情况下,我们可以使用提供的 docker-compose.yml 文件。
通过运行命令 docker-compose - 比例tiktok-profile = 3 scale tiktok-server = 1 scale tiktok-explore = 5 -d ,您可以启动所需服务的多个实例。此命令允许您根据需要为每个服务的复制品扩展或缩小。它确保了诸如tiktok-profile , tiktok-server 和 tiktok-explore 之类的服务。 /p>
使用Docker Compose在本地测试代码和Docker映像,可以在将其部署到生产中,对应用程序的行为和性能进行全面评估。它有助于确保应用程序按预期运行并可以处理所需的缩放要求。
执行提供的命令后,您会发现指定的配置文件刮板,探索刮板和API服务器已成功启动并运行。
将刮板部署到kubernetes群集
所有内容都是为下一个阶段准备的,其中涉及将应用程序部署到Kubernetes(K8S)群集。以下是示例K8S部署文件供您参考。您可以灵活地自定义刮刀的复制品数,并根据需要调整刮板命令的参数。重要的是要注意,入口控制器中 alb.ingress.kubernetes.io/subnets 的值应根据与您的K8S群集相关的子网设置。这确保了入口控制器的正确网络配置。
要在运行刮板时优化成本,建议在添加新节点组时使用 spot Instances 。现场实例具有显着的成本优势,因为它们通常比按需实例低20%-90%。由于刮板设计为无状态并可以随时终止,因此现场实例适用于此用例。通过利用现场实例,您可以在维持刮板所需功能的同时可节省大量成本。
一旦成功创建了节点组,并且节点的状态已更改为 ready ,您就可以使用命令 kubectl应用-F explyment部署scraper .yaml 。此命令将将部署文件中指定的配置应用于Kubernetes群集。它将确保刮板服务的所需数量副本数量启动并运行。
使用kubernetes的优点之一是它在缩放副本数量方面的灵活性。您可以通过更新部署配置轻松调整应在任何给定时间运行的工人数量。这使您可以根据工作量或绩效要求来扩大或缩小刮板工人的数量。
通过执行适当的 kubectl 命令,您可以灵活地管理和控制Kubernetes群集中的Scraper服务的部署,从而确保最佳性能和资源利用率。
>根据我在刮板方面的丰富经验,我观察到,使用我设定的标准时,初始速度每天可以达到高达100万张记录的速度。但是,重要的是要注意,随着时间的流逝,速度可能逐渐降低到每天几千张记录。由于探索页面的性质,这种下降发生了,其中许多流行内容是在几个月前创建的。随着我们继续刮擦更多的配置文件,我们自然涵盖了大部分受欢迎的资料。因此,发现新的病毒含量变得越来越具有挑战性。
考虑到这一点,建议考虑暂时停止刮板几周甚至更长的时间。通过暂停刮擦过程,您可以让新的病毒含量出现并积累时间。一旦经过足够的时间,重新启动刮板将有助于维持效率并优化成本,因为您将能够专注于捕获最新的流行个人资料和视频。
使用Kubernetes成功完成Tiktok Scraper及其在分布式系统中的部署后,我们实现了强大而可扩展的解决方案。刮擦技术,数据处理和部署基础架构的结合使我们能够利用Tiktok平台的全部潜力。 如果您对本文或对未来文章的任何建议有任何疑问,我鼓励您在下面发表评论。此外,我可以从事远程工作或合同,因此请随时通过电子邮件与我联系。