1.2 网络爬虫技术
在本章上一节的内容中,讲解了处理网络数据的基本知识,其实接下来将要讲解的爬虫技术也属于处理网络数据范畴。在本节的内容中,将详细讲解开发网络爬虫程序的知识,为读者步入本书后面知识的学习打下基础。
1.2.1 网络爬虫基础
对于网络爬虫这一新奇的概念,大家可以将其理解为在网络中爬行的一只小蜘蛛,如果将互联网比作一张大网,那么可以将爬虫看做是在这张网上爬行的蜘蛛,如果它遇到你喜欢的资源,那么这只小蜘蛛就会把这些信息抓取下来作为己用。
我们在浏览网页时可能会看到许多好看的图片,例如在打开网页http://image.baidu.com/时会看到很多张图片以及百度搜索框。我们用肉眼看到的网页实质是由 HTML代码构成的,爬虫的功能是分析和过滤这些HTML 代码,然后将有用的资源(例如图片和文字等)抓取出来。在现实应用中,被抓取出来的爬虫数据十分重要,通常是进行数据分析的原始资料。
在使用爬虫抓取网络数据时,必须要有一个目标的URL才可以获取数据。网络爬虫从一个或若干初始网页的URL开始,在抓取网页的过程中,不断从当前页面上抽取新的URL,并将URL放入到队列中。当满足系统设置的停止条件时,爬虫会停止抓取操作。为了使用爬取到的数据,系统需要存贮被爬虫抓取到的网页,然后进行一系列的数据分析和过滤工作。
在现实应用中,网络爬虫获取网络数据的流程如下所示:
(1)模拟浏览器发送请求
在客户端使用HTTP技术向目标Web页面发起请求,即发送一个Request。在Request中包含请求头和请求体等,是访问目标Web页面的前提。Request请求方式有一个缺陷,即不能执行JS 和CSS 代码。
(2)获取响应内容
如果目标Web服务器能够正常响应,在客户端会得到一个Response响应,Response内容包含HTML、JSON、图片和视频等类型的信息。
(3)解析内容
解析目标网页的内容,既可以使用正则表达式提高解析效率,也可以使用第三方解析库提高解析效率。常用的第三方解析库例有Beautifulsoup和pyquery等。
(4)保存数据
在现实应用中,通常将爬取的数据保存到数据库(例如MySQL,Mongdb、Redis等)或不同格式的文件(例如CSV、JSON等)中,这样可以为下一步的数据分析工作做好准备。
1.2.2 使用Beautiful Soup爬取网络数据
Beautiful Soup 是一个著名的Python库,功能是从HTML或XML文件中提取数据。在现实应用中,通常在爬虫项目中使用Beautiful Soup获取网页数据。在作者写作本书时,Beautiful Soup的最新版本是Beautiful Soup 4。
1. 安装Beautiful Soup
在新版的Debain或Ubuntu系统中,可以通过如下系统软件包管理命令进行安装:
$ apt-get install Python-bs4
因为Beautiful Soup 4通过PyPi发布的,所以可以通过easy_install或pip来安装。库Beautiful Soup 4对应的包的名字是beautifulsoup4,我们可以通过如下命令进行安装。
easy_install beautifulsoup4
pip install beautifulsoup4
在安装Beautiful Soup后还需要安装解析器,Beautiful Soup不但支持Python标准库中的HTML解析器,而且还支持一些第三方的解析器,例如lxml。根据操作系统不同,可以选择下面的命令来安装lxml:
apt-get install Python-lxml
easy_install lxml
pip install lxml
另一个可以供Beautiful Soup使用的解析器是html5lib,这是一款用纯Python语言实现的解析器。html5lib的解析方式与浏览器相同,可以选择下面的命令来安装html5lib。
apt-get install Python-html5lib
easy_install html5lib
pip install html5lib
2. 使用Beautiful Soup
在下面的实例中,演示了使用BeautifulSoup解析一个网页的过程。实例文件bs03.py的功能是解析清华大学出版社官方网站的主页,具体实现代码如下所示。
源码路径:codes\1\1-2\bs03.py
import urllib.request
from bs4 import BeautifulSoup
url = "http://www.tup.tsinghua.edu.cn/index.html"
page = urllib.request.urlopen(url)
soup = BeautifulSoup(page,"html.parser")
print(soup)
执行后会显示解析后获得的网页代码,如图1-5所示。
图1-5 解析结果的部分解图
在下面的实例中,演示了使用BeautifulSoup解析并获取网页信息的过程。
实例文件bs04.py的功能是,解析并获取清华大学出版社官网中最新的15本Python图书信息,并打印输出这15本Python图书的基本信息。文件bs04.py的具体实现代码如下所示。
源码路径:codes\1\1-2\bs04.py
from urllib.request import urlopen
from bs4 import BeautifulSoup
html=urlopen("http://www.tup.tsinghua.edu.cn/booksCenter/booklist.html?keyword=python&keytm=8E323D219188916A8F")
bsObj=BeautifulSoup(html,"html.parser")
nameList=bsObj.findAll("ul",{"class":"b_list"})
for name in nameList:
print(name.get_text()))
通过上述代码,可以解析清华大学出版社官网中关键字为“python”的图书信息,只是抓取了第一个分页的15本图书的书名。执行后会输出:
Python 3.8从入门到精通(视频... 王英英9787302552116定价:89 元Python机器学习及实践 梁佩莹9787302539735定价:79 元Python案例教程 钱毅湘、熊福松9787302550587定价:39 元Python程序设计 黄蔚 熊福松 9787302550235定价:59 元青少年学Python编程(配套视频... 龙豪杰9787302552123定价:59 元Python机器学习算法与应用 邓立国9787302548997定价:69 元Python 3.8从零开始学 刘宇宙、刘艳9787302552147定价:79.80 元深度学习:从Python到TensorFlo... 叶虎9787302545651定价:69.80 元Python数据科学零基础一本通 洪锦魁9787302545392定价:129 元Python语言程序设计 陈振9787302547860定价:49 元Python爬虫大数据采集与挖掘-... 曾剑平9787302540540定价:59.80 元中学生Python与micro:bit机器... 高旸、尚凯9787302537625定价:49 元Python人工智能 刘伟善9787302547792定价:59.80 元Python数据分析与可视化-微课... 魏伟一、李晓红9787302546665定价:49 元Python程序设计 翟萍、王军锋、9787302544388定价:44.50 元
注意:因为清华大学出版社官网中的数据是实时变化的,所以每次执行上述程序后的输出结果会有所不同。
1.2.3 使用XPath爬取网络数据
在Python程序中,可以使用XPath来解析爬虫数据。XPath不但提供了非常简洁明了的路径选择表达式,而且还提供了超过上百个用于处理字符串、数值、时间的匹配以及节点、序列的内置函数。
1. 安装XPath
XPath是一门在XML文档中查找信息的语言,可以遍历并提取XML文档中的元素和属性。我们可以使用如下命令安装XPath:
pip install lxml
在Python程序中使用XPath时,需要通过如下命令导入XPath。
from lxml import etree
2. 使用XPath
在下面的实例中,演示了使用XPath解析一段HTML代码的过程。实例文件xp01.py的具体实现代码如下所示。
源码路径:codes\1\1-2\xp01.py
from lxml import etree
wb_data = """
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
"""
html = etree.HTML(wb_data)
print(html)
result = etree.tostring(html)
print(result.decode("utf-8"))
执行后会输出:
<Element html at 0x1acbac0b708>
<html><body><div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</li></ul>
</div>
</body></html>
由此可见,XPath会在解析结果中自动补全缺少的HTML标记元素。而在下面的实例中,演示了使用XPath解析HTML代码中的指定标签的过程。
实例文件xp02.py的具体实现代码如下所示。
源码路径:codes\1\1-2\xp02.py
from lxml import etree
wb_data = """
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
"""
html = etree.HTML(wb_data)
html_data = html.xpath('/html/body/div/ul/li/a')
print(html)
for i in html_data:
print(i.text)
执行后会解析出html/body/div/ul/li/a标签下的内容:
first item
second item
third item
fourth item
fifth item
在下面的实例中,演示了使用XPath解析并获取网页数据的过程。
实例文件xp03.py的功能是,解析并获取清华大学出版社官方网站中“重点推荐”的作者信息,并打印输出“重点推荐”的作者信息。文件xp03.py的具体实现代码如下所示。
源码路径:codes\1\1-2\xp03.py
from lxml import etree
html = etree.parse('http://www.tup.tsinghua.edu.cn/booksCenter/books_index.html', etree.HTMLParser())
result = html.xpath('//div[@class="m_b_right"]/p/text()')
print(result)
执行上述代码会打印输出清华大学出版社官方网站中“重点推荐”的作者信息:
['菠萝,本名李治中,清华大学生物系本科,美国杜克大学癌症生物学博士,现担任美国诺华制药癌症新药开发部资深研究员,实验室负责人。爱好科普和公益事业。“健康不是闹着玩儿”公众号运营者之一,“向日葵”儿童癌症公益平台发起者。\r\n ', '\r\n ']
注意:因为清华大学出版社官网中的数据是实时变化的,所以每次执行上述程序后的输出结果会有所不同。