网页爬取并不容易,因为每个网站的结构都需要不同的方法来成功地收集数据。了解使用哪种网络爬虫技术可以帮助您避免进行不必要的请求,找到嵌套在JavaScript元素中的数据,并仅提取您希望爬取的特定元素。
继续阅读本指南,了解各种收集数据的技术以及它们如何改进您的网络爬虫。
为您的项目选择正确的工具
编程方向的用户通常会使用网络爬虫框架(如Scrapy和Selenium)或类库(如BeautifulSoup)自己构建一个爬虫。你可以在各种编程语言中找到相关的类库,但Python和Node.js通常拥有最好的生态系统。
根据Stack Overflow的2021年开发者调查,超过50%的受访者使用Python进行数据分析或机器学习,而超过40%的受访者使用Node.js进行后端开发。这说明Python和Node.js在网络爬虫开发中非常流行。
另外,你也可以通过使用网络爬虫API来分担一些工作。这是一种较简单的方法,让你可以向API发送请求并简单地存储输出结果。像Soax、Smartproxy或Bright Data这样的供应商提供了商业API给用户使用。
如果你打算在更大规模上使用自己的爬虫,请考虑获取一个代理服务器来隐藏你的IP地址。这样,你就能避免IP封锁、验证码以及其他阻碍。如果你要攻击主要电子商务网站或其他受保护良好的网站,请选择住宅代理;否则,云服务提供商提供的数据中心代理就足够了。
工具 | 优点 | 缺点 |
---|---|---|
爬虫框架(Scrapy、Selenium等) | 功能强大,高度定制化 | 需要编程知识,难度较高 |
网页爬取API | 简单易用,无需编程 | 功能有限,不够灵活 |
代理服务 | 避免被目标网站屏蔽 | 需要额外付费 |
流行的网页爬取技术
1. 手动网页爬取
数据收集最基本的技术是手动爬取。它包括复制内容并将其粘贴到数据集中。尽管这是收集信息最直接的方法,但它是重复且耗时的。根据一项研究,手动收集数据的速度约为每小时40-60行,而利用自动化脚本,爬取速度可以达到每小时数千行。
网站致力于阻止大规模自动化脚本。因此,手动复制粘贴信息的优点之一是您不必处理目标网站施加的严格规则。否则,如果您需要大量数据,请考虑自动爬取。
2. HTML解析
当您想要从网站获取数据时,您需要向目标服务器发送 HTTP 请求,然后目标服务器以 HTML 形式返回信息。但原始 HTML 很难让人阅读。这就是 HTML 解析发挥作用的地方。
一般来说,解析意味着将数据转换为易于阅读的格式,例如 JSON 或 CSV。解析 HTML 有多种方法,例如正则表达式解析。但由于 HTML 数据被组织成树结构,因此可以使用 CSS 或 XPath 选择器等路径语言轻松清理。
CSS 选择器。这些选择器用于查找用于设计网站样式的节点,因此它们可以根据名称轻松选择一组 HTML 元素。您可以按类、属性、类型或 ID 定位元素。所有网页爬取库(例如 Selenium、Puppeteer 或 Cheerio)都支持 CSS 选择器。
如果您想从页面中爬取一些元素,则此方法最有效,因为您只能从父元素导航到子元素。您可以使用检查元素查找包含所需数据的特定元素。
XPath 选择器(或 XML 路径)是一种查询语言,主要用于从基于 XML 或 HTML 的文档获取 DOM 元素。与 CSS 选择器类似,XPath 告诉您特定元素的位置,您无需手动迭代元素列表。XPath 选择器可以遍历父级到子级,反之亦然,因此您在处理结构较少的网站时拥有更大的灵活性。
使用XPath方法,您可以同时爬取多个页面。但是,您的爬取工具比 CSS 选择器更有可能损坏,因为 XPath 与页面结构相关。Web 开发人员往往会经常更改 HTML 标记。您可以通过检查 element 找到 XPath 选择器。
3. 用于链接数据的 JSON
网页由 HTML 标签组成,这些标签告诉浏览器如何显示标签中包含的信息。搜索引擎通过解析 HTML 代码来查找逻辑部分。然而,他们的理解是有限的;如果标签元素不包含其他标签,Google、Bing、Yahoo 或其他搜索引擎将无法正确显示您的内容。
链接数据的 JavaScript 对象表示法 (JSON-LD) 标签对嵌入在页面中的元素进行注释,并为搜索引擎构建数据。网站使用它,以便搜索引擎可以返回更准确的结果并改进它们在 SERP 中的表示方式。您可以在页面的<head>部分的<script>元素下找到 JSON-LD ( application/ld+json ) 标记,并在脚本中使用它来提取数据。
根据Mozilla的研究报告,超过50%的前1000个搜索结果页面包含结构化数据标签,其中近30%包含JSON-LD。这说明JSON-LD在优化搜索引擎结果中发挥着重要作用。
4. XHR 请求
社交媒体等网站动态加载其内容 – 它们依赖于 JavaScript 中嵌套的元素。XMLHttpRequest 对象(或 XHR)是一个 JavaScript API,允许在客户端和服务器之间获取动态数据,而无需加载整个页面。这提供了不间断的浏览体验。
根据W3Techs的调查,超过95%的网站使用了XHR技术。这使其成为爬取现代网页不可或缺的技巧。
以前,XHR 仅与 XML 一起使用,但现在它支持任何类型的数据,包括标准格式 JSON。所有现代浏览器都有一个内置的 XHR 对象。由于交互式网站通常通过后端 API 获取元素,因此数据采用 JSON 格式。因此,当您使用 XHR 对 API 端点进行逆向工程时,您将获得结构化数据并使用更少的带宽。
要检查是否可以通过 XHR 访问网站,请设置过滤器以在浏览器的网络选项卡中仅显示 XHR 请求。
改进脚本的其他有用方法
缓存 HTTP 请求
当涉及到爬取多个页面时,您必须构建一个具有爬取逻辑的爬取器,该逻辑将遍历数千个 URL。但是,一旦您知道哪些页面已被访问过或需要重新访问相同页面以获取更多数据,您就需要缓存 HTTP 请求。此技术允许您将响应存储在数据库中,您可以将其重新用于后续请求。
根据Cloudflare的研究,使用缓存可以减少页面加载时间达60%以上,并大幅降低服务器负载。因此,HTTP请求缓存是提高爬虫性能的重要技巧。
此方法提高了负载性能,因为服务器不需要再次解析或路由每个请求。消除这些步骤可以减少服务器的负载,并且无需每次都重新下载相同的资源。
规范 URL
有些网站会存储多个显示相同内容的 URL。例如,网站可以包含桌面版和移动版,使 URL 标记略有不同,但您的爬取机器人会将数据识别为重复数据。规范 URL 是一个 HTML 代码片段,它定义重复或近似重复的主版本。
规范标签(rel=”canonical”)帮助开发者和爬虫指定不同URL下相同或相似内容的哪个版本是主要的。这样,您可以避免爬取重复项。像 Scrapy 这样的 Web 爬取框架默认处理相同的 URL。您可以在网页的<head>部分中找到规范标签。
处理重定向
HTML 重定向或转发是将用户从一个 URL 重定向到另一个 URL 的方法。HTML 重定向会使爬取工具感到困惑并导致速度变慢。重定向响应的状态代码以 3 开头,有时您的爬取工具会陷入一种称为无限重定向循环的情况。
根据Cloudflare的统计,约10%的Internet流量来自重新定向。因此处理重定向是提高爬虫效率的重要方法。
基于 Python 的爬取库(例如 Requests)通常默认遵循重定向并返回到最终页面。此外,还有一个选项可以通过在请求中写入allow_redirects=False参数来完全禁用重定向。例如,您可以禁止注册、登录或使用某些页面。像 Scrapy 这样的网络爬取框架有中间件来处理页面重定向。