📜  使用Python从维基百科抓取网页——完整指南

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

使用Python从维基百科抓取网页——完整指南

在本文中,您将学习网络抓取的各种概念,并熟悉抓取各种类型的网站及其数据。目标是从维基百科主页抓取数据并通过各种网络抓取技术对其进行解析。您将熟悉各种网页抓取技术、用于网页抓取的Python模块以及数据提取和数据处理的过程。网络抓取是从网络中提取信息的自动过程。本文将为您深入了解网络抓取、它与网络抓取的比较以及您应该选择网络抓取的原因。

Web 抓取和Python简介

它基本上是一种技术或过程,其中来自大量网站的大量数据通过以编程语言编码的网络抓取软件,从而提取结构化数据,这些数据可以最好地保存在我们的设备本地在 Excel 工作表、JSON 或电子表格中。现在,我们不必从网站手动复制和粘贴数据,但抓取工具可以在几秒钟内为我们执行该任务。

网页抓取过程

这有助于程序员为小型和大型项目编写清晰、合乎逻辑的代码。 Python是众所周知的最好的网络爬虫语言。它更像是一个多面手,可以顺利处理大部分的网络爬虫相关流程。 Scrapy 和 Beautiful Soup 是广泛使用的基于Python的框架之一,这使得使用这种语言进行抓取变得如此简单。

用于网页抓取的Python库的简要列表

让我们看看Python中的网络抓取库!

  • Requests (HTTP for Humans) 用于 Web Scraping 的库- 它用于发出各种类型的 HTTP 请求,如 GET、POST 等。它是所有库中最基本但最重要的。
  • 用于网页抓取的lxml 库 – lxml 库提供超快速和高性能的网站 HTML 和 XML 内容解析。如果您打算抓取大型数据集,那么这就是您应该去的地方。
  • Beautiful Soup Library for Web Scraping - 它的工作涉及创建用于解析内容的解析树。一个完美的初学者入门库,非常易于使用。
  • 用于 Web 抓取的Selenium库——最初是为 Web 应用程序的自动化测试而设计的,该库克服了上述所有库面临的问题,即从动态填充的网站中抓取内容。这使得它更慢并且不适合行业级项目。
  • Scrapy for Web Scraping – 所有库的 BOSS,一个完整的 Web 抓取框架,它的使用是异步的。这使得它快速燃烧并提高效率。

实际实现——爬取维基百科

网页抓取的步骤

第一步:如何使用Python进行网页抓取?

  • 我们需要Python IDE,应该熟悉它的使用。
  • Virtualenv是一个创建隔离Python环境的工具。在virtualenv的帮助下,我们可以创建一个文件夹,其中包含所有必要的可执行文件,以使用我们的Python项目所需的包。在这里我们可以在不影响任何全局安装的情况下添加和修改Python模块。
  • 为了我们的目的,我们需要使用 pip 命令安装各种Python模块和库。但是,我们应该始终牢记,我们抓取的网站是否合法。

要求:

  • Requests:它是一个高效的 HTTP 库,用于访问网页。
  • Urlib3:用于从 URL 检索数据。
  • Selenium:它是一个开源自动化测试套件,用于跨不同浏览器和平台的 Web 应用程序。

安装:

pip install virtualenv
python -m pip install selenium
python -m pip install requests
python -m pip install urllib3

安装过程中的示例图像

第 2 步:Requests 库介绍

  • 在这里,我们将学习各种Python模块来从 Web 获取数据。
  • Python requests 库用于下载我们试图抓取的网页。

要求:

  • Python IDE
  • Python模块
  • 请求库

代码演练:

URL: https://en.wikipedia.org/wiki/Main_Page
Python3
# import required modules
import requests
  
# get URL
page = requests.get("https://en.wikipedia.org/wiki/Main_Page")
  
# display status code
print(page.status_code)
  
# display scrapped data
print(page.content)


Python3
# import required modules
from bs4 import BeautifulSoup
import requests
  
# get URL
page = requests.get("https://en.wikipedia.org/wiki/Main_Page")
  
# scrape webpage
soup = BeautifulSoup(page.content, 'html.parser')
  
# display scrapped data
print(soup.prettify())


Python3
# import required modules
from bs4 import BeautifulSoup
import requests
  
# get URL
page = requests.get("https://en.wikipedia.org/wiki/Main_Page")
  
# scrape webpage
soup = BeautifulSoup(page.content, 'html.parser')
  
list(soup.children)
  
# find all occurance of p in HTML
# includes HTML tags
print(soup.find_all('p'))
  
print('\n\n')
  
# return only text
# does not include HTML tags
print(soup.find_all('p')[0].get_text())


Python3
# import required modules
from bs4 import BeautifulSoup
import requests
  
# get URL
page = requests.get("https://en.wikipedia.org/wiki/Main_Page")
  
# scrape webpage
soup = BeautifulSoup(page.content, 'html.parser')
  
# create object
object = soup.find(id="mp-left")
  
# find tags
items = object.find_all(class_="mp-h2")
result = items[0]
  
# display tags
print(result.prettify())


输出:

抓取网页需要做的第一件事是下载页面。我们可以使用Python requests 库下载页面。 requests库将向 Web 服务器发出 GET 请求,该请求将为我们下载给定网页的 HTML 内容。我们可以使用请求发出多种类型的请求,GET 只是其中一种。我们示例网站的 URL 是 https://en.wikipedia.org/wiki/Main_Page。任务是使用requests.get()方法下载它。运行我们的请求后,我们得到一个 Response 对象。这个对象有一个status_code属性,它指示页面是否下载成功。还有一个 content 属性,它将网页的 HTML 内容作为输出。

第三步:Beautiful Soup 页面解析介绍

我们有很多用于数据提取的Python模块。我们将使用BeautifulSoup来达到我们的目的。

  • BeautifulSoup是一个Python库,用于从 HTML 和 XML 文件中提取数据。
  • 它需要一个输入(文档或 URL)来创建一个汤对象,因为它本身无法获取网页。
  • 我们还有其他模块,例如正则表达式、lxml 用于相同目的。
  • 然后我们以 CSV 或 JSON 或 MySQL 格式处理数据。

要求:

  • PythonIDE
  • Python模块
  • 美丽的汤库
pip install bs4

代码演练:

蟒蛇3

# import required modules
from bs4 import BeautifulSoup
import requests
  
# get URL
page = requests.get("https://en.wikipedia.org/wiki/Main_Page")
  
# scrape webpage
soup = BeautifulSoup(page.content, 'html.parser')
  
# display scrapped data
print(soup.prettify())

输出:

正如您在上面看到的,我们现在已经下载了一个 HTML 文档。我们可以使用BeautifulSoup库来解析这个文档并从p标签中提取文本。我们首先必须导入库并创建BeautifulSoup类的实例来解析我们的文档。我们现在可以使用BeautifulSoup对象上的 prettify 方法打印出页面的 HTML 内容,格式很好。由于所有标签都是嵌套的,我们可以一次在结构中移动一层。我们可以首先使用汤的 children 属性选择页面顶层的所有元素。请注意,children 返回一个列表生成器,因此我们需要在其上调用 list函数。

第 4 步:进一步深入研究 Beautiful Soup

使美汤如此强大的三个功能:

  • Beautiful Soup 提供了一些用于导航、搜索和修改解析树的简单方法和 Pythonic 习惯用法:一个用于剖析文档并提取所需内容的工具包。编写应用程序不需要太多代码
  • Beautiful Soup 自动将传入文档转换为 Unicode,将传出文档转换为 UTF-8。除非文档没有指定编码并且 Beautiful Soup 无法检测到编码,否则您不必考虑编码。然后你只需要指定原始编码。
  • Beautiful Soup 位于流行的Python解析器(如 lxml 和 html5lib)之上,允许您尝试不同的解析策略或以速度换取灵活性。然后我们只需以适当的格式处理我们的数据,例如 CSV 或 JSON 或 MySQL。

要求:

  • PythonIDE
  • Python模块
  • 美丽的汤库

代码演练:

蟒蛇3

# import required modules
from bs4 import BeautifulSoup
import requests
  
# get URL
page = requests.get("https://en.wikipedia.org/wiki/Main_Page")
  
# scrape webpage
soup = BeautifulSoup(page.content, 'html.parser')
  
list(soup.children)
  
# find all occurance of p in HTML
# includes HTML tags
print(soup.find_all('p'))
  
print('\n\n')
  
# return only text
# does not include HTML tags
print(soup.find_all('p')[0].get_text())

输出:

我们上面所做的对于弄清楚如何导航页面很有用,但是需要很多命令才能完成一些相当简单的事情。如果我们想提取单个标签,我们可以使用find_all()方法,该方法将查找页面上标签的所有实例。请注意, find_all()返回一个列表,因此我们必须循环遍历或使用列表索引来提取文本。如果您只想查找标签的第一个实例,则可以使用 find 方法,该方法将返回一个BeautifulSoup对象。

第 5 步:使用 Chrome Dev 工具探索页面结构并提取信息

我们需要做的第一件事是使用 Chrome Devtools检查页面。如果您使用其他浏览器,则 Firefox 和 Safari 具有等效项。不过还是推荐使用Chrome。

您可以通过单击View -> Developer -> Developer Tools在 Chrome 中启动开发者工具。您应该在浏览器底部看到一个面板,如下所示。确保“元素”面板突出显示。元素面板将向您显示页面上的所有 HTML 标签,并让您浏览它们。这是一个非常方便的功能!通过右键单击Extended Forecast附近的页面,然后单击Inspect ,我们将在元素面板中打开包含文本Extended Forecast的标签。

通过 Chrome 开发工具进行分析

代码演练:

蟒蛇3

# import required modules
from bs4 import BeautifulSoup
import requests
  
# get URL
page = requests.get("https://en.wikipedia.org/wiki/Main_Page")
  
# scrape webpage
soup = BeautifulSoup(page.content, 'html.parser')
  
# create object
object = soup.find(id="mp-left")
  
# find tags
items = object.find_all(class_="mp-h2")
result = items[0]
  
# display tags
print(result.prettify())

输出:

在这里,我们必须选择具有 id 并包含具有相同类的子元素的元素。例如,id 为mp-left的元素是父元素,其嵌套的子元素具有类mp-h2 。因此,我们将使用第一个嵌套子项打印信息并使用prettify()函数对其进行美化。

结论和深入挖掘网络抓取

我们从维基百科主页学习了各种网页抓取和数据抓取的概念,并通过各种网页抓取技术对其进行了解析。这篇文章帮助我们深入了解了网络抓取、它与网络抓取的比较以及为什么您应该选择网络抓取。我们还了解了网络爬虫的组件和工作原理。

尽管网络抓取为道德目的打开了许多大门,但不道德的从业者可能会无意中抓取数据,这会给许多公司和组织带来道德风险,他们可以轻松检索数据并将其用于自己的自私目的。数据抓取与大数据相结合,可以为公司提供市场情报,帮助他们识别关键趋势和模式,并确定最佳机会和解决方案。因此,预测数据抓取可以很快升级到更好是非常准确的。

网页抓取的用途