返回博客
网络爬虫技术
Anda MiuțescuLast updated on Mar 31, 20261 min read

终极网页抓取技巧大全

终极网页抓取技巧大全

虽然网络爬虫听起来似乎很简单,但初学者可能会遇到许多陷阱。与其采用暴力破解的方式直到用尽未被封禁的代理,我更倾向于认为,明智的做法是“聪明地”进行爬取——获取所需数据后悄然离开,不被察觉。

真正的难题在于:如何做到这一点?如何在不被封IP、不遭遇验证码、不抓取无用JavaScript代码、也不必无休止地调试抓取程序代码的情况下获取信息?虽然没有放之四海皆准的黄金法则,但确实存在一些最佳实践。

我们为您准备了十二条建议。运用这些技巧,您会发现互联网上的所有数据只需点击几下即可获取。

1. 爬取前先规划

与任何项目一样,如果能在开始前制定清晰的策略,网页抓取工作会顺利得多。首先,您为何需要这些数据?这个问题看似显而易见,但答案对于确定应收集哪些信息至关重要。

其次,您打算从何处获取信息?爬取工具必须与目标网站高度匹配,因此仔细分析数据源将有助于您开发或选购适合该任务的工具。

第三个问题:你将如何利用收集到的信息?你可以自行处理,使用软件,甚至将其送入复杂的处理管道。答案将是你决定收集数据结构和文件格式的第一步。

还有许多其他问题和思路需要厘清,其中大部分取决于您的具体目标。但有一点是确定的:“三思而后行”这一原则在网页抓取中同样适用。

2. 表现得更像人类

若想判断网站访客是真人还是机器人,只需观察其行为模式。机器人行动迅如闪电,除非收到指令,否则绝不会与页面进行交互。因此,它们很容易被识别并拦截。

为了帮助爬虫规避检测,你必须教会它像普通访客——也就是人类那样行事。妙处在于,人们的行为方式千差万别,因此你在编码时拥有很大的自由度。以下是我们建议添加的一些操作:

  • 添加随机的停顿间隔,仿佛真人正在阅读页面内容。5到10秒的延迟效果就很好。
  • 采用树状结构浏览页面。若需抓取多个子页面,每次跳转时务必先返回父页面。这将模拟用户点击页面、返回、再点击下一页的自然行为。
  • 让机器人时不时点击一些随机元素。这可是所有人都会做的事,不只是我,对吧?

总之,你的机器人必须以特定方式运作,是因为网站可能会监控并记录其活动。但如果网站无法追踪到机器人呢?请阅读下一条,你将找到答案。

3. 轮换代理

使用代理来确保你的真实IP不被封禁,这简直是显而易见的事。从特定地理位置获取代理来访问受地域限制的内容也是如此。但有了合适的工具,代理能为你做更多事情!

此刻,您需要的正是用于轮换代理池的服务器。借助它,您发送的每个请求都会被分配给池中一个随机的IP地址,并发送至目标网站。这样,您就可以随心所欲地抓取网站数据,而每个请求看起来都像是来自不同的地点和用户。

此外,轮换代理还能确保:即使某个 IP 被封禁,您也不会因此受阻,直到手动更换代理为止。某个请求可能失败,但其他请求仍能正常进行。优质的工具还会自动重试失败的请求,例如 WebScrapingAPI 会重试失败的 API 调用,以确保您的数据库数据完整无缺。

若想获得最佳效果,建议使用住宅轮换代理。住宅IP最不容易被察觉或封禁,通过轮换使用,可进一步降低爬虫被检测到的风险。但请注意,这种做法有时可能有些过度。若您未遭遇复杂的反机器人措施,数据中心轮换代理同样能胜任,且成本更低。

4. 使用无头浏览器

无头浏览器与普通浏览器功能相同,只是没有图形用户界面。要使用它浏览网页,必须通过命令行界面操作。

你绝对应该将无头浏览器加入网页抓取流程,而动态网站正是原因所在。如今许多网站使用 JavaScript 为访客提供更好的用户体验。最简单的例子就是调整页面元素的大小,使其完美适配访客的屏幕分辨率。

问题在于,宝贵的HTML内容被隐藏在JavaScript代码之后。要获取这些内容,就必须执行JS代码。普通的爬虫无法做到这一点,但所有浏览器都能做到。

因此,若缺乏浏览器环境,爬虫工具将无法从任何使用 JavaScript 的网站中收集数据——而目前绝大多数网站(或至少是那些重要的网站)都依赖 JavaScript。

如果你正在从零开始构建爬虫,我建议你尝试 Puppeteer,以下是关于它功能及使用方法的详细说明。

5. 轮换 User-Agent 头部

User-Agent 是一个 HTTP 请求头,它会告知你访问的网站你正在使用什么浏览器和操作系统。从某种意义上说,网站会利用这个头部来了解访问者的更多信息。这对数据分析非常有用,同时也对识别机器人(bot)有所帮助。

用户代理字符串通常如下所示:

Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0

有三种主要情况需要避免:

  • 完全不包含用户代理。大多数爬虫不会使用用户代理,这很可疑,也是暴露其机器人身份的好方法。请确保每次请求都发送看起来正常的标头。
  • 使用过时的用户代理。浏览器通常会在每次更新后更改该标头。因此,如果您的列表中包含 Mozilla 的用户代理,但该浏览器已更新并更改了它,您访问的网站就会察觉到其中有猫腻。
  • 每次请求都使用相同的标头。虽然你可以使用实际浏览器的标准用户代理,但这会导致数百个来自不同 IP 地址的请求具有完全相同的指纹。这无疑是巨大的破绽。

关于这个话题,这里有一个额外的小贴士:尝试使用 Googlebot 的用户代理。当然,任何网站都希望被收录,因此它们通常不会阻挡 Google 的爬虫。不过需要注意的是:Google 的爬虫也有特定的 IP 地址和行为模式,因此仅靠用户代理并不能保证成功。

6. 添加反验证码功能

如果你的抓取工作做得很好,通常只会极少遇到验证码。但即便遇到,这也十分令人烦恼,因为它可能会让你的抓取程序停滞不前,或者返回错误数据(即验证码页面的代码)。

反验证码的应对策略分为两部分:预防和处理。你应主要侧重于预防,因为这无疑是更高效的方案。具体操作如下:

  • 使用代理服务器,使请求看起来像是来自不同的来源。
  • 轮换请求头(尤其是 User-Agent)。否则,即使使用了多个 IP 地址,你仍可能被识别出来。
  • 执行页面的 JavaScript 代码。无头浏览器是最佳选择。许多网站会向不执行 JavaScript 的访客弹出 CAPTCHA,因为这属于异常行为。

因此,本质上应结合第3、第4和第5条建议。

如果爬虫仍然遇到问题,你需要一个验证码破解工具。在选择网页爬取工具时,请确保所选工具已内置此功能。否则,虽然从技术上讲你可以自行集成破解工具,但这意味着额外的编码工作以及时间浪费。顺便提一下,我们的API具备此功能,不过它本身很少遇到验证码。

7. 创建 URL 列表

开始抓取任务时,您通常会整理一份包含有价值信息的URL列表。这里有个建议:不要只是将URL发送给抓取工具,而是建立一个列表,并标记所有已爬取过的链接。为了清晰起见,您还可以将已抓取的数据与URL一同保存。

这样做的原因很简单:如果电脑崩溃或发生其他意外情况,你依然能清楚掌握已获取的数据,从而避免重复抓取。

我们的建议是编写一个用于数据提取记录管理的脚本。手动更新列表不仅耗时费力,而且你根本无法跟上爬虫的处理速度。

8. 了解页面结构

收集更多数据自然需要更多时间。因此,提高效率的一种方法是精确定位爬虫应抓取的信息。理论上很简单,但每个网站和网页都是独特的。为了减少开销并节省时间,你必须了解目标页面的结构。

具体操作如下:

  • 访问目标页面;
  • 右键点击目标文本并选择“检查元素”;
  • 观察这些信息的嵌套方式、所属类名以及所在的标签;
  • 在其他目标页面中寻找结构模式。这样一来,你很可能就能编写一个脚本,从整个网站中收集所有所需信息。

完成这些步骤后,你将能更轻松地提取所需的具体信息。这样做的好处是,文档中不再会有无关的 HTML 代码造成杂乱。

理解页面布局对抓取产品信息尤为有用。同一网站上的产品页面结构通常相似,甚至完全一致。一旦掌握其逻辑,就能更快地进行提取和解析。

9. 在请求之间添加延迟

网络爬虫的意义在于以比人类更快的速度收集数据。我们理解这一点,但速度过快会带来一个不希望看到的副作用:它会昭然若揭地暴露请求是由机器人发出的。

还记得我们提到的“像普通访客一样”吗:如果爬虫行为过于显眼,被封禁的概率就会大大增加。不过别担心,你只需在使用同一IP进行多次并发或连续访问时,加入随机的延迟即可。

请注意:仅在使用同一代理时才需这样做。若每次请求后都更换 IP 和请求头,则无需设置延迟。但若您已通过某个 IP 登录,则应固定使用该 IP,这意味着您同样需要设置延迟。

请确保延时时间略有不同,以实现随机延迟。5 到 10 秒之间的延迟效果通常不错。

10. 缓存重要页面

在某些情况下,您可能需要重新访问之前已抓取过的页面以获取更多信息。与其重复抓取,不如在首次访问时将页面缓存起来,这样所有数据都会被保存下来。

即便是最先进的网页抓取工具,机器人首次尝试时仍有无法获取数据的风险;即便成功,也依然是在白费力气。只需一次性抓取全部 HTML 内容,随后便可从已保存的版本中提取所需的任何信息。

例如,你可以缓存一个产品页面以便随时调用。如果你今天需要产品规格,而明天可能需要价格,这些数据早已收集完毕,静待处理。

不过请注意,这只适用于静态信息!如果你需要股票价格,就必须持续提取最新数据,因为缓存版本很快就会过时。

11. 登录时请谨慎

您所需的数据可能隐藏在登录页面之后。社交媒体平台便是典型例子。当然,您可以在没有账户的情况下获取少量内容,但这会更加费力,而且您可能想要获取只有加入群组或好友列表后才能看到的内容。简而言之,您可能需要登录,而这会带来一些问题。

所有拥有账户的网站用户都必须同意其《服务条款》。这些条款中可能包含一条条款,明确禁止使用机器人、自动化工具或网络爬虫。在这种情况下,提取数据显然违反了用户已同意的规则。

另需注意的是,虽然网站可能不会对未注册访客格外关注,但它们会更密切地监控已登录用户发送的Cookie。因此,本质上会有更多“目光”关注你的机器人。行为过于明显的机器人或带有特征性Cookie的机器人,被封禁的风险会更高。

您应采取的措施:

  • 仔细阅读服务条款,确保您的操作不违反相关规定。
  • 确保遵循本文中的所有其他建议,特别是关于代理、模拟人类行为、JS渲染以及请求头的信息。

12. 避免对网站造成损害

大多数网站管理员都不喜欢自己的网站上出现爬虫。对某些人来说,机器人只是个小麻烦;对另一些人来说,它们却是重大威胁。简单来说,黑客和其他别有用心的人会利用机器人制造麻烦和破坏,比如导致网站崩溃或试图窃取机密数据。

即使您的初衷完全友好,也可能无意中引发麻烦。海量的并发请求可能会导致服务器崩溃,因此以下是一些最佳实践,以确保您不会在身后留下混乱:

  • 降低请求频率,避免导致整个网站崩溃;
  • 阅读 Robots.txt 文件,其中通常会说明机器人被允许执行哪些操作。虽然该文件不具有法律约束力,但它确实表达了网站所有者的意愿。
  • 请谨慎使用抓取的数据。例如,直接复制内容并重新发布既会造成损害,也属于违法行为,因为该内容受版权法保护。
  • 只要条件允许,请务必征得网站所有者的许可后再收集信息。

通过友好且符合道德规范的行为,您可以尽自己的一份力,确保机器人被视为有用的工具,而非某种数字掠夺者。

额外提示:选择合适的网页抓取工具

虽然网络爬取没有万能公式,但存在一些关键因素,能助您在最佳时机获得最优结果。本文旨在解答所有疑问,涵盖所有明文或潜规则,并提供所有最佳实践。API 将帮助解决日常爬取中的诸多难题,这也正是我们首推自动化作为首要技巧的原因。

明智地进行抓取,并利用我们提供的 1000 次免费调用享受您工作的成果!

虽然上述部分技巧涉及如何使用爬取工具,但其中许多功能可由软件自身集成并自动化处理,让您能够专注于自身任务和目标。正因如此,我们认为选择合适的程序与我们讨论的所有技巧同样重要,甚至更为关键。

老实说,我认为 WebScrapingAPI 是一个绝佳的选择,尤其是您可以通过免费套餐试用该 API,在投入资金前亲身体验其性能表现。

如果您想进一步了解,我们撰写了一份详尽的选购指南,其中介绍了20款网页抓取工具,欢迎查阅!

关于作者
Anda Miuțescu, 技术内容撰稿人 @ WebScrapingAPI
Anda Miuțescu技术内容撰稿人

安达·米乌特斯库是 WebScrapingAPI 的技术内容撰稿人,负责创作清晰、实用的内容,帮助开发者了解该产品及其功能。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网络数据。