Python 网页抓取初学者指南 [2023 年循序渐进]
作为一名 Python 开发人员,您是否期待从互联网上提取 Web 数据,并且正在寻求进展?那么您就来到了正确的页面,因为我们将在本文中向您介绍使用 Python 进行网页抓取的基础知识。
数据现在被称为新石油,世界上最重要的公司都依赖它来进行决策。虽然用于决策的数据来源有多种,但互联网是不可忽视的主要来源之一。
事实上,对于某些行业和用例来说,互联网是最重要的单一来源。有了互联网,问题不再是数据的可用性;而是问题。它是如何提取、清理并将其用于数据分析和决策过程。
在互联网上提取公开数据的过程可能是忙碌的、重复的,甚至容易出错。对于一定数量的数据,你甚至不可能手动收集。这就是为什么我们求助于使用自动化方法来收集数据。从网页中提取公开可用数据的自动化方法称为网络抓取。
此过程是使用称为网络抓取工具的自动化机器人来执行的。已经有现成的网络抓取工具,但您可以使用自己喜欢的编程语言(例如 Python 编程语言)自行创建一个。
用于 Web Scraper 开发的 Python
您可能有兴趣了解 Python 是开发机器人(例如网络抓取工具)最流行的编程语言之一。事实上,它是教授网络抓取的事实上的语言,您可以通过在其基本网络抓取指南中使用它的指南数量来确认这一点。Python 受到许多机器人开发人员和网络爬虫的喜爱是有原因的。以下是 Python 成为网页抓取完美语言的一些原因。
易于编码和理解: Python 在网络抓取中流行的首要原因是其易于使用和简单的语法。事实上,大多数在没有编码经验的情况下进入网络抓取的人都是从 Python 开始的。这是因为它很容易使用,并且消除了所有会让初学者感到困惑的冗长语法。
与其他流行语言一样,任何地方都没有大括号或分号,这使得它不那么混乱。事实上,这类似于阅读英语陈述。它的缩进也使其更易于阅读。
更少的代码行:使用 Python 编程,您可以用更少的权利完成更多的工作。这符合自动化原理。如果您编写代码所花费的时间比手动提取数据所花费的时间多,那么将其自动化就没有意义。只需几行代码,您就可以使用 Python 实现很多功能。通常,您可以做得更多。与任何其他编程语言相比,Python 中的网页抓取任务所需的代码行数更少。
大量的网页抓取库:可用的库和第三方工具也是 Python 成为网页抓取首选语言的另一个原因。有许多库可以满足您想要实现的任何目标。流行的包括用于发送网络请求的Requests和用于遍历解析下载页面中感兴趣的数据的BeautifulSoup。还有庞大的数据分析库,比如Pandas、Numpy、Matplotlib,
庞大的社区:作为一种流行的网络抓取编程语言的优势之一是有一个庞大的社区支持它。您现在不会遇到其他人没有遇到过的问题,因此,在网页抓取时更容易获得有关 Python 的帮助。
如何使用Python进行网页抓取
与编程中的所有其他任务一样,您需要遵循其他步骤才能完成此任务。如果您正确地遵循这些步骤,您应该能够编写一个算法,该算法将完成提取所需网页的感兴趣数据所需的步骤。以下是使用 Python 成功执行网页抓取操作时应遵循的步骤。
第 1 步:针对网络抓取项目进行集思广益
您无法漫无目的地学习如何编写网络爬虫代码。您将需要一个焦点,而该焦点将是您想要抓取的数据。在本指南中,我想让该项目变得如此简单易懂。因此,我们将要做的项目是一个网络抓取工具,可以提取页面上的所有 URL——很简单。网络抓取工具不会是高级的网络抓取工具,也不会做任何传奇的事情。只需给它一个 URL,它就会返回您提供的 URL 的网页上存在的所有 URL。
我们不会处理异常或任何类型的错误。这只是一个概念证明。同样重要的是,您要知道网络抓取工具只能在静态页面上运行。不支持依赖 JavaScript 呈现来显示内容的网页。
第 2 步:安装 Python 和相关的网页抓取库
通常,大多数计算机都安装了 Python。但安装的版本是 Python 2。这不是当前版本,由于缺乏支持它的库,您将很难用它编写网络抓取工具。您需要安装当前版本的 Python 3。前往Python 官方网站下载并安装适合您的操作系统 (OS) 的特定安装程序。
接下来,您需要安装用于网页抓取的相关库。Python 附带了网络支持和一个称为 urllib 的库,用于处理 HTTP 请求。它还带有自己的解析器。然而,这些对于初学者来说并不友好。为了让您更轻松,我们建议您使用更易于使用的第三方库。
Requests 和 BeautifulSoup 的组合将完成这项工作。Requests是一个 HTTP 库,而BeautifulSoup用于从使用 Requests 下载的页面中提取特定的数据点。由于它们是第三方库,因此您需要安装它们。您可以使用 pip install 命令来安装这 2 个库。
在命令提示符中运行以下命令来安装 Requests
pip 安装请求
运行以下命令安装 BeautifulSoup
pip 安装 beautifulsoup4
如果两者安装均成功,则可以继续下一步。
第 3 步:选择目标 URL
我们选择了一个简单的项目来进行。但我们还需要一个特定的网页来用于指南。让我们使用 Wikipedia 主页作为示例 URL — https://www.wikipedia.org。您可以使用您选择的任何 URL。这里的任务很简单,这就是我选择维基百科主页的原因。
我们将抓取此页面上找到的所有 URL。如果我们想让机器人变得更先进,我们可以只抓取满足特定条件的 URL,甚至将其转换为爬虫,访问每个抓取的 URL 并抓取其上的 URL,然后该过程继续进行。正如您所看到的,网络爬虫是从网络爬虫中产生的。网络抓取的第一步实际上涉及发送网络请求。以下是如何使用 Request 库在 Python 中发送 Web 请求。
import requests headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"} response = requests.get("http://www.wikipedia.org", headers=headers) print(response.text)
从上面可以看到,我们使用requests中的get方法来下载https://www.wikipedia.org页面的内容。我们添加了一个标头,以便我们可以添加自定义用户代理字符串来欺骗我们的目标认为我们正在使用真正的浏览器。如果运行上面的代码,您将看到使用打印功能在屏幕上打印维基百科主页的 HTML。
第 4 步:检查页面的 HTML
网络抓取需要从页面中提取特定数据。假设从产品页面提取价格数据或从论坛讨论中提取评论。在此页面上,我们想要的只是维基百科页面上的 URL。第一步是检查页面的源代码。为此,请右键单击该页面,然后单击“查看页面源代码”。您将看到如下所示的内容。
如果您查看上面的 HTML 代码,您将看到 URL 包含在 a 标记中。以下是示例标签之一。
<a id="js-link-box-pt" href="//pt.wikipedia.org/" title="Português — Wikipédia — A enciclopédia livre" class="link-box" data-slogan="A enciclopédia livre"> <strong>Português</strong> <small><bdi dir="ltr">1 085 000+</bdi> <span>artigos</span></small> </a>
要从页面中提取 URL,请检查以下代码
import requests from bs4 import BeautifulSoup headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"} response = requests.get("http://www.wikipedia.com", headers=headers) soup = BeautifulSoup(response.text) links = soup.find_all("a") for link in links: print(link.get("href"))
如您所见,如果运行代码,您将看到屏幕上打印的 URL。
第 5 步:优化代码
让我们将代码重构为一个函数,该函数接受 URL 作为输入,并将页面上的 URL 作为输出。
import requests from bs4 import BeautifulSoup def scrapeURLs(url): headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"} response = requests.get(url, headers=headers) urls = [] soup = BeautifulSoup(response.text) links = soup.find_all("a") for link in links: urls.append(link.get("href")) return urls
使用 Python 进行网页抓取的相关问题
您可以看到使用 Python 从互联网上抓取数据是多么简单。但是使用 python 进行抓取时会遇到哪些具体问题呢?
性能问题
使用 Python 进行抓取时要处理的主要问题实际上是性能问题。Python 的速度并不快,与其相关的库也一样。与 Java 等语言相比,Python 的多线程支持也不是成熟的。不过,对于大多数用户来说,速度不是问题。但是,如果您正在处理一个性能是主要关注点的项目,并且您需要尽可能多地发挥裸机性能,那么 Python 就不是适合这项工作的语言。
IP 块
这个问题并不是 Python 网络爬虫所独有的。所有网络抓取工具都必须处理这个问题。根据设计,网络抓取工具会在短时间内发送过多的请求。不幸的是,大多数网站不支持这一点,因此,其反垃圾邮件系统中包含了请求限制。经过几次请求后,网络抓取工具就会被阻止,除非他们有意识地绕过这个问题。大多数反垃圾邮件系统依靠 IP 地址进行识别。借助轮换代理,您可以隐藏自己的真实 IP 地址,并获得任意数量的替代 IP 来执行任务,而不会被阻止。Bright Data 和 Smartproxy 是目前最好的提供商之一。
验证码干扰
有时,该块不像 IP 块那样坚硬。如果网站怀疑您通过自动方式访问它,您可以通过验证码来解决。这会让大多数基本的网络抓取工具措手不及。
但是,如果您在计算机视觉方面经验丰富,则可以编写自动验证码求解器来处理此问题。还有带有 API 的验证码解决服务,您可以利用这些 API 自动解决验证码。2Captcha 和 DeathByCaptcha 是不错的选择。
结论
与过去不同的是,您可以使用现成的网络抓取工具。无需编写任何代码即可使用。这意味着不再需要学习如何用其他语言编写 Python 代码来开发自己的网络爬虫。但是,如果您有自定义需求或需要将网络抓取逻辑集成到您的软件中,那么学习如何使用 Python 编写网络抓取程序是关键。