如何使用 Beautifulsoup 和Python抓取网站?
您有没有想过每天在互联网上创建了多少数据,如果您想使用这些数据怎么办?不幸的是,这些数据不像一些 CSV 或 JSON 文件那样组织得很好,但幸运的是,我们可以使用网络抓取从互联网上抓取数据,并可以根据自己的需要使用它。抓取数据的方法有很多种,其中一种方法是使用BeautifulSoup。
在开始学习 BeautifulSoup 之前,让我们先了解一下什么是网络抓取,以及我们是否应该这样做?
什么是网页抓取?
在外行的术语中,网络抓取是从任何网站收集数据的过程。这就像将数据从网站复制并粘贴到您自己的文件中一样,但会自动进行。在技术方面,Web Scripting 是一种从网站获取大量数据的自动方法。这些数据中的大部分是 HTML 格式的非结构化数据,然后将其转换为电子表格或数据库中的结构化数据,以便可以在各种应用程序中使用。
注意:有关更多信息,请参阅什么是网页抓取以及如何使用它?
网络爬虫合法化
网络抓取的合法化是一个敏感话题,取决于它的使用方式,它可能是福音,也可能是祸根。一方面,使用好的机器人进行网页抓取使搜索引擎能够索引网页内容,提供价格比较服务以节省客户的金钱和价值。但是网络抓取可以重新定位,以满足更多恶意和滥用的目的。网页抓取可以与其他形式的恶意自动化相结合,称为“坏机器人”,这会导致其他有害活动,如拒绝服务攻击、竞争性数据挖掘、帐户劫持、数据窃取等。
现在,在学习了网络抓取的基础知识之后,让我们不要再浪费时间,直接进入 BeautifulSoup 了。让我们从安装开始。
安装
要在 Windows、Linux 或任何操作系统上安装 Beautifulsoup,需要pip包。要检查如何在您的操作系统上安装 pip,请查看 – PIP 安装 – Windows || Linux。现在在终端中运行以下命令。
pip install beautifulsoup4
如果上述方法不适合您,请参阅以下文章以了解更多安装 BeautifulSoup 的方法。
- Beautifulsoup 安装 – Python
检查网站
在抓取任何网站之前,您需要做的第一件事是了解网站的结构。需要这样做才能从整个页面中选择所需的数据。我们可以通过右键单击要抓取的页面并选择检查元素来完成此操作。
注意:我们将在本教程中抓取Python编程页面。
单击检查按钮后,浏览器的开发人员工具将打开。现在几乎所有浏览器都安装了开发人员工具,我们将在本教程中使用 Chrome。
开发人员工具允许查看站点的文档对象模型 (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请求教程
解析 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())
输出:
示例 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 内容中提取一些有用的数据。汤对象包含可以通过编程方式提取的嵌套结构中的所有数据。我们要抓取的网站包含大量文本,所以现在让我们抓取所有这些内容。
首先让我们检查我们要抓取的网页。
按类查找元素
在上图中我们可以看到页面的所有内容都在类entry-content的div下。我们将存储在这个类下找到的所有结果。
例子:
蟒蛇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)
输出:
在上面的例子中,我们使用了find类。此类将查找具有给定属性的给定标记。在我们的例子中,它将找到所有具有类作为条目内容的 div。我们已经从该站点获取了所有内容,但您可以看到所有图像和链接也被抓取。所以我们的下一个任务是只从上面解析的 HTML 中找到内容。
让我们再次检查我们网站的 HTML。
我们可以看到页面的内容在标签下。现在我们必须找到这个类中存在的所有 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)
输出:
我们最终获得了存储在
标签下的所有内容。
通过 ID 查找元素
在上面的例子中,我们已经通过类名找到了元素,但让我们看看如何通过 id 找到元素。现在为了这个任务,让我们抓取页面左栏的内容。第一步是检查页面并查看左栏属于哪个标签。
上图显示左栏位于以 id 为main的 例子: 输出: 现在让我们检查更多页面以获取左栏的内容。 我们可以看到 leftbar 中的列表在 例子: 输出: 请参阅以下文章以获取有关查找元素的详细信息。 在上面的例子中,你一定已经看到,在抓取数据时,标签也会被抓取,但如果我们只想要没有任何标签的文本怎么办。别担心,我们将在本节中讨论相同的内容。我们将使用text属性。它只打印标签中的文本。我们将使用上面的示例,并从中删除所有标签。 示例 1:从页面内容中删除标签 输出: 现在我们已经成功地从我们的第一个网站上抓取了内容。该脚本将在每个系统上运行,直到并且除非网页本身的 HTML 有一些更改。 示例 2:从左栏的内容中删除标签。 输出: 请参阅以下文章以获取有关提取文本的详细信息。 更多关于 BeautifulSoup 的话题 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')
# finding element by id
s = soup.find('div', id= 'main')
print(s)
标签下,类为 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)
中的所有
从标签中提取文本
蟒蛇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)
蟒蛇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)