返回博客
网络爬虫技术
Suciu Dan2022年12月13日阅读时间:9分钟

使用 Python 进行网页爬取:Python 爬取的详细指南

使用 Python 进行网页爬取:Python 爬取的详细指南

网络爬虫:它是什么?

网络爬虫:它是什么?

网页抓取和网络爬虫是两个既独立又相关的概念。网络爬虫一直是网页抓取的关键环节,因为只有当爬虫逻辑找到URL时,网页抓取代码才能对其进行处理。

网络爬虫会携带一组待访问的URL,这被称为“种子”。网络爬虫会遍历每个URL对应的HTML文档并定位其中的链接,根据若干因素对所有链接进行筛选和排序,并将新发现的URL链接加入队列。

它会从网页中提取特定数据,或抓取所有HTML标签及数据,随后通过独特的处理管道进行处理。

Code editor screenshot showing a PHP function with a sidebar of CSS files

来源

网络爬虫分类

网络爬虫分类

根据执行结构和技术,网络爬虫可分为以下几类:深度网络爬虫、增量网络爬虫、聚焦型网络爬虫和通用网络爬虫。

网络爬虫及其基本工作流程

网络爬虫及其基本工作流程 Close-up photo of HTML code on a screen with the words

来源

一个通用网络爬虫包含以下基本工作流程:

获取首个URL。作为起始元素的首个URL是网络爬虫的入口点,它将引导您访问需要爬取的网页。

在爬取网页时,必须提取该网页的HTML内容,随后运用解析方法或HTML解析器,提取所有与该特定网页相关联的页面URL。

将所有这些URL按队列方式排列。遍历该队列,逐个读取并解析URL。

然后,针对每个 URL 爬取相应的网页,并重复上述步骤。

最后,检查停止条件是否满足。若未设置停止条件,网络爬虫将持续爬取,直至无法获取新的 URL。

网页爬取:需要进行哪些环境准备?

网页爬取:需要进行哪些环境准备?
  • 确保在您的环境中安装了 Chrome、Internet Explorer 或 Safari 等浏览器。
  • 开始下载并安装 Python 编程语言。
  • 随后,下载一个理想的集成开发环境(IDE),例如 Visual Studio Code。
  • 开始安装所需的 Python 文件。例如,Pip 是一款 Python 管理工具,可帮助您查找、下载、安装甚至卸载 Python 包。

您必须了解的网络爬虫策略

您必须了解的网络爬虫策略 Close-up photo of programming code on a screen with red and blue syntax highlighting

通常,网络爬虫仅根据爬虫预算探索网页子集。该预算可以是按爬取深度、域名或执行时间划分的最大页面数量。

知名网站通常提供 robots.txt 文件,用于明确标识并展示网站中禁止任何用户代理爬取的区域。sitemap.xml 文件则与 robots.txt 完全相反,它列出了所有可被爬取的页面。

网络爬虫的几种最常见应用场景包括:

用例 1:

用例 1:

Yandex Bot、Bingbot、Googlebot 等搜索引擎会提取主要网站部分的所有 HTML 文档。提取的数据会进一步被索引,从而转化为可搜索的数据。

用例 2:

用例 2:

除了收集 HTML 代码外,SEO 分析软件还会收集响应对象、响应时间和状态码等元数据,以查找损坏的网页,并从各个域名中提取反向链接。

用例 3:

用例 3:

电子商务网站通过价格监控工具进行网页爬取,以识别产品网页并收集元数据(主要是价格)。随后,会对该电子商务网站的产品页面进行定期回访。

用例 4:

用例 4:

Common Crawl 负责维护和保存一个开放的网络爬虫信息或数据存储库。例如,截至 2020 年 10 月,该存档中已存储了 27.1 亿个网页。

从零开始用 Python 开发基础网页爬虫

从零开始用 Python 开发基础网页爬虫 Diagram of a web scraping workflow showing browser requests, a scraping application, and a database

来源

要在 Python 文件中开发一个基础网络爬虫,您至少需要一个用于从 URL 下载 HTML 标签的库,以及一个用于解析 HTML 并收集链接的库。

Python 社区提供了用于解析 HTML 的标准库(如 html.parser)以及用于执行 HTTP 请求的 urllib。在 Github 上,您可以找到一个仅使用这些标准库开发的 Python 爬虫示例。

Python 用于 HTML 解析和请求的标准开发工具并不太友好。

其他知名库,如 requests 库和 BeautifulSoup,则提供了更优的开发者体验。

为了更好地理解,请回顾本节前面提到的要点,并参考一组定义好的 HTML 源代码。

通常,上述代码很简单。然而,在对整个网站进行网络爬取并完全抓取数据之前,还有几个可用性和性能方面的挑战需要解决。

  • 网络爬虫通常速度较慢,且缺乏平衡性。网络爬虫通常需要大约一秒钟才能爬取一个特定的 URL。
  • 每次网络爬虫提交请求时,它都会进入请求处理队列,在此期间无法执行任何任务。
  • 下载 URL 逻辑中没有重试选项。URL 队列并非真正的队列,当涉及大量 URL 时效率低下。
  • 链接提取逻辑不支持按域名过滤URL或过滤对静态文件的请求,无法处理以井号(#)开头的URL,且不支持通过移除URL查询字符串参数来规范化URL。
  • 该网络爬虫会忽略 robots.txt 文件,且不会进行自我标识或隐藏。

现在,让我们看看为何应该安装 Scrapy,以及它如何让自定义网络爬取变得前所未有的简单。

通过 Python 进行网页爬取

通过 Python 进行网页爬取 Scrapy project homepage screenshot with installation options and a sample spider code block

来源

Scrapy 是最知名的 Python 网络抓取和爬虫包之一,在 Github 上拥有极高的综合评分。

Scrapy的一大优势在于请求的组织与处理采用异步方式。这意味着Scrapy可以在前一个请求完成之前发送下一个请求,或在处理过程中执行其他操作。

Scrapy 不仅能处理多个并发请求,还可通过自定义配置来尊重网站规则。

Scrapy 采用多组件架构。通常,您至少需要使用两个不同的类:Spider 类和 Pipeline 类。

网络爬取可视为一种 ETL 过程;在此过程中,您只需从所有 HTML 和网页中提取数据。当然,您还需要将提取的数据加载到您的个人存储中。

Scrapy 蜘蛛负责提取数据,而管道则确保数据能无缝加载到您的存储中。您可以在管道和蜘蛛中都看到数据转换过程。

不过,建议设置一个定制化的 Scrapy 管道,以单独转换每个项目。通过这种方法,即使某个项目无法处理,也不会影响其他项目。

此外,您还可以在组件之间集成 Scrapy 蜘蛛和下载器中间件。

Scrapy 架构概述

Scrapy 架构概述 Diagram of Scrapy architecture showing spiders, engine, scheduler, downloader, and item pipelines

如果您之前已经尝试过 Scrapy,您会知道 Web 爬虫被定义为从基础 Spider 类派生出的类,并使用解析方法来处理所有响应。

安装 Scrapy 后,您将获得多种通用蜘蛛类,包括 SitemapSpider、CSVFeedSpider、XMLFeedSpider 和 CrawlSpider。

CrawlSpider 类也是基础 Scrapy Spider 类的分支,它提供了一个额外的 rules 属性,用于指定爬取特定网站的方法。

每条规则都利用 LinkExtractor 来确定从每个网页中提取的链接。

开发一个用于 IMDb 的示例 Scrapy 爬虫

开发一个用于 IMDb 的示例 Scrapy 爬虫

在尝试爬取 IMDb 网站之前,请通过检查 IMDb 的 robots.txt 文件来确定哪些 URL 路径是被允许的。

该 robots 文件仅对所有用户代理禁止了 26 个路由或路径。Scrapy 会在开始前读取并检查 robots.txt 文件,并在 ROBOTSTXT_OBEY 设置为 true 时遵守该文件。

此规则适用于所有通过 Scrapy startproject 命令创建的项目。

大规模网页爬取

大规模网页爬取

默认情况下,对于像 IMDb 这样的网站,Scrapy 的网络爬虫每分钟可爬取约 600 页。一个爬虫通常需要 50 多天才能爬取约 4500 万页。

为了爬取各种网站,建议针对每组网站部署独立的网络爬虫。

通过 Scrapy 配置,使用 Python 程序进行 Web 爬取非常简单

通过 Scrapy 配置,使用 Python 程序进行 Web 爬取非常简单

您可以通过两种方式编写 Python 框架爬虫的源代码。第一种是使用第三方库下载网页 URL,第二种是使用基于流行网络爬虫框架设计的爬虫来解析 HTML。

Scrapy 是一个出色的网络爬虫框架,您可以通过自定义代码轻松扩展其功能。不过,您必须了解所有可集成自定义代码的接口,以及每个组件的配置设置。

当您爬取包含数百万网页的网站时,正确且无缝的 Scrapy 配置就显得尤为重要。如果您想进一步了解网页爬取,建议选择一个信誉良好的网站并开始对其进行爬取。

使用 WebScrapingAPI 实现无缝网页爬取与数据抓取

使用 WebScrapingAPI 实现无缝网页爬取与数据抓取 WebScrapingAPI page screenshot describing data extraction and proxy rotation features with icons of popular sites

来源

尽管市面上有大量开源数据爬虫工具,但它们可能无法大规模爬取复杂的网页和网站。

您可能需要调整和修改底层代码,以确保代码能正常处理目标页面。此外,这些工具可能无法在您环境中的每款操作系统上运行。另一个可能出现的问题是计算能力和速度要求。

为克服这些障碍,WebScrapingAPI 支持您无视编程语言、设备或平台的限制,爬取多页面内容,并将数据存储于数据库系统或 .csv 等基础、易懂且可读的文件格式中。

在从网络抓取数据和执行网页抓取功能方面,WebScrapingAPI 让操作变得前所未有的简单。

您可访问我们的网站或联系我们,进一步了解我们的网页抓取与爬取功能。如需详细了解我们的定价信息,请点击此处。 

关于作者
Suciu Dan, 联合创始人 @ WebScrapingAPI
Suciu Dan联合创始人

Suciu Dan 是 WebScrapingAPI 的联合创始人,他撰写了关于 Python 网页抓取、Ruby 网页抓取以及代理基础设施的实用指南,这些指南专为开发者而设计。

开始构建

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

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