深色proxyscrape 徽标

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

蟒蛇, 搜索, 11-02-20225 分钟阅读

Web scraping can be defined as the method of collecting and restructuring data from websites. It can also be defined as the programmatic approach of obtaining website data in an automated manner. For instance, you want to extract the email IDs of all people who commented on a Facebook post. You can do this by

目录

网络搜刮可定义为从网站收集和重组数据的方法。它也可以定义为以自动化方式获取网站数据的程序化方法。例如,您想提取在 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 中的正则表达式来匹配或查找字符串集。这意味着我们可以借助正则表达式从文本中提取任何字符串模式。我们还看到,数据可视化将大量数据转换成图表、图形和其他可视化内容,帮助我们发现数据中的异常情况并识别有用的趋势。