小小千想和您聊一聊

当前位置: 首页> 技术分享> Python教程之Python网络爬虫入门

Python教程之Python网络爬虫入门

  本章学习目标

  l 了解网络爬虫及其应用

  l 了解网络爬虫的结构

  在大数据时代,信息的采集是一项重要的工作,如果只靠人力采集信息,不仅低效繁琐,而且搜集成本也很高。为此,网络爬虫技术就派上了用场,在一些场景中如搜索引擎中爬取收录站点、数据分析与挖掘中对数据采集、金融分析中对金融数据采集等,该技术都应用广泛。另外,网络爬虫还可以应用于监测与分析舆情、收集目标客户的数据等各个领域。本章就带领大家了解网络爬虫及其应用,并了解网络爬虫的结构。

  1.1 Python网络爬虫简介

  网络爬虫又名网络蜘蛛、网络蚂蚁、网络机器人等,顾名思义,网络爬虫可理解为在网络上的爬虫,按照一定的规则爬取有用信息并收录进数据库,该规则就是网络爬虫算法。

  1.1.1 所需技术能力

  本书使用Python语言进行网络爬虫开发,首先Python网络爬虫开发包含的内容较多,需要开发人员具备以下技术能力:

  1. 熟悉Python基础。

  2. 对计算机网络有一定的了解(本书也有相应的讲解)。

  3. 至少熟悉一种Python 网络爬虫框架(本书有详细讲解)。

  4. 熟悉数据库、缓存、消息队列等技术的使用。

  5. 对HTML、CSS、JavaScript有一定的了解。

  6. 至少熟悉一种IDE(本书使用 PyCharm)。

  以上是在学习Python网络爬虫开发之前所需具备的一些技术能力,其中部分内容在本书中有所涉及,但大部分内容还是需要大家事先了解掌握。

  需要注意的是,本书在安装第三方库和框架时,大部分都是在CMD命令框中安装,在PyCharm中的安装较为简单,因此不做涉及。

  1.1.2 选择Python的原因

  目前可以选择多种语言进行网络爬虫开发,如:Python、PHP、C#等等,本书选择Python有以下原因:

  1. Python语言普及度越来越高,甚至已经被纳入我国高考。

  2. Python有非常强大的标准库和第三方库,并且很多著名项目都是用Python完成的,如豆瓣、Google、搜狐、YouTube、Instagram等都选择Python作为Web开发语言。

  3. Python语言简单易学,并且发展时间比较久,非常健壮优雅。

  4. 随着Python的发展,Python在各方面都有应用,如Web、大数据、算法、AI、运维等等方面都有强大的作用。

  1.1.3 选择Python3.X的原因

  本书编写使用最新的Python3.X主要有以下几个原因:

  1. Python2.X已经停止维护。

  2. Python中的第三方库已基本支持Python3.X,满足开发需求。

  3. Python3.X的执行效率更高。

  1.2 初识网络爬虫

  1.2.1 网络爬虫的概念

  网络爬虫是按照指定的规则自动地抓取互联网信息的程序或者脚本。在进行数据分析或数据挖掘时,通过网络爬虫可以根据不同需求有针对性地采集、筛选数据源;每个搜索引擎都有自己的爬虫(如Baiduspider、360Spider、Bingbot等),通过网络爬虫可以更深层次地理解搜索引擎内部的工作原理,从而进一步优化搜索引擎。

  网络爬虫按照系统结构和实现技术,可以分为以下几种类型:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫和深层网络爬虫等[S1] 。

  1. 通用网络爬虫(General Purpose Web Grawler)

  通用网络爬虫又称全网爬虫,其爬取的目标资源在全互联网中。通用网络爬虫的爬行范围和数量巨大,对爬行速度和存储空间要求较高,而对爬行页面的顺序要求相对较低。在门户站点搜索引擎和大型网络服务提供商采集数据中,通用网络爬虫有很高的应用价值。

  通用网络爬虫的结构大致可以分为URL队列、初始URL集合、页面爬行模块、页面分析模块、页面数据库几个部分。通用网络爬虫在爬行时会采取一定的爬行策略,常用的爬行策略有深度优先策略和广度优先策略。

  l 深度优先策略:深度优先遍历是指网络爬虫从起始页开始,依次访问下一级网页链接,处理完这条线路之后再转入下一个起始页,继续依次访问下一级网页链接。当所有链接遍历完后,爬行任务结束。深度优先策略比较适合垂直搜索或站内搜索,但爬行页面内容层次较深的站点时会造成资源的巨大浪费。

  l 广度优先策略:广度优先策略按照网页内容目录层次深浅来爬行页面。首先被爬行的是处于较浅目录层次的页面,当爬行完同一层次的网页后,爬虫继续爬行下一层。广度优先策略能够有效控制页面的爬行深度,避免遇到无穷深层分支时无法结束爬行的问题,实现方便,无需存储大量中间节点,其缺点是需较长时间才能爬行到目录层次较深的页面。

  2. 聚焦网络爬虫(Focused Grawler)

  聚焦网络爬虫又称主题网络爬虫,顾名思义,聚焦网络爬虫是指按照预先定义好的主题有选择性地进行网页爬取的一种爬虫。与通用网络爬虫相比,聚焦网络爬虫只需爬行与主题相关的页面,大大节省了爬虫爬取时所需的硬件和网络资源,但聚焦网络爬虫不适用大范围爬取。

  聚焦网络爬虫相比通用网络爬虫,增加了链接评价模块以及内容评价模块。聚焦爬虫爬行策略实现的关键是评价页面的内容和链接的重要性,不同的方法计算出的重要性不同,由此导致链接的访问顺序也不同。

  3. 增量式网络爬虫(Incremental Web Crawler)

  增量式网络爬虫是指对已下载网页采取增量式更新,只爬行新产生的或已经发生变化的网页,对于未发生内容变化的网页,则不会爬取。增量式网络爬虫在一定程度上能够保证所爬取的页面是尽可能新的页面。

  增量式网络爬虫的体系结构包含本地页面集、待爬行URL集以、本地页面URL集、爬行模块、排序模块及更新模块。增量式网络爬虫有保持本地页面集中存储的页面为最新页面和提高本地页面集中页面的质量两个目标。

  4. 深层网络爬虫(Deep Web Crawler)

  在互联网中,Web页面按存在方式可以分为表层网页和深层网页。表层网页是指不需要提交表单,使用超链接即可到达以静态网页为主构成的Web页面;深层页面则隐藏在表单后面,不能通过静态链接直接获取,是需要提交一定的关键词才能获得的Web页面。在互联网中,深层页面的数量要比表层页面多得多,在爬取深层页面时,需要自动填写好对应的表单。

  深层网络爬虫体系结构由爬行控制器、解析器、表单分析器、表单处理器、响应分析器、LVS控制器等六个基本功能模块及URL、LVS表两个爬虫内部数据结构组成。其中LVS(Label Value Set)表示标签/数值集合,用来表示填充表单的数据源。

  深层网络爬虫的表单填写有两种类型:第一种是基于领域知识的表单填写,就是建立一个填写表单的关键词库,在需要填写时,根据语义分析选择对应的关键词进行填写;第二种是基于网页结构分析的表单填写,这种填写方式一般是在领域知识有限的情况下使用,程序根据网页结构进行分析,并自动地进行表单填写。

  1.2.2 网络爬虫的应用

  网络爬虫的应用非常广泛,它可以进行许多自动化操作。例如,它不仅能爬取网站上的图片、文字、视频等数据,而且能分析网站的用户活跃度、发言数、点赞数、热评等信息。爬虫还用于众多金融投资领域,可自动爬取信息并进行精准投资分析等,如图1.1所示。

  图1.1 爬虫技能图

  下面展示一些网络爬虫实际运用的场景。

  常见的BT(BitTorrent)网站,通过爬取互联网的DHT(Distributed Hash Table,一种分布式存储方法)网络中分享的BT种子信息,提供对外搜索服务。例如http://www.btanv.com/,如图1.2所示。

  图1.2 BT蚂蚁网站首页

  又如一些云盘搜索网站,通过爬取用户共享出来的云盘文件数据,对文件数据进行分类划分,从而提供对外搜索服务,如http://www.pansou.com/,如图1.3所示。

  图1.3 盘搜网站首页

  1.2.3 Robots协议

  Robots协议(也被称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议将搜索引擎抓取网站内容的范围作了约定,包括网站是否希望被搜索引擎抓取,哪些内容不允许被抓取,被抓取到的公开数据是允许被转载的,但是原创数据、个人信息与隐私是不可侵犯的。

  除此之外,Robots协议还可以屏蔽一些网站中较大的文件,如:图片、音频、视频等,节省服务器带宽;屏蔽站点的一些死链接,方便搜索引擎抓取网站内容;设置网站地图连接,方便引导蜘蛛爬取页面。

  robots.txt(统一小写)是一种存放于网站根目录下的以ASCII编码的文本文件,它是Robots协议的具体体现。因为一些系统中的URL对大小写敏感,所以robots.txt的文件名应统一为小写。如果需要单独定义网络爬虫访问网站子目录时的行为,可将自定义的设置合并到根目录下的robots.txt。

  Robots的约束力仅限于自律,没有强制性,搜索引擎一般都会遵循这个协议。除Robots协议以外,网站管理员仍有其他方式拒绝网络爬虫对网页的获取。

  当网站内容有更新时,在robots.txt文件中提供的Sitemap内容可以帮助爬虫定位网站最新的内容,而无需爬取每一个网页,比如网站“http://www.gov.cn/”的Robots协议,如图1.4所示。

  图1.4 政府官网robots.txt

  图1.4中几个重要信息表示如下:

  l User-agent 允许的机器人

  l Allow 允许访问的目录

  l Disallow 禁止访问的目录

  1.3 搜索引擎核心[S2]

  网络爬虫与搜索引擎的关系密不可分,因此本节对搜索引擎的核心技术做一下简单介绍。

  当用户通过门户网站检索信息时,会通过用户交互接口(相当于搜索引擎的输入框)输入关键字,输入完成后通过检索器进行分词等操作,索引器会从索引数据库(对原始数据库进行索引后将数据存储于该数据库)中获取数据进行相应的检索处理。

  用户输入完对应信息后,用户的行为(比如用户的IP地址、Agent类别和用户输入的关键词等)会被存储到用户日志数据库中,随后日志分析器会根据大量的用户数据去调整原始数据库和索引数据库,改变排名结果或进行其他操作。

  在这里需要注意的是,检索是一个动作,而索引是一个属性。例如商店里有大量的商品,为了能够快速地找到这些商品,需要将这些商品分为饮料类商品、电器类商品、日用品类商品、服装类商品等组别,这些商品的组名被称为索引。索引被索引器控制,索引可以大大提升查询效率。

  搜索引擎的工作流程如图1.5所示。


  图1.5 搜索引擎工作流程

  在图1.5中,首先搜索引擎利用爬虫模块去爬取互联网中的网页,然后将爬取到的网页存储在原始数据库中。爬虫模块主要包括控制器和爬行器,控制器主要进行爬虫的控制,爬行器则负责具体的爬行任务。

  1.4 快速爬取网页示例

  本节为大家演示一个爬取网页的简单示例,该例使用urllib库快速爬取千锋教育官网“http://www.1000phone.com”上的网页,关于urllib库的介绍将会以后的章节上详细讲解,这里只展示它的简单用法。具体代码如例1-1所示。

  【例1-1】 爬取网页示例

  1 import urllib.request # 导入urllib.request模块

  2 # 将响应对象赋值给变量phone_file

  3 phone_file = urllib.request.urlopen("http://www.1000phone.com")

  4 # 读取所有内容,以中文方式解码

  5 phone_data = phone_file.read().decode("utf-8")

  6 phone_file = urllib.request.urlopen("http://www.1000phone.com")

  7 # 只读取一行内容

  8 phone_dataline = phone_file.readline()

  9 # 打印所有首页内容

  10 print(phone_data)

  11 # 打印首页一行内容

  12 print(phone_dataline)

  运行该程序,结果如图1.6所示。

  图1.6 千锋教育首页数据

  在例1-1中,首先导入urllib库中的request模块,接着使用该模块中的urlopen()函数打开并爬取网页,最后使用read()函数读取网页全部内容,或readline()函数读取一行内容。

  例1-1只是为了引起大家对爬虫的兴趣,例中提到的知识点以及爬虫模块将会在以后的章节中介绍。

  学习Python开发,可以参考千锋推出的Python学习路线,对从零基础小白到Python初级开发工程师,Python高级开发工程师,后面的Python大神级数据分析师都有一个明确清晰的指导,根据千锋提供的Python学习路线图可以让你对学习Python需要掌握的知识有个清晰的了解,结合千锋Python视频教程学习,快速入门Python开发。

上一篇:HTML5工具初识之网页编辑器

下一篇:认识HTML

QQ技术交流群

千锋Python官方①群
790693323

加入群聊