(1-2-01)数据采集:网络爬虫技术(1)

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                        ']

注意:因为清华大学出版社官网中的数据是实时变化的,所以每次执行上述程序后的输出结果会有所不同。

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值