使用 Python 进行网页抓取:分步指南
已发表: 2022-11-28Web 抓取是从网站中提取信息并将其用于特定用例的想法。
假设您正尝试从网页中提取表格,将其转换为 JSON 文件并使用 JSON 文件构建一些内部工具。 在网络抓取的帮助下,您可以通过定位网页中的特定元素来提取所需的数据。 使用 Python 进行 Web 抓取是一种非常流行的选择,因为 Python 提供了多个库(如 BeautifulSoup 或 Scrapy)来有效地提取数据。

作为开发人员或数据科学家,拥有有效提取数据的技能也非常重要。 本文将帮助您了解如何有效地抓取网站并获取必要的内容以根据需要对其进行操作。 对于本教程,我们将使用 BeautifulSoup 包。 它是一个用于在 Python 中抓取数据的流行包。
为什么使用 Python 进行网页抓取?
Python 是许多开发人员在构建网络抓取工具时的首选。 Python 成为首选的原因有很多,但对于本文,我们将讨论使用 Python 进行数据抓取的三个主要原因。
库和社区支持:有几个很棒的库,如 BeautifulSoup、Scrapy、Selenium 等,它们提供了有效抓取网页的强大功能。 它为网络抓取构建了一个优秀的生态系统,也因为全球许多开发人员已经在使用 Python,所以当你遇到困难时可以快速获得帮助。
自动化: Python 以其自动化功能而闻名。 如果您正在尝试制作依赖于抓取的复杂工具,则需要的不仅仅是网络抓取。 例如,如果您想构建一个工具来跟踪在线商店中的商品价格,您需要添加一些自动化功能,以便它可以每天跟踪费率并将它们添加到您的数据库中。 Python 使您能够轻松地自动化这些过程。
数据可视化:网络抓取被数据科学家大量使用。 数据科学家经常需要从网页中提取数据。 借助像 Pandas 这样的库,Python 使原始数据的数据可视化变得更简单。
用于 Python 网页抓取的库
Python 中有几个库可用于简化网络抓取。 让我们在这里讨论三个最受欢迎的库。
#1。 美汤
最受欢迎的网络抓取库之一。 BeautifulSoup 自 2004 年以来一直在帮助开发人员抓取网页。它提供了导航、搜索和修改解析树的简单方法。 Beautifulsoup 本身也对传入和传出数据进行编码。 它维护良好,拥有一个很棒的社区。
#2。 废料
另一个流行的数据提取框架。 Scrapy 在 GitHub 上有超过 43000 颗星。 它还可用于从 API 中抓取数据。 它还具有一些有趣的内置支持,例如发送电子邮件。
#3。 硒
Selenium 主要不是网络抓取库。 相反,它是一个浏览器自动化包。 但是我们可以很容易地扩展它的功能来抓取网页。 它使用 WebDriver 协议来控制不同的浏览器。 Selenium 已经上市近 20 年了。 但是使用 Selenium,您可以轻松地从网页中自动化和抓取数据。
Python Web 抓取的挑战
尝试从网站抓取数据时可能会面临许多挑战。 存在诸如网络缓慢、反抓取工具、基于 IP 的阻止、验证码阻止等问题。在尝试抓取网站时,这些问题可能会导致大量问题。
但是您可以通过以下一些方法有效地绕过挑战。 例如,在大多数情况下,当在特定时间间隔内发送的请求超过一定数量时,IP 地址就会被网站屏蔽。 为避免 IP 阻塞,您需要对爬虫进行编码,使其在发送请求后冷却下来。

开发人员还倾向于为爬虫设置蜜罐陷阱。 这些陷阱通常是肉眼看不见的,但可以通过刮板爬行。 如果你正在抓取一个放置了这样一个蜜罐陷阱的网站,你需要相应地编写你的抓取程序的代码。
验证码是爬虫的另一个严重问题。 现在大多数网站都使用验证码来保护机器人对其页面的访问。 在这种情况下,您可能需要使用验证码求解器。
用 Python 抓取网站
正如我们所讨论的,我们将使用 BeautifulSoup 来废弃网站。 在本教程中,我们将从 Coingecko 中抓取以太坊的历史数据并将表数据保存为 JSON 文件。 让我们继续构建刮板。
第一步是安装 BeautifulSoup 和 Requests。 对于本教程,我将使用 Pipenv。 Pipenv 是 Python 的虚拟环境管理器。 如果需要,您也可以使用 Venv,但我更喜欢 Pipenv。 讨论 Pipenv 超出了本教程的范围。 但如果您想了解如何使用 Pipenv,请遵循本指南。 或者,如果您想了解 Python 虚拟环境,请遵循本指南。
通过运行命令pipenv shell
。 它将在您的虚拟环境中启动一个子外壳。 现在,要安装 BeautifulSoup,请运行以下命令:
pipenv install beautifulsoup4
并且,对于安装请求,运行类似于上面的命令:
pipenv install requests
安装完成后,将必要的包导入到主文件中。 创建一个名为main.py
的文件并导入如下所示的包:
from bs4 import BeautifulSoup import requests import json
下一步是获取历史数据页面的内容并使用 BeautifulSoup 中可用的 HTML 解析器解析它们。
r = requests.get('https://www.coingecko.com/en/coins/ethereum/historical_data#panel') soup = BeautifulSoup(r.content, 'html.parser')
在上面的代码中,使用请求库中可用的get
方法访问页面。 然后将解析的内容存储在一个名为soup
的变量中。
原来的抓取部分现在开始。 首先,您需要在 DOM 中正确识别表格。 如果您打开此页面并使用浏览器中可用的开发人员工具对其进行检查,您将看到该表具有这些类table table-striped text-sm text-lg-normal
。

要正确定位此表,您可以使用find
方法。

table = soup.find('table', attrs={'class': 'table table-striped text-sm text-lg-normal'}) table_data = table.find_all('tr') table_headings = [] for th in table_data[0].find_all('th'): table_headings.append(th.text)
在上面的代码中,首先使用soup.find
方法找到表格,然后使用find_all
方法搜索表格内的所有tr
元素。 这些tr
元素存储在一个名为table_data
的变量中。 该表有几个th
元素。 一个名为table_headings
的新变量被初始化以将标题保存在列表中。
然后对表的第一行运行 for 循环。 在这一行中,搜索所有带有th
的元素,并将它们的文本值添加到table_headings
列表中。 使用text
方法提取文本。 如果您现在打印table_headings
变量,您将能够看到以下输出:
['Date', 'Market Cap', 'Volume', 'Open', 'Close']
下一步是抓取其余元素,为每一行生成一个字典,然后将这些行附加到列表中。
for tr in table_data: th = tr.find_all('th') td = tr.find_all('td') data = {} for i in range(len(td)): data.update({table_headings[0]: th[0].text}) data.update({table_headings[i+1]: td[i].text.replace('\n', '')}) if data.__len__() > 0: table_details.append(data)
这是代码的基本部分。 对于table_data
变量中的每个tr
,首先搜索th
元素。 第th
元素是表中显示的日期。 这些th
元素存储在变量th
中。 同样,所有td
元素都存储在td
变量中。
一个空的字典data
被初始化。 初始化后,我们遍历td
元素的范围。 对于每一行,首先,我们用th
的第一项更新字典的第一个字段。 代码table_headings[0]: th[0].text
分配了 date 和第一个th
元素的键值对。
初始化第一个元素后,使用data.update({table_headings[i+1]: td[i].text.replace('\\n', '')})
分配其他元素。 这里首先使用text
方法提取td
元素文本,然后使用replace
方法替换所有\\n
。 然后将该值分配给table_headings
列表的第i+1
个元素,因为第i
个元素已经分配。
然后,如果data
字典长度超过零,我们将字典附加到table_details
列表。 您可以打印table_details
列表进行检查。 但是我们会将这些值写入一个 JSON 文件。 让我们看一下代码,
with open('table.json', 'w') as f: json.dump(table_details, f, indent=2) print('Data saved to json file...')
我们在这里使用json.dump
方法将值写入名为table.json
的 JSON 文件。 写入完成后,我们Data saved to json file...
打印到控制台。
现在,使用以下命令运行该文件,
python run main.py
一段时间后,您将能够在控制台中看到 Data saved to JSON file... 文本。 您还会在工作文件目录中看到一个名为 table.json 的新文件。 该文件将类似于以下 JSON 文件:
[ { "Date": "2022-11-27", "Market Cap": "$145,222,050,633", "Volume": "$5,271,100,860", "Open": "$1,205.66", "Close": "N/A" }, { "Date": "2022-11-26", "Market Cap": "$144,810,246,845", "Volume": "$5,823,202,533", "Open": "$1,198.98", "Close": "$1,205.66" }, { "Date": "2022-11-25", "Market Cap": "$145,091,739,838", "Volume": "$6,955,523,718", "Open": "$1,204.21", "Close": "$1,198.98" }, // ... // ... ]
您已经使用 Python 成功地实现了一个网络抓取工具。 要查看完整代码,您可以访问此 GitHub 存储库。
结论
本文讨论了如何实现简单的 Python 抓取。 我们讨论了如何使用 BeautifulSoup 从网站快速抓取数据。 我们还讨论了其他可用的库,以及为什么 Python 是许多开发人员抓取网站的首选。
您还可以查看这些网络抓取框架。