返回博客

使用机器学习进行网络抓取

Maryia Stsiopkina

2022-08-30

虽然我们今天所知道的网络抓取已经存在了十多年,但它的意义从未如此深远。目前,使其有用和产生价值的能力几乎适用于所有企业。

下面是一些因素,他们提供了证据,说明为什么对企业来说,网络抓取变得也来越重要:

  • 调度和自动化

  • 快速、低维护的结果

  • 成本效益

  • 实现竞争优势,例如基于数据的市场分析

  • 数据收集以更好地了解客户的需求

还有更多。

主要问题是机器学习将如何影响已经成功的数据抓取技术。

什么是机器学习?

首先,让我们更深入地了解机器学习(ML)的主要功能。作为数据科学的重要组成部分和人工智能的分支,它旨在模仿人类的学习方式。它通过收集数据和使用算法来做到这一点,然后用于在预测及其准确性方面逐步自我改进。

这样的特征是相当方便的,因为它们允许更加不干涉的方法。例如这将使您能够主要通过机器实现特定的给定任务,而不是手工编码各种软件例程或指令。

下一个问题是如何在现实生活中应用 ML 的好处。为了回答这个问题,我们来看一些用例。

客户服务:聊天机器人开始取代人工代理,常见问题经常在没有人工回复的情况下得到回答。Slack 和 Facebook 的虚拟代理就是最好的例子。

新一代住宅代理:由最新的 AI/ML 创新提供支持,允许进行重型的数据提取。这些代理包含基于 ML 的 HTML 解析、AI 驱动的动态指纹、轻松集成、100% 的成功率以及许多其他功能

计算机视觉:人工智能和机器学习技术允许仅从视觉数据中提取有意义的信息,在此基础上可以实现识别任务。这种用途的一个主要例子是自动驾驶汽车中的 ML 集成。

股票交易:实现自动交易,通过每天可能进行数百万次自动交易来优化股票投资组合。

为什么网络抓取对机器学习很重要?

在讨论了机器学习的特性之后,让我们来看看它们是如何在网络抓取中转化的。

首先,ML 中的网络抓取主要处理收集质量数据的问题。

虽然在日常业务中收集的内部信息可以提供有价值的见解,但这样的数据是不够的。因此,从外部来源收集数据是必不可少的,尽管这是一项更为复杂的任务。在抓取时,不准确/差的数据质量成为一个严重的问题,并且您在任何抓取项目中必须始终包括最后的清理步骤,但我们将在本指南稍后更详细地讨论这一点。

使用机器学习进行网页抓取

下面的示例使用网络抓取收集历史股票价格。还将收集开盘价、最高价、最低价和收盘价等数据点。

值得庆幸的是,许多网站都提供了这样的数据,而且通常很方便地以表格的形式呈现。通常,您将看到呈现这些表的 HTML 代码,如下图所示。

带有 HTML 标记的典型股票数据

考虑到这一点,让我们开始网页抓取的第一步。

项目要求

在本博客中,我们将使用 Python 3.9。但是,这段代码也适用于 Python3.7 和 3.8。

这个项目有两套要求。首先是用于网络抓取的库,其次是用于机器学习的库。

对于 Web 抓取,我们需要 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 是一个很好的选择,因为它更容易运行和重新运行几行代码。此外,这些情节都在同一本 Notebook 中。

首先导入所需的库,如下所示:

from requests_html import HTMLSession
import pandas as pd

对于网络抓取,我们只需要 Requests-HTML。主要原因是 Request-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)

最后,如果存在任何 NoneNaN 值,则可以通过调用 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')

绘制 AAPL 调整后的收盘价

为机器学习准备数据

机器学习的第一步是选择我们想要预测的特征和值。

在此示例中,“调整后的收盘价”取决于“收盘价”部分。因此,我们将忽略 Close 列,而关注 Adj Close

特征通常存储在名为 X 的变量中,而我们想要预测的值存储在变量 y 中。

features = ['Open', 'High', 'Low', 'Volume']
y = df.filter(['Adj Close'])

我们必须考虑的下一步是特征缩放。它用于标准化特征,例如自变量。在我们的示例中,我们可以使用 MinMaxScaler。此类是 SciKit Learn 库的预处理模块的一部分。

首先,我们将创建这个类的一个对象。然后,我们将使用 fit_transform 方法对值进行训练和转换,如下所示:

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X= scaler.fit_transform(df[features])

下一步是将我们收到的数据分为两个数据集,测试和训练。

我们今天使用的示例是时间序列数据,这意味着在一段时间内发生变化的数据需要专门的处理。SKLearn 的 model_selection 模块中的 TimeSeriesSplit 函数将是我们在这里所需要的。

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 需要一个三维输入,其中包含有关批量大小、时间步长和输入尺寸的信息。我们需要重塑功能,如下所示:

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 importLSTM, 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()

预测的趋势和价值非常接近。

该绘图显示预测值接近实际值。然而,更重要的是,趋势也同样接近。

结论

本教程探索了网络抓取和机器学习协同工作的真实场景。我们编写了一个网络抓取程序,它可以以适合机器学习的格式提取数据。然后,我们清理了数据,更新了其类型,并应用了其他预处理技术,以使组合工作成为机器学习程序的理想选择。最后,我们创建了一个使用神经网络来预测股票定价的机器学习模型,希望它能为您提供一个关于如何将网络抓取用于机器学习的有价值的介绍。

如果您想了解代理和高级数据采集工具的工作原理,或者只是想了解特定的网络抓取用例,例如构建价格跟踪器使用 Python 进行网络抓取以及抓取电子商务网站,请查看我们的博客。

关于作者

Maryia Stsiopkina

文案

Maryia Stsiopkina 在 Oxylabs 担任一名初级文案。随着她对写作的热情逐渐发展,她在不同的时间点上不是写令人毛骨悚然的侦探故事,就是写儿童童话故事。最终,她发现自己进入了科技仙境,拥有无数隐藏的领域值得他去探索。在业余时间,她用望远镜观鸟(有些人误以为是跟踪,这就是为什么 Maryia 有时会发现自己处于尴尬的境地),制作花卉饰品,并品尝很多泡菜和绿橄榄。

Oxylabs博客上的所有信息均按“原样”提供,仅供参考。对于您使用Oxylabs博客中包含的任何信息或其中可能链接的任何第三方网站中包含的任何信息,我们不作任何陈述,亦不承担任何责任。在从事任何类型的抓取活动之前,请咨询您的法律顾问,并仔细阅读特定网站的服务条款或取得抓取许可。

在这篇文章


  • 什么是机器学习?

  • 为什么网络抓取对机器学习很重要?

  • 使用机器学习进行网页抓取

  • 结论

选择Oxylabs®,业务更上一层楼


隐私政策

oxylabs.cn© 2022 保留所有权利©