Python Web Scraping 简明教程
Python Web Scraping - Data Extraction
分析网页意味着理解其结构。现在,问题来了,它对网络抓取来说为何至关重要?在本章中,让我们详细了解一下。
Web page Analysis
网页分析很重要,因为如果不进行分析,我们就无法知道在提取之后将以何种形式(结构化或非结构化)从该网页接收数据。以下几种方法可以进行网页分析
Different Ways to Extract Data from Web Page
以下方法大多用于从网页中提取数据
Regular Expression
它们是Python中嵌入的高度专业化编程语言。我们可以通过Python re 模块使用它。它也被称为 RE 或正则表达式或正则表达式模式。在正则表达式的帮助下,我们可以为我们希望从数据中匹配的可能字符串集指定一些规则。
如果您想进一步了解常规表达式,请转到链接 [role="bare" [role="bare"]https://www.tutorialspoint.com/automata_theory/regular_expressions.htm ,如果您想进一步了解Python中的re模块或正则表达式,您可以关注 link [role="bare" [role="bare"]https://www.tutorialspoint.com/python/python_reg_expressions.htm 。
Example
在以下示例中,我们在通过正则表达式匹配 <td> 的内容后,将从 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('<td class="w2p_fw">(.*?)</td>',text)
Output
相应的输出将如下所示:
[
'<img src="/places/static/images/flags/in.png" />',
'3,287,590 square kilometres',
'1,173,108,018',
'IN',
'India',
'New Delhi',
'<a href="/places/default/continent/AS">AS</a>',
'.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',
'<div>
<a href="/places/default/iso/CN">CN </a>
<a href="/places/default/iso/NP">NP </a>
<a href="/places/default/iso/MM">MM </a>
<a href="/places/default/iso/BT">BT </a>
<a href="/places/default/iso/PK">PK </a>
<a href="/places/default/iso/BD">BD </a>
</div>'
]
请注意,在以上输出中,您可以看到有关印度国家详细信息,方法是使用正则表达式。
Beautiful Soup
假设我们要从网页中收集所有超链接,那么我们可以使用一个名为 BeautifulSoup 的解析器,可以在 https://www.crummy.com/software/BeautifulSoup/bs4/doc/. 中更详细地了解它。简而言之,BeautifulSoup 是一个用于从 HTML 和 XML 文件中提取数据的 Python 库。它可与请求一起使用,因为它需要一个输入(文档或 url)来创建汤对象,因为它本身无法获取网页。您可以使用以下 Python 脚本来收集网页标题和超链接。
Installing Beautiful Soup
使用 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
Example
请注意,在此示例中,我们正在扩展使用请求 python 模块实现的以上示例。我们使用 r.text 来创建一个汤对象,该对象将进一步用于获取网页标题等详细信息。
第一步,我们需要导入必要的 Python 模块
import requests
from bs4 import BeautifulSoup
在以下代码行中,我们使用请求通过发出 GET 请求来对 URL https://authoraditiagarwal.com/ 发出 HTTP GET 请求。
r = requests.get('https://authoraditiagarwal.com/')
现在我们需要创建一个汤对象,如下所示
soup = BeautifulSoup(r.text, 'lxml')
print (soup.title)
print (soup.title.text)
Lxml
我们将要讨论的用于网络抓取的另一个 Python 库是 lxml。这是一个高性能的 HTML 和 XML 解析库。它相对快速且简单。您可以在 https://lxml.de/. 上阅读更多相关内容
Installing 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
Example: Data extraction using lxml and requests
在以下示例中,我们使用 lxml 和 requests 从 authoraditiagarwal.com 中抓取网页的特定元素 −
首先,我们需要按以下方式从 lxml 库导入 requests 和 html −
import requests
from lxml import html
现在,我们需要提供要抓取的网页的 url
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())
Output
相应的输出将如下所示:
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.