Python爬虫技术初探

网络爬虫·

参考资料:Python爬虫教程(从入门到精通)

网络爬虫(Web Spider 又称为网页蜘蛛,网络机器人),它是一种按照一定的规则自动浏览、检索网页信息的程序或者脚本。网络爬虫能够自动请求网页,并将所需要的数据抓取下来。通过对抓取的数据进行处理,从而提取出有价值的信息。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

Python 爬虫指的是用 Python 语言来编写爬虫程序。除了 Python 外,其他语言也可以编写,比如 Java、PHP 等,不过相比较而言,Python 更为简单和实用。一方面, Python 提供了许多可以应用于爬虫的库和模块;另一方面, Python 语法简单、易读,更适合于初学者学习,因此 Python 爬虫几乎成了网络爬虫的代名词。

学习条件:在学习爬虫技术前,您应该已经熟练掌握了 Python 基础知识,并对前端语言以及 SQL 数据库有基本掌握。当然,如果您对网络通信协议(TCP/IP 或HTTP)有一定的了解,那么对学习 Python 爬虫技术将大有裨益。

爬虫类型·

网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpose Web Crawler)、聚焦网络爬虫(Focused Web Crawler)、增量式网络爬虫(Incremental Web Crawler)、深层网络爬虫(Deep Web Crawler)。 实际的网络爬虫系统通常是几种爬虫技术相结合实现的。

通用网络爬虫又称全网爬虫(Scalable Web Crawler),爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。

聚焦网络爬虫(Focused Crawler),又称主题网络爬虫(Topical Crawler),是指选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。

增量式网络爬虫(Incremental Web Crawler)是指对已下载网页采取增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。

Deep Web 爬虫

Web 页面按存在方式可以分为表层网页(Surface Web)和深层网页(Deep Web,也称 Invisible Web Pages 或 Hidden Web)。

表层网页是指传统搜索引擎可以索引的页面,以超链接可以到达的静态网页为主构成的 Web 页面。

Deep Web 是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的 Web 页面。

Deep Web 爬虫爬行过程中最重要部分就是表单填写,包含两种类型:

(1)基于领域知识的表单填写:此方法一般会维持一个本体库,通过语义分析来选取合适的关键词填写表单。

(2)基于网页结构分析的表单填写: 此方法一般无领域知识或仅有有限的领域知识,将网页表单表示成 DOM 树,从中提取表单各字段值。

抓取类型·

现有聚焦爬虫对抓取目标的描述可分为基于目标网页特征、基于目标数据模式和基于领域概念3种。

基于目标网页特征

基于目标网页特征的爬虫所抓取、存储并索引的对象一般为网站或网页。根据种子样本获取方式可分为:

(1)预先给定的初始抓取种子样本;

(2)预先给定的网页分类目录和与分类目录对应的种子样本,如Yahoo!分类结构等;

(3)通过用户行为确定的抓取目标样例,分为:(a)用户浏览过程中显示标注的抓取样本;(b)通过用户日志挖掘得到访问模式及相关样本。

其中,网页特征可以是网页的内容特征,也可以是网页的链接结构特征,等等。

基于目标数据模式

基于目标数据模式的爬虫针对的是网页上的数据,所抓取的数据一般要符合一定的模式,或者可以转化或映射为目标数据模式。

基于领域概念

另一种描述方式是建立目标领域的本体或词典,用于从语义角度分析不同特征在某一主题中的重要程度。

Python爬虫架构·

Python 爬虫架构主要由五个部分组成,分别是调度器、URL管理器、网页下载器、网页解析器、应用程序(爬取的有价值数据)。

  • **调度器:**相当于一台电脑的CPU,主要负责调度URL管理器、下载器、解析器之间的协调工作。
  • **URL管理器:**包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL,实现URL管理器主要用三种方式,通过内存、数据库、缓存数据库来实现。
  • **网页下载器:**通过传入一个URL地址来下载网页,将网页转换成一个字符串,网页下载器有urllib2(Python官方基础模块)包括需要登录、代理、和cookie,requests(第三方包)
  • **网页解析器:**将一个网页字符串进行解析,可以按照我们的要求来提取出我们有用的信息,也可以根据DOM树的解析方式来解析。网页解析器有正则表达式(直观,将网页转成字符串通过模糊匹配的方式来提取有价值的信息,当文档比较复杂的时候,该方法提取数据的时候就会非常的困难)、html.parser(Python自带的)、beautifulsoup(第三方插件,可以使用Python自带的html.parser进行解析,也可以使用lxml进行解析,相对于其他几种来说要强大一些)、lxml(第三方插件,可以解析 xml 和 HTML),html.parser 和 beautifulsoup 以及 lxml 都是以 DOM 树的方式进行解析的。
  • **应用程序:**就是从网页中提取的有用数据组成的一个应用。

编写爬虫的流程·

爬虫程序与其他程序不同,它的的思维和逻辑一般都是相似的:

  • 获取数据
  • 分析数据
  • 提取数据
  • 保存数据

Python 编写爬虫程序的流程:

  • 先由 urllib 模块的 request 方法打开 URL 得到网页 HTML 对象。
  • 使用浏览器打开网页源代码分析网页结构以及元素节点。
  • 通过 Beautiful Soup 或则正则表达式提取数据。
  • 存储数据到本地磁盘或数据库。

urllib库·

常用方法·

1) urlopen()·

表示向网站发起请求并获取响应对象,如下所示:

1
urllib.request.urlopen(url,timeout)

urlopen() 有两个参数,说明如下:

  • url:表示要爬取数据的 url 地址。
  • timeout:设置等待超时时间,指定时间内未得到响应则抛出超时异常。

2) Request()·

该方法用于创建请求对象、包装请求头,比如重构 User-Agent(即用户代理,指用户使用的浏览器)使程序更像人类的请求,而非机器。重构 User-Agent 是爬虫和反爬虫斗争的第一步。在下一节会做详细介绍。

1
urllib.request.Request(url,headers)

参数说明如下:

  • url:请求的URL地址。
  • headers:重构请求头。

3) html响应对象方法·

1
2
3
4
bytes = response.read() # read()返回结果为 bytes 数据类型
string = response.read().decode() # decode()将字节串转换为 string 类型
url = response.geturl() # 返回响应对象的URL地址
code = response.getcode() # 返回请求时的HTTP响应码

4) 编码解码操作·

1
2
3
4
#字符串转换为字节码
string.encode("utf-8")
#字节码转换为字符串
bytes.decode("utf-8")