网络抓取、正则表达式和数据可视化,用 Python 实现一切

蟒蛇, 搜索, Nov-15-20225 分钟阅读

网络搜刮可定义为从网站收集和重组数据的方法。它也可以定义为以自动化方式获取网站数据的程序化方法。例如,您想提取在 Facebook 上发表评论的所有人的电子邮件 ID。您可以通过以下方法实现

目录

网络搜刮可定义为从网站收集和重组数据的方法。它也可以定义为以自动化方式获取网站数据的程序化方法。例如,您想提取在 Facebook 上发表评论的所有人的电子邮件 ID。有两种方法可以实现这一目的。首先,您可以将光标指向任何人的电子邮件地址字符串。然后将其复制并粘贴到文件中。这种方法被称为手动搜刮。但如果要收集 2000 个电子邮件 ID 怎么办?借助网络搜刮工具,您可以在 30 秒内提取所有电子邮件 ID,而不是使用手动搜刮的 3 个小时。

你可以使用网络搜刮工具从网站上提取信息。您只需知道如何点击,无需编程知识。这些工具节省资源,节约时间和成本。你可以根据自己的需要抓取数百万个网页,而不必担心网络带宽。有些网站采用反机器人技术,阻止搜刮工具收集数据。但是好的网络搜刮工具具有绕过这些工具的内置功能,可以提供无缝的搜刮体验。

用 Python 进行网络抓取

Python 有很好的工具来从网络上抓取数据。例如,您可以导入 requests 库来检索网页内容,导入 bs4(BeautifulSoup) 来提取相关信息。您可以按照下面的步骤用 Python 进行网络搜刮。我们将从网站提取信息。 

进口申请:

您必须导入请求库来获取网站的 HTML。 

进口请求

GET 请求:

您必须向网站发出 GET 请求。您可以将 URL 粘贴到 requests.get() 函数中。

r= requests.get('http://www.cleveland.com/metro/index.ssf/2017/12/case_western_reserve_university_president_barbara_snyders_base_salary_and_bonus_pay_tops_among_private_colleges_in_ohio.html')

提取内容:

使用 r.content 提取网站内容。它以字节为单位提供网站内容。 

c =r.content

导入 BeautifulSoup:

您必须导入 BeautifulSoup 库,因为它能让您轻松地从网页中抓取信息。

bs4导入BeautifulSoup

创建一个汤对象:

您必须从内容中创建一个 BeautifulSoup 对象,并使用多种方法对其进行解析。

soup=BeautifulSoup(c)
print(soup.get_text())

你会得到类似这样的输出结果(这只是一部分)。

提取有用数据:

我们必须找到正确的 CSS 选择器,因为我们需要提取所需的数据。我们可以使用汤对象的 .find() 方法找到网页上的主要内容。

main_content = soup.find('div', attrs = {'class': 'entry-content'})

使用 .text 属性:

我们可以使用汤的 .text 属性从表格中获取文本信息。

content = main_content.find('ul').text
print(content)

我们以字符串形式检索了表格文本。但是,如果我们能提取出文本字符串的特定部分,这些信息将大有用武之地。为了完成这项任务,我们需要使用正则表达式。

Python 中的正则表达式

正则表达式 (RegEx) 是定义搜索模式的模式序列。其基本思想是

  • 定义要在文本字符串中匹配的模式。 
  • 在字符串中搜索返回匹配项。

假设我们想从文本表中提取以下信息。

  • 工资
  • 学院名称
  • 总统姓名

您可以按照以下步骤提取这三项信息。

步骤 01:

导入 re 后,为提取薪金,必须创建薪金模式。使用 re.compile() 方法将以字符串形式提供的正则表达式模式编译成 RegEx 模式对象。此外,还可以使用 pattern.findall() 查找所有匹配项,并以字符串列表的形式返回。每个字符串代表一个匹配项。

导入re
salary_pattern = re.compile(r'\$.+')
salaries = salary_pattern.findall(content)

步骤 02:

重复同样的步骤提取学院名称。制作模式并提取名称。 

school_pattern = re.compile(r'(?:,|,\s)([A-Z]{1}.*?)(?:\s\(|:|,)')
schools = school_pattern.findall(content)
print(schools)
print(salaries)

步骤 03:

重复同样的步骤提取总统姓名。制作图案并提取所需的名字。 

name_pattern = re.compile(r'^([A-Z]{1}.+?)(?:,)', flags = re.M)
names = name_pattern.findall(content)
print(names)

步骤 04:

这些工资看起来杂乱无章,难以理解。因此,我们使用 Python 列表理解将字符串工资转换为数字。我们将使用字符串切分、分割和连接以及列表理解来实现所需的结果。

salaries = ['$876,001', '$543,903','$2453,896'] [int('.join(s[1:].split(',') for s in salaries
[int(''.join(s[1:].split(',')))forsinsalaries]][int(''.join(s[1:].split(',')))forsinsalaries

输出结果如下

Python 中的数据可视化

数据可视化可以帮助你直观地理解数据,从而揭示数据的趋势、模式和相关性。您可以将大量数据转化为图形、图表和其他视觉效果,以识别异常值并获得有价值的见解。

我们可以使用 matplotlib 将数据可视化,如下图所示。

如下图所示,导入必要的库。

importpandasaspd
importmatplotlib.pyplotasplt

创建一个包含学校、姓名和工资的 pandas 数据框。例如,您可以将学校转换为以下数据帧

df_school = pd.DataFrame(schools)
打印(df_school)

输出结果是

同样,您也可以对工资和姓名做同样的处理。

为了使数据可视化,我们可以绘制如下所示的条形图。

df.plot(kind='barh', x = 'President', y ='salary')

输出结果如下

网络搜索为何需要代理?

网络抓取有助于企业提取有关市场洞察力和行业的有用信息,从而提供数据驱动的服务并做出数据驱动的决策。由于以下原因,代理对于从各种网站有效地抓取数据至关重要。

  • 避免 IP 禁止--为了阻止抓取者提出过多请求,商业网站会限制可抓取数据的数量,即抓取率(Crawl Rate)。抓取率会降低网站的速度,使用户难以有效访问所需内容。但是,如果使用足够多的代理来抓取数据,就可以突破目标网站的抓取率限制。这是因为代理服务器从不同的 IP 地址发送请求,因此可以根据需要从网站上提取数据。
  • 允许访问特定地区的内容 - 企业必须监控其竞争对手(网站),以便向特定地理区域的客户提供适当的产品功能和价格。他们可以通过使用带有 IP 地址的住宅代理访问该地区的所有内容。
  • 增强安全性 - 代理服务器通过隐藏用户设备的 IP 地址,增加了一层额外的安全性。

您知道需要多少代理才能获得上述好处吗?您可以使用以下公式计算所需的代理数量:

代理数量 = 访问请求数/抓取率

访问请求的数量取决于以下参数。

  • 刮板从网站上提取信息的频率
  • 用户希望抓取的页面数

另一方面,抓取率受到用户在一定时间内请求次数的限制。有些网站允许每个用户的请求次数有限,以区分自动请求和人工请求。 

在 Python 中使用代理

您可以按照以下步骤在 Python 中使用代理。

  • 您必须导入 Python 的请求模块。
进口请求
  • 您可以创建一个代理池来轮换代理。
代理='http://114.121.248.251:8080
url='https://ipecho.net/plain'
  • 您可以使用 requests.get() 将代理作为参数传递给 URL,从而发送 GET 请求。
page = requests.get(url,
                    proxies={"http": proxy, "https": proxy})
  • 如果没有连接错误,就可以获取请求的 URL 内容。
打印(page.text)

输出结果如下

结论

我们讨论过,我们可以使用网络搜刮从网站中提取数据,而不是使用人工搜刮。网络抓取既节约成本,又节省时间。企业利用它来收集和重组网络信息,以做出数据驱动的决策并获得有价值的见解。使用代理服务器是安全网络搜刮的关键,因为它可以从目标网站上隐藏用户的原始 IP 地址。您可以使用数据中心代理或住宅代理进行网络搜索。但我们更倾向于使用住宅代理,因为它们速度快,不易被发现。此外,我们还可以使用 Python 中的正则表达式来匹配或查找字符串集。这意味着我们可以借助正则表达式从文本中提取任何字符串模式。我们还看到,数据可视化将大量数据转换成图表、图形和其他可视化内容,帮助我们发现数据中的异常情况并识别有用的趋势。