📌  相关文章
📜  如何使用 Beautifulsoup 和Python抓取网站?

📅  最后修改于: 2022-05-13 01:55:51.678000             🧑  作者: Mango

如何使用 Beautifulsoup 和Python抓取网站?

您有没有想过每天在互联网上创建了多少数据,如果您想使用这些数据怎么办?不幸的是,这些数据不像一些 CSV 或 JSON 文件那样组织得很好,但幸运的是,我们可以使用网络抓取从互联网上抓取数据,并可以根据自己的需要使用它。抓取数据的方法有很多种,其中一种方法是使用BeautifulSoup。

在开始学习 BeautifulSoup 之前,让我们先了解一下什么是网络抓取,以及我们是否应该这样做?

什么是网页抓取?

在外行的术语中,网络抓取是从任何网站收集数据的过程。这就像将数据从网站复制并粘贴到您自己的文件中一样,但会自动进行。在技术方面,Web Scripting 是一种从网站获取大量数据的自动方法。这些数据中的大部分是 HTML 格式的非结构化数据,然后将其转换为电子表格或数据库中的结构化数据,以便可以在各种应用程序中使用。

注意:有关更多信息,请参阅什么是网页抓取以及如何使用它?

网络爬虫合法化



网络抓取的合法化是一个敏感话题,取决于它的使用方式,它可能是福音,也可能是祸根。一方面,使用好的机器人进行网页抓取使搜索引擎能够索引网页内容,提供价格比较服务以节省客户的金钱和价值。但是网络抓取可以重新定位,以满足更多恶意和滥用的目的。网页抓取可以与其他形式的恶意自动化相结合,称为“坏机器人”,这会导致其他有害活动,如拒绝服务攻击、竞争性数据挖掘、帐户劫持、数据窃取等。

现在,在学习了网络抓取的基础知识之后,让我们不要再浪费时间,直接进入 BeautifulSoup 了。让我们从安装开始。

安装

要在 Windows、Linux 或任何操作系统上安装 Beautifulsoup,需要pip包。要检查如何在您的操作系统上安装 pip,请查看 – PIP 安装 – Windows || Linux。现在在终端中运行以下命令。

pip install beautifulsoup4

Python BeautifulSoup 安装

如果上述方法不适合您,请参阅以下文章以了解更多安装 BeautifulSoup 的方法。

  • Beautifulsoup 安装 – Python

检查网站

在抓取任何网站之前,您需要做的第一件事是了解网站的结构。需要这样做才能从整个页面中选择所需的数据。我们可以通过右键单击要抓取的页面并选择检查元素来完成此操作。

注意:我们将在本教程中抓取Python编程页面。

python bs4 检查元素



单击检查按钮后,浏览器的开发人员工具将打开。现在几乎所有浏览器都安装了开发人员工具,我们将在本教程中使用 Chrome。

页面的 html bs4

开发人员工具允许查看站点的文档对象模型 (DOM) 如果您不了解 DOM,请不要担心,只需将显示的文本视为页面的 HTML 结构即可。

获取页面的 HTML

在检查页面的 HTML 之后,我们仍然需要将所有 HTML 放入我们的Python代码中,以便我们可以抓取所需的数据。为此, Python提供了一个名为requests的模块请求库是Python的组成部分之一,用于向指定的 URL 发出 HTTP 请求。请求安装取决于 eis 上使用的操作系统类型,任何地方的基本命令都是打开命令终端并运行,

pip install requests

现在让我们使用get()方法发出一个简单的 GET 请求。

例子:

Python3
import requests
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# check status code for response received
# success code - 200
print(r)
 
# print content of request
print(r.content)


Python3
import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# check status code for response received
# success code - 200
print(r)
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
print(soup.prettify())


Python3
import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
# Getting the title tag
print(soup.title)
 
# Getting the name of the tag
print(soup.title.name)
 
# Getting the name of parent tag
print(soup.title.parent.name)
 
# use the child attribute to get
# the name of the child tag


Python3
import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# check status code for response received
# success code - 200
print(r)
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
s = soup.find('div', class_='entry-content')
print(s)


Python3
import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
s = soup.find('div', class_='entry-content')
 
lines = s.find_all('p')
print(lines)


Python3
import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
# finding element by id
s = soup.find('div', id= 'main')
 
print(s)


Python3
import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
# Finding by id
s = soup.find('div', id= 'main')
 
# Getting the leftbar
leftbar = s.find('ul', class_='leftBarList')
 
# All the li under the above ul
content = leftbar.find_all('li')
print(content)


Python3
import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
s = soup.find('div', class_='entry-content')
 
lines = s.find_all('p')
 
for line in lines:
    print(line.text)


Python3
import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
# Finding by id
s = soup.find('div', id= 'main')
 
# Getting the leftbar
leftbar = s.find('ul', class_='leftBarList')
 
# All the li under the above ul
lines = leftbar.find_all('li')
 
for line in lines:
    print(line.text)


输出:

python请求获取

请参阅以下教程以获取有关请求模块的详细且解释清楚的信息。



  • Python请求教程

解析 HTML

获取页面的 HTML 后,让我们看看如何将这些原始 HTML 代码解析为一些有用的信息。首先,我们将通过指定我们要使用的解析器来创建一个 BeautifulSoup 对象。

注意: BeautifulSoup 库建立在html5lib、lxml、html.parser 等HTML 解析库之上,因此可以同时创建BeautifulSoup 对象和指定解析器库。

示例 1:

蟒蛇3

import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# check status code for response received
# success code - 200
print(r)
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
print(soup.prettify())

输出:

搜索对象 bs4

示例 2:

蟒蛇3

import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
# Getting the title tag
print(soup.title)
 
# Getting the name of the tag
print(soup.title.name)
 
# Getting the name of parent tag
print(soup.title.parent.name)
 
# use the child attribute to get
# the name of the child tag

输出:

Python Programming Language - GeeksforGeeks
title
meta

寻找元素

现在,我们想从 HTML 内容中提取一些有用的数据。汤对象包含可以通过编程方式提取的嵌套结构中的所有数据。我们要抓取的网站包含大量文本,所以现在让我们抓取所有这些内容。



首先让我们检查我们要抓取的网页。

find_all bs4 python 教程

按类查找元素

在上图中我们可以看到页面的所有内容都在类entry-contentdiv我们将存储在这个类下找到的所有结果。

例子:

蟒蛇3

import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# check status code for response received
# success code - 200
print(r)
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
s = soup.find('div', class_='entry-content')
print(s)

输出:

找到 bs4

在上面的例子中,我们使用了find类。此类将查找具有给定属性的给定标记。在我们的例子中,它将找到所有具有类作为条目内容的 div。我们已经从该站点获取了所有内容,但您可以看到所有图像和链接也被抓取。所以我们的下一个任务是只从上面解析的 HTML 中找到内容。

让我们再次检查我们网站的 HTML。



find_all bs4 python 教程

我们可以看到页面的内容在

标签下。现在我们必须找到这个类中存在的所有 p 标签。我们可以使用find_all BeautifulSoup 的类。

例子:

蟒蛇3

import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
s = soup.find('div', class_='entry-content')
 
lines = s.find_all('p')
print(lines)


输出:

find_all bs4

我们最终获得了存储在

标签下的所有内容。

通过 ID 查找元素

在上面的例子中,我们已经通过类名找到了元素,但让我们看看如何通过 id 找到元素。现在为了这个任务,让我们抓取页面左栏的内容。第一步是检查页面并查看左栏属于哪个标签。

按 id bs4 查找元素



上图显示左栏位于以 id 为main

标签下现在让我们获取这个标签下的 HTML 内容。

例子:

蟒蛇3

import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
# finding element by id
s = soup.find('div', id= 'main')
 
print(s)

输出:

通过 id bs4 python 教程查找元素

现在让我们检查更多页面以获取左栏的内容。

python bs4 按元素查找

我们可以看到 leftbar 中的列表在

    标签下,类为 leftBarList,我们的任务是找到这个 ul 下的所有 li。

    例子:

    蟒蛇3



    import requests
    from bs4 import BeautifulSoup
     
     
    # Making a GET request
    r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
     
    # Parsing the HTML
    soup = BeautifulSoup(r.content, 'html.parser')
     
    # Finding by id
    s = soup.find('div', id= 'main')
     
    # Getting the leftbar
    leftbar = s.find('ul', class_='leftBarList')
     
    # All the li under the above ul
    content = leftbar.find_all('li')
    print(content)
    

    输出:

    按 id bs4 查找所有元素

    请参阅以下文章以获取有关查找元素的详细信息。

    • Python BeautifulSoup - 查找所有类
    • 如何使用 BeautifulSoup 通过 id 提取 div 标签及其内容?
    • 使用 BeautifulSoup 查找标签的兄弟姐妹
    • 在Python使用beautifulsoup提取属性值
    • BeautifulSoup – 查找
        中的所有
      • 使用 beautifulSoup 查找文本,然后替换原始汤变量
      • BeautifulSoup – 按标签内的文本搜索
      • BeautifulSoup – 使用 CSS 选择器按 CSS 类查找标签

      从标签中提取文本

      在上面的例子中,你一定已经看到,在抓取数据时,标签也会被抓取,但如果我们只想要没有任何标签的文本怎么办。别担心,我们将在本节中讨论相同的内容。我们将使用text属性。它只打印标签中的文本。我们将使用上面的示例,并从中删除所有标签。

      示例 1:从页面内容中删除标签

      蟒蛇3

      import requests
      from bs4 import BeautifulSoup
       
       
      # Making a GET request
      r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
       
      # Parsing the HTML
      soup = BeautifulSoup(r.content, 'html.parser')
       
      s = soup.find('div', class_='entry-content')
       
      lines = s.find_all('p')
       
      for line in lines:
          print(line.text)
      

      输出:

      获取所有文本 bs4 python

      现在我们已经成功地从我们的第一个网站上抓取了内容。该脚本将在每个系统上运行,直到并且除非网页本身的 HTML 有一些更改。

      示例 2:从左栏的内容中删除标签。



      蟒蛇3

      import requests
      from bs4 import BeautifulSoup
       
       
      # Making a GET request
      r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
       
      # Parsing the HTML
      soup = BeautifulSoup(r.content, 'html.parser')
       
      # Finding by id
      s = soup.find('div', id= 'main')
       
      # Getting the leftbar
      leftbar = s.find('ul', class_='leftBarList')
       
      # All the li under the above ul
      lines = leftbar.find_all('li')
       
      for line in lines:
          print(line.text)
      

      输出:

      从标签 bs4 中提取文本

      请参阅以下文章以获取有关提取文本的详细信息。

      • 使用 BeautifulSoup 在标签内显示文本
      • 使用 BeautifulSoup 查找给定标签的文本
      • 如何在Python使用 Beautifulsoup 从 body 标签中抓取所有文本?

      更多关于 BeautifulSoup 的话题

      • Beautifulsoup – nextSibling
      • BeautifulSoup – 移除标签内容
      • BeautifulSoup – 附加到标签的内容
      • 如何删除 BeautifulSoup 中的子元素?
      • BeautifulSoup 中的漂亮打印
      • BeautifulSoup – 修改树
      • 使用 BeautifulSoup 将 HTML 转换为文本
      • 如何使用 BeautifulSoup 修改 HTML?
      • 使用 BeautifulSoup 更改标签的内容并替换为给定的字符串
      • 使用 BeautifulSoup 删除所有样式、脚本和 HTML 标签
      • 使用 BeautifulSoup 在指定标签前后插入标签或字符串
      • 如何在Python解析本地 HTML 文件?
      • 如何在 BeautifulSoup 中使用 Xpath?
      • BeautifulSoup – 将一个元素包装在一个新标签中
      • BeautifulSoup – 仅解析文档的一部分
      • 如何使用Python BeautifulSoup 将输出写入 HTML 文件?
      • 在 BeautifulSoup 中编码
      • 如何使用 BeautifulSoup 抓取嵌套标签?
      • 使用 BeautifulSoup 将 XML 结构转换为 DataFrame – Python

      BeautifulSoup 练习和项目

      • 使用 BeautifulSoup 获取所有 HTML 标签
      • 在Python使用 BeautifulSoup 从给定的 html 文档中查找标题标签
      • 使用 BeautifulSoup 提取所有嵌套在
      • 标签内的 URL
      • 使用 BeautifulSoup 获取所有标题标签的列表
      • BeautifulSoup – 从 HTML 中抓取列表
      • BeautifulSoup – 从 HTML 中抓取段落
      • 如何抓取网站中的所有 PDF 文件?
      • 使用 Requests 和 BeautifulSoup 使用Python下载 PDF
      • 如何在Python从 Google 中提取天气数据?
      • 如何使用Python抓取视频?