使用 Python 学习网络抓取和数据可视化的入门指南

指南, 蟒蛇, 抓取, Dec-19-20215 分钟阅读

如何快速有效地从网站中提取重要信息?手动提取数据需要花费大量时间。您可以使用网络搜刮,这是一种从网站获取非表格数据或结构不良数据的自动化方法。之后,您可以将数据转换成结构化的可用格式,如电子表格

目录

如何快速有效地从网站中提取重要信息?手动提取数据需要花费大量时间。您可以使用网络搜刮,这是一种从网站获取非表格或结构不良数据的自动化方法。之后,您可以将这些数据转换成结构化的可用格式,如电子表格或 .csv 文件。

通过网络搜索,您可以在线存档数据并跟踪数据变化。企业广泛将其用于不同的目的。例如,在线商店使用它来搜索竞争对手的价格项目和公开网页。然后,他们利用这些信息调整价格。网络搜刮的另一种常见做法是联系人搜刮,在这种情况下,企业会收集电话号码或电子邮件地址等个人数据用于营销目的。 

为什么要使用网络抓取?

为什么有人要从网站上提取大量信息?要理解这一点,请看以下网络刮擦的应用。

  • 研究与开发 - 您可以从网站上收集大量数据集(温度、一般信息等)并对其进行分析,从而开展研究与开发调查。
  • 价格比较 - ParseHub 等企业和服务利用网络搜索从在线购物网站收集数据并比较产品价格。
  • 职位列表 - 您可以使用网络搜索从不同网站收集有关职位空缺和面试的详细信息,并将其列在一个地方。 
  • 社交媒体搜索 - 您可以使用网络搜索从 Instagram、Twitter 等社交媒体网站上收集数据,了解流行趋势。
  • 收集电子邮件地址 - 许多公司将电子邮件作为营销媒介。他们使用网络搜索来收集电子邮件 ID,然后批量发送电子邮件。

使用 Python 进行网络抓取

您可以按照以下步骤从网站上抓取数据。

  • 获取要抓取的 URL
  • 检查页面
  • 查找需要提取的数据
  • 编写代码
  • 运行代码并提取数据
  • 以所需格式存储数据

在 Python 中,我们可以使用以下库进行网络刮擦:

Pandas - Pandas 用于操作和分析数据。您可以使用该库提取数据并以所需格式存储。

Beautiful Soup - 这是一个解析 HTML 和 XML 文档的 Python 软件包。它创建的解析树有助于从网站中轻松提取数据。

Requests - 这是一个简单的 HTTP 库。

我们将利用网站提取 COVID 案例数。之后,我们将分析数据并创建一些可视化图表。

导入图书馆

如下所示,您可以在 Python 中导入 requests 和 BeautifulSoup,以进行网络搜刮。

导入请求 
bs4导入BeautifulSoup

用于抓取数据的 URL

指定要从中抓取数据的网站 URL。您必须使用 requests.get() 方法向指定的 URL 发送 GET 请求。此外,您还必须创建一个 BeautifulSoup 构造函数,该构造函数将接收两个字符串参数,如以下代码所示。

url='https://www.worldometers.info/coronavirus/countries-where-coronavirus-has-spread/'
page= requests.get(url) 
soup= BeautifulSoup(page.text,'html.parser') 
  
data= []

扫描每个元素

通过使用 soup.find_all() 方法,可以抓取 URL'sURL 表中的每个元素。该方法会返回一个对象,该对象提供基于索引的访问,可以使用 for 或 while 循环打印。

data_iterator= iter(soup.find_all('td'))

使用循环

您可以使用 while True 循环,不断重复直到迭代器中有可用数据。

while Truetry: 
        country =next(data_iterator).text
        确认 =next(data_iterator).text
        死亡 =next(data_iterator).text
        大陆 =next(data_iterator).text

对于 "确认 "和 "死亡 "这两列,请确保去掉逗号并转换为 int。 

data.append(( 
            country、 
            (confirmed.replace(', ',''))、 
            (deaths.replace(',',''))、 
            洲
        )) 
    
    除非停止迭代: 
       break

当剩下要遍历的元素数量为零时,将引发 StopIteration 错误。

创建 Pandas 数据框架

运行上述代码后,您就可以从网站上提取数据了。您必须创建一个 Pandas 数据框架来进一步分析数据。在下面的代码中,我们按 COVID 确诊病例数对数据进行了排序。

导入 pandas 库以创建数据帧。

data.sort(key = lambda row: row[1], reverse = True)
将 pandas 导入 pd
df = pd.DataFrame(data,columns=['country','Number of cases','Deaths','Continent'],dtype=float)
df.head()
df['病例数'] =[x.replace(',','') for x in df['Number of cases']])
df['Number of cases'] = pd.to_numeric(df['Number of cases'])
df

您将得到以下输出结果:

要获取有关 Dataframe 的信息,请使用 df.info()。

df.info()

创建死亡率列

我们将创建一个名为 Death_rate 的新列,如下所示。

dff = df.sort_values(by ='病例数',升序 = False)
dff['Death_rate']= (dff['Deaths']/dff['Number of cases'])*100
dff.head()

输出结果如下

使用代理进行网络抓取

代理服务器允许您使用一个唯一的 IP 地址来访问您要抓取的信息。这样,网站就不会看到你的实际 IP 地址,从而让你可以匿名搜刮数据。由于以下原因,您必须使用代理服务器进行网络搜刮。

  • 使用代理池,您可以同时向网络服务器发送多个请求,而不会被禁止。
  • 在代理的帮助下,您可以从特定位置、设备、ISP 和移动网络发出请求。您还可以抓取特定区域或设备显示的内容。
  • 有些网站有 IP 禁止,您可以借助代理服务器规避这些禁止。 

用于网络搜索的代理类型

您可以使用以下两个代理从网站上搜刮数据。

  • 数据中心代理 - 数据中心 IP 地址是服务器 IP 地址。服务器位于数据中心。数据中心代理的主要目的是向您抓取的网站隐藏您的地址。这些代理主要用于抓取商业数据。
  • 住宅代理服务器 -住宅IP 地址比数据中心 IP 地址昂贵,而且难以获得。这些代理服务器允许您选择一个特定的位置,如城市、国家等,并以该地理区域真实用户的身份上网。

使用 Python 进行数据可视化

大家都知道,数据可视化是用图形表示数据或信息。您可以使用图表、地图和图形等可视化工具来理解所表示的数据。让我们看看如何使用数据可视化工具将从网站提取的数据可视化。

导入图书馆

如下图所示,您必须导入以下库才能实现数据的可视化。

importseabornassns
importmatplotlib.pyplotasplt
frompylabimportrcParams

绘制配对图

您可以绘制配对图来展示数据集中的配对关系。您可以使用下面的代码轻松实现该功能,并找出数据中的趋势,以便进行后续分析。

rcParams['figure.figsize'] = 15, 10
frommatplotlib.pyplot import figure
figure(num=None, figsize=(20, 6),dpi=80,facecolor='w',edgecolor='k')
sns.pairplot(dff,hue='Continent')

输出结果如下

绘制条形图

您可以绘制条形图,将分类数据显示为矩形条,并比较数据中不同类别的值。 

sns.barplot(x ="国家",y ="病例数",data = dff.head(10))

输出结果如下

绘制散点图

使用散点图可以了解数值之间的关系。它使用点来表示变量之间的关系。 

sns.scatterplot(x ="病例数",y ="死亡数",色调 ="洲",数据= dff)

输出结果如下

对数据进行分组和排序

在下面的代码中,我们将按大洲对数据进行分组,并按 COVID 个案的数量进行排序。

dfg = dff.groupby(by = 'Continent',as_index = False).agg({'Number of cases':sum,'Deaths':sum})
dfgg = dfg[1:]
df1 = dfgg.sort_values(by = 'Number of cases',ascending = False)
df1['Death_rate'] = (df1['Deaths']/df1['Number of cases'])*100
df1.sort_values(by = 'Death_rate',ascending = False)

输出结果如下

现在,我们将绘制 "大陆 "和 "死亡率 "之间的柱状图,如下图所示。

sns.barplot(x ='大陆',y =' 死亡率',data= df1.sort_values(by='死亡率',升序=False))

输出结果如下

该柱状图显示,在所有国家中,死亡率最高的是南美洲,最低的是澳大利亚。 

导入文本表

安装 texttable,创建一个简单的 ASCII 表格。然后,将其导入为 tt。

!pip install texttable

将 texttable 导入tt

创建文本表对象

您必须创建一个文本表对象,如下图所示。您必须在表格开头添加一个空行作为标题,并对齐各列。

table = tt.Texttable() 

table.add_rows([(None,None, None,None)] + data)table.set_cols_align(('c','c', 'c', 'c',' c'))  # l'表示左对齐,'c' 表示居中 ' r' 表示右对齐 
table.header(('国家'、'病例数'、'死亡数'、'')) 
  
print(table.draw())

在这里,输出结果显示了表格中的部分行。

结论

通过网络刮擦,你可以快速高效地从网站上提取大量数据。您还可以将提取的非结构化数据转换为可用格式,如 .csv 文件。我们看到,通过使用PandasBeautifulSoup 这两个模块,可以从网络上抓取数据。代理可以匿名提取网络数据。您可以使用数据中心代理或住宅代理进行网络搜刮。住宅代理服务器比数据中心代理服务器更可靠,但价格昂贵。此外,我们还可以根据自己的需要进行数据分析,以获得有洞察力的信息。在本文中,我们使用条形图、对图和散点图等数据可视化工具来分析数据。