网页抓取是自动从互联网中提取特定数据的过程。它有许多用例,例如为机器学习项目获取数据、创建价格比较工具或任何其他需要大量数据的创新想法。虽然理论上您可以手动进行数据提取,但互联网的大量内容使这种方法在许多情况下不切实际。因此,知道如何构建网络爬虫可以派上用场。这篇文章的目的是教你如何用 Python 创建一个网页爬虫。您将学习如何检查网站以准备抓取、使用 BeautifulSoup 提取特定数据、使用 Selenium 等待 JavaScript 渲染,以及将所有内容保存在新的 JSON 或 CSV 文件中。
但首先,我应该警告您网络抓取的合法性。虽然抓取行为是合法的,但您可能提取的数据使用可能是非法的。确保你没有爬取:
- 受版权保护的内容 – 由于它是某人的知识产权,因此受法律保护,您不能只是重复使用它。
- 个人数据——如果您收集的信息可用于识别个人身份,则它被视为个人数据,对于欧盟公民而言,它受 GDPR 保护。除非您有合法的理由来存储这些数据,否则最好完全跳过它。
一般来说,在抓取之前,您应该始终阅读网站的条款和条件,以确保您不会违反他们的政策。如果您不确定如何继续,请联系网站所有者并征求同意。
您的Scraper需要什么?
要开始构建您自己的网络爬虫,您首先需要在您的机器上安装Python。Ubuntu 20.04 和其他版本的 Linux 预装了 Python 3。
要检查您的设备上是否已经安装了 Python,请运行以下命令:
python3 -v
如果您安装了 Python,您应该会收到类似如下输出:
Python 3.8.2
此外,对于我们的网络爬虫,我们将使用 Python 包 BeautifulSoup(用于选择特定数据)和 Selenium(用于呈现动态加载的内容)。要安装它们,只需运行以下命令:
pip3 install beautifulsoup4
和
pip3 install selenium
最后一步是确保在您的机器上安装了 Google Chrome和Chrome 驱动程序。如果我们想使用 Selenium 抓取动态加载的内容,这些将是必要的。
使用火狐浏览器或者其他浏览器也需要对应的浏览器驱动。
如何检查页面
现在你已经安装了所有东西,是时候开始我们的抓取项目了。
您应该根据需要选择要抓取的网站。请记住,每个网站的内容结构都不同,因此当您开始自己抓取时,您需要调整在此处学到的内容。每个网站都需要对代码进行细微的更改。
对于本文,我决定从 IMDb 的前 250 部电影列表中抓取前十部电影的信息:https : //www.imdb.com/chart/top/。
首先,我们将获得标题,然后我们将通过从每部电影的页面中提取信息来进一步深入研究。一些数据将需要 JavaScript 呈现。
要开始了解内容的结构,您应该右键单击列表中的第一个标题,然后选择“检查元素”。
通过按 CTRL+F 并在 HTML 代码结构中搜索,您将看到页面上只有一个<table>标记。这很有用,因为它为我们提供了有关如何访问数据的信息。
一个 HTML 选择器将为我们提供页面中的所有标题table tbody tr td.titleColumn a
。那是因为所有标题都位于具有“titleColumn
”类的表格单元格内的锚点中。
使用这个 CSS 选择器并获取每个锚点的innerText
将为我们提供我们需要的标题。您可以在刚刚打开的新窗口中使用 JavaScript 行在浏览器控制台中模拟:
document.querySelectorAll("table tbody tr td.titleColumn a")[0].innerText
你会看到这样的结果:
现在我们有了这个选择器,我们可以开始编写 Python 代码并提取我们需要的信息。
如何使用 BeautifulSoup 提取静态加载的内容
我们列表中的电影标题是静态内容。这是因为如果您查看页面源代码(页面上的 CTRL+U 或右键单击然后选择查看页面源代码),您将看到标题已经存在。
静态内容通常更容易抓取,因为它不需要 JavaScript 渲染。为了提取列表中的前十个标题,我们将使用 BeautifulSoup 获取内容,然后将其打印在我们的Scraper的输出中。
im