📜  Python Web爬网-数据提取

📅  最后修改于: 2020-11-07 08:01:33             🧑  作者: Mango


分析网页意味着了解其结构。现在,出现了一个问题,为什么它对刮网很重要?在本章中,让我们详细了解这一点。

网页分析

网页分析非常重要,因为如果不进行分析,我们将无法知道提取后将以哪种形式从该网页接收(结构化或非结构化)数据。我们可以通过以下方式进行网页分析-

查看页面源

这是通过检查源代码来了解网页结构的一种方式。要实现此目的,我们需要右键单击该页面,然后必须选择“查看页面源”选项。然后,我们将以HTML的形式从该网页获取我们感兴趣的数据。但是主要的关注点是空格和格式化,这对我们来说很难格式化。

通过单击检查元素选项来检查页面源

这是分析网页的另一种方法。但是不同之处在于它将解决网页源代码中格式和空格的问题。您可以通过右键单击然后从菜单中选择“检查”或“检查元素”选项来实现。它将提供有关该网页的特定区域或元素的信息。

从网页提取数据的不同方法

以下方法主要用于从网页提取数据-

正则表达式

它们是嵌入在Python中的高度专业化的编程语言。我们可以通过Python的re模块来使用它。也称为RE或正则表达式或正则表达式模式。借助正则表达式,我们可以为要从数据中匹配的可能的字符串集指定一些规则。

如果您想全面了解正则表达式,请转到链接https://www.tutorialspoint.com/automata_theory/regular_expressions.htm,并且如果您想了解有关Python的re模块或正则表达式的更多信息,可以按照以下说明进行操作:链接https://www.tutorialspoint.com/ Python/python_reg_expressions.htm

在下面的示例中,我们将在正则表达式的帮助下将的内容匹配之后,从http://example.webscraping.com刮取有关印度的数据。

import re
import urllib.request
response =
   urllib.request.urlopen('http://example.webscraping.com/places/default/view/India-102')
html = response.read()
text = html.decode()
re.findall('(.*?)',text)

输出

相应的输出将如下所示-

[
   '',
   '3,287,590 square kilometres',
   '1,173,108,018',
   'IN',
   'India',
   'New Delhi',
   'AS',
   '.in',
   'INR',
   'Rupee',
   '91',
   '######',
   '^(\\d{6})$',
   'enIN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc',
   ''
]

请注意,在上面的输出中,您可以使用正则表达式查看有关印度国家/地区的详细信息。

美丽的汤

假设我们要从网页上收集所有超链接,那么我们可以使用一个名为BeautifulSoup的解析器,该解析器可以在https://www.crummy.com/software/BeautifulSoup/bs4/doc/中更详细地了解简而言之,BeautifulSoup是一个Python库,用于从HTML和XML文件中提取数据。它可以与请求一起使用,因为它需要输入(文档或URL)来创建汤对象,因为它本身无法获取网页。您可以使用以下Python脚本来收集网页和超链接的标题。

安装美丽的汤

使用pip命令,我们可以在虚拟环境或全局安装中安装beautifulsoup

(base) D:\ProgramData>pip install bs4
Collecting bs4
   Downloading
https://files.pythonhosted.org/packages/10/ed/7e8b97591f6f456174139ec089c769f89
a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz
Requirement already satisfied: beautifulsoup4 in d:\programdata\lib\sitepackages
(from bs4) (4.6.0)
Building wheels for collected packages: bs4
   Running setup.py bdist_wheel for bs4 ... done
   Stored in directory:
C:\Users\gaurav\AppData\Local\pip\Cache\wheels\a0\b0\b2\4f80b9456b87abedbc0bf2d
52235414c3467d8889be38dd472
Successfully built bs4
Installing collected packages: bs4
Successfully installed bs4-0.0.1

请注意,在此示例中,我们扩展了使用requests Python模块实现的以上示例。我们正在使用r.text创建汤对象,该汤对象将进一步用于获取网页标题之类的详细信息。

首先,我们需要导入必要的Python模块-

import requests
from bs4 import BeautifulSoup

在下面的代码行中,我们使用请求通过发出GET请求对URL进行GET HTTP请求: https ://authoraditiagarwal.com/。

r = requests.get('https://authoraditiagarwal.com/')

现在我们需要创建一个Soup对象,如下所示:

soup = BeautifulSoup(r.text, 'lxml')
print (soup.title)
print (soup.title.text)

输出

相应的输出将如下所示-

Learn and Grow with Aditi Agarwal
Learn and Grow with Aditi Agarwal

xml文件

我们将要讨论的另一个用于Web抓取的Python库是lxml。这是一个高性能的HTML和XML解析库。它相对较快和直接。您可以在https://lxml.de/上了解更多信息

安装lxml

使用pip命令,我们可以在虚拟环境或全局安装中安装lxml

(base) D:\ProgramData>pip install lxml
Collecting lxml
   Downloading
https://files.pythonhosted.org/packages/b9/55/bcc78c70e8ba30f51b5495eb0e
3e949aa06e4a2de55b3de53dc9fa9653fa/lxml-4.2.5-cp36-cp36m-win_amd64.whl
(3.
6MB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 3.6MB 64kB/s
Installing collected packages: lxml
Successfully installed lxml-4.2.5

示例:使用lxml和请求提取数据

在以下示例中,我们通过使用lxml和请求从authoraditiagarwal.com抓取网页的特定元素-

首先,我们需要从lxml库中导入请求和html,如下所示:

import requests
from lxml import html 

现在我们需要提供要剪贴的网页网址

url = 'https://authoraditiagarwal.com/leadershipmanagement/'

现在我们需要提供该网页特定元素的路径(Xpath)

path = '//*[@id="panel-836-0-0-1"]/div/div/p[1]'
response = requests.get(url)
byte_string = response.content
source_code = html.fromstring(byte_string)
tree = source_code.xpath(path)
print(tree[0].text_content()) 

输出

相应的输出将如下所示-

The Sprint Burndown or the Iteration Burndown chart is a powerful tool to communicate
daily progress to the stakeholders. It tracks the completion of work for a given sprint
or an iteration. The horizontal axis represents the days within a Sprint. The vertical 
axis represents the hours remaining to complete the committed work.