使用 Beautiful Soup 进行网页抓取
介绍
Web 抓取是从 HTML/XML 内容中提取结构化数据的特定信息的过程。数据科学家和研究人员通常需要从众多网站获取和提取数据,以创建数据集、测试或训练算法、神经网络和机器学习模型。通常,网站会提供API,这是获取结构化数据的最佳方式。但是,有时没有可用的 API,或者您想绕过注册过程。在这种情况下,只能通过网页访问数据。在处理与网站相关的动态数据(如股票、招聘信息、酒店预订、房地产等)时,手动过程可能非常繁琐且耗时,这些数据需要经常访问。Python 通过各种模块提供了一种自动化的方法,可以从网络(URL/URI)获取 HTML 内容并提取数据。本指南将详细介绍使用beautifulsoup模块进行 Web 抓取的过程。
网页抓取流程
抓取过程包括以下步骤:
- 通过 URL 使用请求模块发出请求。 
- 以文本形式检索 HTML 内容。 
- 仔细检查 HTML 结构以确定要从中提取数据的特定 HTML 元素。为此,请在浏览器中右键单击网页并选择检查选项以查看结构。 
在 Safari 中,通过Safari -> 偏好设置 -> 高级 -> 在栏中显示开发菜单启用开发者选项
- 使用BeautifulSoup从响应中查找特定元素并提取文本。
按照Python 中的 Web 请求指南来了解如何使用 Python 发出 Web 请求。
HTML 和 CSS 基础知识
      <!DOCTYPE html>               --> 1
<html>                        --> 2
  <head>                      --> 3
    <title>List of Game Engines</title>
    <style type="text/css">   --> 4
      table, th, td{
        border: solid 2px black;
        border-collapse: collapse;
        border-color: lightgrey;        
        padding: 4px;
      }
      table th{
        color: blue;
        font-size:  20px;
      }
      table td{
        color: green;
        font-size: 25px;
      }
    </style>
  </head>
  <body>                        --> 5
    <div>                       --> 6
      <table align = "center">  --> 7
        <tr>
          <th>Name</th>
          <th>Language</th>
          <th>Platform</th>
        </tr><br>
        <tr>
          <td>Unreal Engine</td>
          <td>C++</td>
          <td>Cross platform</td>
        </tr>
      </table>
    </div>
  </body>
</html>
    
HTML 描述
标签(<tags>)写在菱形括号<>内,可以是成对的(<title>)或不成对的(<br>)
- <!DOCTYPE html>标签代表 HTML5 语法,它支持一些新标签,例如nav、header等。 
- html标签包含HTML内容,也称为根标签。 
- head包括 CSS 样式代码、JavaScript 代码和元标签。 
- CSS 用于装饰内容,可以使用样式标签添加。 
- 所有 HTML 渲染的内容都应放在body标签内。 
- div作为容器来表示屏幕上的某个区域。 
- table标签用于以表格形式呈现数据。th表示粗体标题列,td表示列,tr表示行。有两行,称为兄弟行。 
可以单独创建 CSS 和 JavaScript 文件,并使用链接或脚本标签链接到多个 HTML 页面。
先决条件
Python 拥有丰富的软件包集合,pip工具用于在当前开发环境中管理这些软件包。本指南将使用以下模块:
- 请求:发出网络请求 
- Beautiful Soup:从 HTML 响应中提取数据 
使用以下pip命令安装所需的包:
      pip install beautifulsoup4 requests
    
使用空格在单个安装语句中提及多个模块
数据提取和清理
抓取的第一步是获取数据。因此,为了演示目的,我们将使用游戏引擎列表页面。让我们打开页面并使用检查选项查看结构。
这将打开开发人员工具窗口,其中将显示 HTML 元素结构。有一个id为bodyContent的div,其中包含所有可见的 HTML 元素,如下所示:
- 这是包含有关游戏引擎详细信息的表格标签。 
- 每个tr代表列表中的一个条目并包含列条目。 
- 这是光标,它将突出显示网页上的相应元素,这里它突出显示第二行的第一列,即“4A 引擎”标题。 
- 节点提供所选节点的属性,如id、style等。样式提供有关CSS代码的详细信息,图层提供有关重新绘制内容(如图像等)的详细信息。 
- 属性部分显示类的名称,即wikitable sortable jquery-tablesorter,这是为应用于此表的一组 CSS 样式属性赋予的可自定义名称。 
抓取脚本
现在我们知道了包含数据的具体 HTML 标签,所以让我们直接开始编写代码。
第一步是导入模块。BeautifulSoup用于抓取数据,Requests用于发出HTTP 请求。
      from bs4 import BeautifulSoup # BeautifulSoup is in bs4 package 
import requests
    
发出 HTTP 请求以通过特定 URL 获取 HTML 内容。
      URL = 'https://en.wikipedia.org/wiki/List_of_game_engines'
content = requests.get(URL)
    
创建一个BeautifulSoup对象并定义解析器。
      soup = BeautifulSoup(content.text, 'html.parser')
    
默认解析器是lxml ,与html.parser相比,它更宽松、更快,尽管lxml依赖于平台,而html.parser是 Beautiful Soup 的一部分。
解析器将输入转换为称为标记的单个实体,然后进一步将标记转换为图形或树结构以进行处理。
BeautifulSoup可以提取特定标签的单个或多个出现,也可以接受基于属性的搜索条件,例如:
- 查找:此函数将标签名称作为字符串输入,并从网页响应中返回特定标签找到的第一个匹配项:
      row = soup.find('tr') # Extract and return first occurrence of tr
print(row)            # Print row with HTML formatting
print("=========Text Result==========")
print(row.get_text()) # Print row as text
    
- Findall:使用find_all从页面响应中提取特定标签的所有出现情况,如下所示:
      rows = soup.find_all('tr')
for row in rows:          # Print all occurrences
    print(row.get_text())
    
find_all返回ResultSet的对象,该对象提供基于索引的访问找到的结果,并且可以使用for<font style="vertical-align: inh
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
 
 
 
 
 
                                 
                                     
                                     
                                     
                                     
                                     
                                 
                             
                                     
                                     
                                     
                                     
     
    
 
             
   
        
请先 登录后发表评论 ~