虽然我们今天所知道的网络抓取已经存在了十多年,但它的相关性从未如此深远。使其有用并产生价值的能力目前适用于几乎所有业务领域及其他领域。
以下是一些证明网络抓取在企业中日益增长的必要性的因素:
- 调度和自动化
- 快速、低维护的结果
- 成本效益
- 实现竞争优势,例如基于数据的市场分析
- 收集数据以更好地了解客户的需求
还有很多。
主要问题是机器学习将如何影响已经成功的数据抓取技术?
什么是机器学习?
首先,让我们更深入地了解机器学习 (ML) 的主要特征。作为数据科学的重要组成部分和人工智能的一个分支/副产品,它旨在模仿人类学习的方式。它通过收集数据和使用算法来做到这一点,然后将这些算法用于在预测及其准确性方面逐步自我改进。
这些功能相当方便,因为它们允许更多的手动方法,即,而不是手动编码各种软件例程或指令,这将使您能够主要通过机器完成特定的给定任务,而开发人员的干预很少。
下一个问题是机器学习的好处如何转化为现实生活场景?为了回答这个问题,让我们看一些用例。
客户服务:聊天机器人开始取代人工代理,常见问题解答通常在没有人工回复的情况下得到回答。Slack 和 Facebook 的虚拟代理就是最好的例子。
下一代住宅代理:由最新的 AI/ML 创新提供支持,允许进行重型数据提取。这些代理包含基于 ML 的 HTML 解析、人工智能驱动的动态指纹、易于集成、100% 的成功率以及许多其他功能。
计算机视觉:人工智能以及机器学习技术允许仅从视觉数据中提取有意义的信息,从而可以完成识别任务。这种使用的一个典型例子是自动驾驶汽车中的 ML 集成。
股票交易:实现自动交易,通过每天可能进行数百万次自动交易来优化股票投资组合。
网络抓取在机器学习中的重要性
在讨论了机器学习的特性之后,让我们来看看它们是如何在网络抓取中翻译的。
首先,ML 中的网络抓取主要围绕收集质量数据的核心问题。
虽然在日常业务中收集的内部信息可以提供有价值的见解,但这些数据是不够的。因此,从外部来源收集是必不可少的,尽管这是一项更复杂的任务。在抓取时,不准确/较差的数据质量成为一个严重的问题,并且最终的清理步骤必须始终包含在任何抓取项目中,尽管这将在本指南后面更详细地讨论。
使用机器学习进行网页抓取
以下示例使用网络抓取收集历史股票价格。还将收集每日开盘、每日最高、每日最低、每日收盘等数据点。
值得庆幸的是,许多网站都提供了此类数据,并且通常方便地以表格形式呈现。通常,您会看到呈现这些表格的 HTML 代码,如下图所示。

考虑到这一点,让我们开始网络抓取的第一步。
项目要求
在本博客中,我们将使用 Python 3.9。但是,此代码也适用于 Python 3.7 和 3.8。
这个项目有两组要求。首先,用于网络抓取的库,其次是用于机器学习的库。
对于网页抓取,我们需要 Requests-HTML 和 BeautifulSoup4。从终端安装这些,如下所示:
$ python3 -m pip install requests_html beautifulsoup4
在机器学习方面,我们将使用多个库。首先,Pandas 和 Numpy 将成为我们处理数据的选择。对于可视化,Matplotlib 将是我们的选择。对于预处理数据,我们需要 SciKit Learn 库的帮助。最后,我们将使用 TensorFlow 来创建神经网络机器学习模型。从终端安装所有这些库,如下所示:
$ python3 -m pip install pandas numpy matplotlib seaborn tensorflow sklearn
提取数据
如果我们正在研究机器学习项目,Jupyter Notebook 是一个不错的选择,因为它更容易运行和重新运行几行代码。此外,这些图都在同一个笔记本中。
首先导入所需的库,如下所示:
from requests_html import HTMLSession
import pandas as pd
对于网页抓取,我们只需要 Requests-HTML。主要原因是 Requests-HTML 是一个强大的库,可以处理我们所有的网络抓取任务,例如从网站中提取 HTML 代码并将此代码解析为 Python 对象。进一步的好处来自该库作为 HTML 解析器的功能,这意味着可以使用同一个库执行收集数据和标记。
接下来,我们使用 Pandas 将数据加载到 DataFrame 中以进行进一步处理。
在下一个单元格中,创建一个会话并从您的目标 URL 获取响应。
url = 'http://your-target-url'
session = HTMLSession()
r = session.get(url)
在此之后,使用 XPath 选择所需的数据。如果每一行都表示为一个字典,其中键是列名,那就更容易了。然后可以将所有这些字典添加到列表中。
rows = r.html.xpath('//table/tbody/tr')
symbol = 'AAPL'
data = []
for row in rows:
if len(row.xpath('.//td')) < 7:
continue
data.append({
'Symbol':symbol,
'Date':row.xpath('.//td[1]/span/text()')[0],
'Open':row.xpath('.//td[2]/span/text()')[0],
'High':row.xpath('.//td[3]/span/text()')[0],
'Low':row.xpath('.//td[4]/span/text()')[0],
'Close':row.xpath('.//td[5]/span/text()')[0],
'Adj Close':row.xpath('.//td[6]/span/text()')[0],
'Volume':row.xpath('.//td[7]/span/text()')[0]
})
网页抓取的结果存储在可变数据中。要理解为什么要采取这样的行动,我们必须考虑这些变量是一个字典列表,可以很容易地转换为数据框。此外,完成上述步骤也将有助于完成数据标注这一至关重要的步骤。

提供的示例的数据框尚未准备好进行机器学习步骤。它仍然需要额外的清洁。
清理数据
现在已经使用网络抓取收集了数据,我们需要对其进行清理。这个动作的主要原因是不确定数据帧是否可以接受;因此,建议通过运行来验证所有内容df.info().

从上面的屏幕打印中可以看出,所有列的数据类型为object
. 对于机器学习算法,这些应该是数字。
日期可以使用Pandas.to_datetime
. 它需要一个系列并将值转换为datetime
. 然后可以按如下方式使用:
df['Date'] = pd.to_datetime(df['Date'])
我们现在遇到的问题是,由于逗号分隔符,其他列没有自动转换为数字。
值得庆幸的是,有多种方法可以处理这个问题。最简单的一种是通过调用str.replace()
函数来删除逗号。该astype
函数也可以在同一行中调用,然后返回一个浮点数。
str_cols = ['High', 'Low', 'Close', 'Adj Close', 'Volume']
df[str_cols]=df[str_cols].replace(',', '', regex=True).astype(float)
最后,如果有任何None
orNaN
值,可以通过调用dropna()
.
df.dropna(inplace=True)
作为最后一步,将Date
列设置为索引并预览数据框。
df = df.set_index('Date')
df.head()

数据框现在是干净的,可以发送到机器学习模型。
可视化数据
在我们开始机器学习部分之前,让我们快速浏览一下收盘价趋势。
首先,导入包并设置绘图样式:
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
plt.style.use("ggplot")
接下来,输入以下行来绘制Adj Close
调整后的收盘价:
plt.figure(figsize=(15, 6))
df['Adj Close'].plot()
plt.ylabel('Adj Close')
plt.xlabel(None)
plt.title('Closing Price of AAPL')

为机器学习准备数据
机器学习的第一步是选择我们想要预测的特征和值。
在这个例子中,“Adjusted Close”依赖于“Close”部分。因此,我们将忽略该Close
列并专注于Adj Close
.
特征通常存储在一个名为的变量X
中,我们想要预测的值存储在一个变量中y
。
features = ['Open', 'High', 'Low', 'Volume']
y = df.filter(['Adj Close'])
我们必须考虑的下一步是特征缩放。它用于规范化特征,即自变量。在我们的示例中,我们可以使用MinMaxScaler
. 此类是 Sci Kit Learn 库的预处理模块的一部分。
首先,我们将创建这个类的一个对象。然后,我们将使用以下fit_transform
方法训练和转换值:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X = scaler.fit_transform(df[features])
下一步是将我们收到的数据分成两个数据集,测试和训练。
我们今天使用的示例是时间序列数据,这意味着在一段时间内发生变化的数据需要专门处理。TimeSeriesSplit
SKLearn模块中的功能model_selection
将是我们这里需要的。
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=10)
for train_index, test_index in tscv.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
我们今天的方法是创建一个使用 LSTM 或长短期记忆层的神经网络。LSTM 需要一个 3 维输入,其中包含有关批量大小、时间步长和输入维度的信息。我们需要重塑特征如下:
X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
X_test = X_test.reshape(X_test.shape[0], 1, X_test.shape[1])
训练模型和预测
我们现在准备创建一个模型。从 Keras导入Sequential
模型、LSTM
图层和Dense
图层,如下所示:
from keras.models import Sequential
from keras.layers import LSTM, Dense
继续创建 Sequential 模型的实例并添加两层。第一层将是具有 32 个单元的 LSTM,而第二层将是 Dense 层。
model = Sequential()
model.add(LSTM(32, activation='relu', return_sequences=False))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
可以使用以下代码行训练模型:
model.fit(X_train, y_train, epochs=100, batch_size=8)
虽然可以使用这行代码进行预测:
y_pred= model.predict(X_test)
最后,让我们用以下内容绘制实际值和预测值:
plt.figure(figsize=(15, 6))
plt.plot(y_test, label='Actual Value')
plt.plot(y_pred, label='Predicted Value')
plt.ylabel('Adjusted Close (Scaled)')
plt.xlabel('Time Scale')
plt.legend()
该图显示预测值接近实际值。然而,更重要的是,这些趋势也同样接近。
结论
本教程探讨了 Web 抓取和机器学习协同工作的真实场景。我们编写了一个网络抓取程序,该程序可以以适合机器学习的格式提取数据。然后,我们清理数据,更新其类型,并应用其他预处理技术,使联合工作成为机器学习程序的理想选择。最后,我们创建了一个机器学习模型,该模型使用神经网络来预测股票定价,希望它能够为您提供一个有价值的介绍,让您了解如何将网络抓取用于机器学习。
如果您想了解更多关于代理和高级数据采集工具的工作原理,或者只是想了解特定的网络抓取用例,例如网络抓取职位发布、 使用 Python 进行网络抓取以及构建黄页抓取工具,请查看我们的博客.