1、爬虫概述
爬虫、又被称为网路爬虫,主要指从互联网上进行数据采集的脚本——后者程序,是进行数据分析和数据挖掘的基础。
教程主要从如下几方面对爬虫进行解说明:
- 爬虫基本概念:了解什么是爬虫,对于爬虫程序的定位
- 爬虫的基本操作:了解爬虫程序的开发流程和底层操作
- 爬虫的数据筛选:对爬虫采集的目标数据和有效数据的分析和筛选
- 企业级普通爬虫程序:常规爬虫程序的开发处理流程
- 大数据爬虫程序:分布式爬虫程序的开发处理步骤
- 反爬虫操作:分布在每个章节,针对反爬虫的处理措施进行分析和处理
1.1、爬虫分类
根据项目中的使用情况进行区分,主要分为两大类:通用大虫和聚焦爬虫
根据采集数据的过程进行区分,又可分为两大类型:累积爬虫和增量爬虫
11.1、通用怕成 & 聚焦爬虫
通用爬虫:最常见的数据采集程序,是网络上搜索引擎使用的脚本程序,搜索引擎通过通用爬虫进行互联网上的数据采集,提供给自己的客户进行数据搜索使用;通用爬虫采集的数据具有普遍性,针对性较差;但是通用爬虫的重用性较高,一旦开发调试完成,可以长时间运行给搜索引擎需要的数据
- 最常见的就是百度搜索、谷歌搜索等等各种搜索引擎,一百度搜索为例进行关键词搜索时,点击搜索结果中的百度快照,就可以查看到通用爬虫采集数据的痕迹。
聚焦爬虫:是数据供应商企业使用最多的爬虫程序,通常情况针对指定的范围的数据进行定向的数据采集和筛选,能在一定时间段内最大限度的采集企业需要的有效数据;但是重用性较差,一般针对不同数据需求、需要独立开发爬虫程序进行数据采集
1.1.2、累积爬虫 & 增量爬虫
累积爬虫:目标数据一旦生成,不会发生改动,随着时间的延伸数据量逐渐增大,累积爬虫就是采集这样的数据,采集并保存历史数据之后针对新生的数据进一步获取,采集过程中不会更新历史数据;如采集期权股票的数据、房地产地域价格历史数据等等
增量爬虫:目标数据在需求更改过程中,可能会随时发生变化;历史数据的变动和新增数据都被称为增量,所以针对此类数据采集的爬虫程序,称为增量爬虫;增量爬虫的特点就是在采集数据的过程中随机更新历史数据的同时采集新增数据。如:搜索引擎采集网络数据,网络上的页面数据随时可能发生变化,需要爬虫针对采集的历史数据随时进行更新并采集新增的网页数据。
1.1.3、robot协议
活跃在网络上的数据本身就是需要相关的客户进行访问查看的,所以正常情况下网络客户能查看到的数据爬虫一般都能采集处理;
但是很多情况下有些数据是受到保护的,网站一般发表声明该类型数据被当前网站版权保护,其个人或者单位不能将该网站数据用于其他网站或者商业目的等,就是一种比较常规的限制。
同时在网络上活跃着很多深层网络数据,进行爬虫数据采集的过程中,很有可能会从正常网页中采集到该类型的URl 地址并获取数据,该类型数据极有可能回事涉密数据,如果进行非法访问和采集会——民事责任 / 刑事责任
ROBOT 协议就是针对这样的问题出现的规范和约束,一般稍有安全意识的网站都会有自己的robot协议,协议规范了允许爬虫采集的网站地址列表和禁止访问的地址列表,方便爬虫程序在采集的过程中进行参考使用。
访问(https://ziyuan.baidu.com/robots/index)
1.2、为什么要使用爬虫
爬虫的作用是从网站上采集(下载)数据的,目前市场上流行的下载工具比比皆是,使用爬虫的优势 和使用场景的目的性一定要明确:
爬虫的优势是将下载数据的过程通过编写的程序实现自动化批量处理,但是自动化有两个前提条件:需要编写程序、可以批量处理;这两个前提条件同时也说明了爬虫的使用场景
- 采集数据之前,对目标数据进行分析,并编写程序代码
- 目标数据是批量数据(非单个、极少数量数据),批量数据有自己的组成规律(寻找规律进行爬取)
1.3、爬虫使用注意事项
爬虫技术在一定程度与上还是备受争议的,尤其是聚焦爬虫在数据处理过程中对于目标数据所在的服务器会造成短时间的压力提升;爬虫程序由于程序本身的特殊性,在一定程度上可能会引发对一些网站的恶意攻击行为;爬虫采集数据的过程中对于数据的涉密性区分不是很严格,主要开人工手段进行筛选操作:所以爬虫处理过程中一定注意如下:
- 爬虫采集的目标数据量进行分析
- 爬虫采集的目标数据涉密性进行分析
- 爬虫采集的目标数据的频率进行分析
2、爬虫基础
简单入门掌握学习,熟悉爬虫步骤处理,对于爬虫采集数据有初步认识。
2.1、入门程序
爬虫采集数据,主要采集网站数据,通常情况下操作步骤如下:
- 确定目标网站URL地址
- 对目标URL地址发送请求
- 获取网站返回的响应数据
- 对响应数据进行解析处理
- 得到目标数据
操作过程的伪代码如下:
import 依赖的模块 ——————#引入依赖
url = “目标网站确定的具体url地址” ————#定义目标url
response = request . open (url) ————#f发送请求
html = response . 数据() ————#得到相应的目标数据
content = html 。 解码() ————#解码得到正确的数据
python3中处理采集数据的内置模块主要是urllib,该模块中包含了大量的和爬虫操 作的相关功能模块和函数处理,按照上述步骤进行操作,具体代码编写如下:
#引入需要的依赖模块
from urllib import request
#向服务器发送请求,获取相应对象
response = request.urlopen("http://baidu.com/")
#从相应对象中获取服务器返回的数据
html = response.read()
#获取的数据进行编码处理、打印
print(html.decode())
2.2、URLLIB模块
URLLIB模块是一个高级的 web 交流库,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象。urllib 支持各种 web 协议,例如:HTTP、FTP、Gopher;同时也支持对本地文件进行访问。
urlopen返回对象提供方法:
- read() , readline() ,readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样
- info():返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息
- getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到
- geturl():返回请求的url
详细urllib讲解单独章节~
2.3、数据编码处理
我们通过爬虫程序可以得到网站返回的数据,但是返回的数据在展示过程中,出现了乱码的问题,是因为网站本身有自己的字符编码(通常情况下是“utf-8”’),我们程序在采集完成之后再控制台进行展示的过程中是使用本地默认的编码(windows 一般是gbk、Unix 中一般是utf-8),如果两部分编码不一致,就不出现乱码的问题。
- 网页结构中的编码,一般会定义在<meta charest=" "> 标签中,所以爬虫采集网页数据时可以分成两个步骤进行操作,先采集批量网页中的一个网页查看编码格式,然后在代码中根据指定编码格式进行解码,得到正确数据之后,再进行批量网页数据的采集;这样的操作方式是手工指定编码方式。
#引入需要的依赖模块
from urllib import request
#向服务器发送请求,获取相应对象
response = request.urlopen("https://baidu.com/")
#从相应对象中获取服务器返回的数据
html = response.read()
#获取的数据进行编码处理
get_html = html.decode('utf-8')
# 打印
print(get_html)
但是手工指定编码方式的操作,存在很大的局限性,批量网页处理过程中一旦出现不同编码格式的网页,很容易造成程序异常导致数据遗漏,所以我们可以通过python第三方模块进行目标数据的分析判断,得到一个具体的编码格式,然后通过该检测的编码格式进行数据的解码工作
remark: 通过chardet模块可以直接检测目标数据的编码格式,但是编码格式只是一个检测的概率值,所以在编码解码错误的情况下,需要人工介入进行解码操作
#引入需要的依赖模块
from urllib import request
import chardet
#向服务器发送请求,获取相应对象
response = request.urlopen("https://baidu.com/")
#从相应对象中获取服务器返回的数据
html = response.read()
#获取的数据进行编码处理
encoding = chardet.detect(html).get('encoding')
get_html = html.decode(encoding)
# 打印
print(get_html)
2.4、请求对象的包装
前面的代码中,目标网站的url地址就是一个普通的字符串,通过该字符串可以发起一个具体的请求、但是在网站操作过程中,客户端发送的一个请求可能会包含较多的格式数据如:请求url、请求头、请求体、参数、cookie等等数据;
爬虫操作就是在模拟真实用户的操作,请求的操作可以通过请求对象的方式进行模拟,在python3中的urllib模块下的Request类型,就是一个模拟发送的请求对象。
更新请求头设置 > ip代理请求