【HCIE-BigData-Data Mining课程笔记(三)】预备知识-Python基础
Python基础
文章目录
-
Python入门
-
第一部分:Python概述
- 这是什么?
- 探讨什么是Python
- 关于Python的数据类型
- 判断条件与循环结构的使用
- 函数及其面向对象编程的概念
- 常用的Python模块介绍
- 正则表达式的应用实例
- 文件操作技巧
-
第二章 数据采集
-
- 第一节 爬虫的概念
-
功能与运行流程:了解爬虫的基本原理及其操作步骤。
-
常用工具介绍:列出几种广泛使用的爬虫工具及其特点。
-
数据获取与存储方法:探讨如何从网页上获取所需数据并进行有效存储。
-
防止被抓取的技术及应对策略:分析如何避免被搜索引擎或网站抓取以及相应的防范措施。
-
开发与实现过程:详细描述从设计到实际运行一个完整爬虫程序的过程。
- 三、数据可视化
一、Python
1.什么是Python
Python介绍
●python是一门通用的高级编程语言
●python是完全开源的
●python的作者:Guido Van Rossum
●python的哲学:
python是工程不是艺术
解决一种问题只有一个办法
简单胜过复杂,明了胜于晦涩
Python的相关环境
●python的运行环境主要分为两个大的版本,python2和python3
●python的开发环境
Anaconda:一款集成了许多第三方库的python解释器,在人工智能和科学计算使用广泛
Jupyter Notebook:基于Web页面的交互式计算环境
Pycharm:功能强大的开发环境,集成了许多便捷的功能
Eclipse:使用广泛的开发环境
2.Python基础知识
Python的优点
●python是一门高级的面向对象的编程语言
●python是动态的解释性的语言
python可以在代码运行过程中,为对象添加新的属性或方法
python的程序脚本可以直接运行,不需要预编译
●python拥有优雅的结构和清晰地语法,简单易学
●丰富的第三方库
●python可以调用其他语言所写的代码,又被称为胶水语言
Python适用的领域
数据科学、编写系统工具、与数据库交互、自动化运维脚本、web开发、人工智能
Python的基本语法格式
●python用缩进划分语句块,缩进为4个空格或者一个Tab键,使用时要保持一致
●python适用print()作为输出,适用input作为输入
●import和from...import...可以进行包和模块的导入
●多个语句在一行中,适用“;”进行分隔
●注释符#,多行注释为('''... ''',"""...""")
●可进行函数式编程FP
●PEP8规范(不是强制的)
python代码在书写时遵守的规范,不是语法规则,遵守它可以提高代码的可读性和美观性
Python的变量
●在python中定义变量不需要申明类型,解释器会根据赋值的数据自动分配类型
●定义变量时变量名需要符合规则
由字母、下划线、数字组成,且不能以数字开头
不能与关键字重名,可以import导入keyword后,查看keyword.kwlist来查看关键字有哪些
●在python中可以对多个变量赋值,例如a=b=c=1;也可以为多个对象指定多个变量a,b,c=1,2,3 或者a,b=b,a
●变量根据作用范围可以分为两种。只用于当前代码的局部变量和适用于整体的全局变量,
Python的地址引用
数据在计算机上存储,会得到一个相应的存储地址
给变量赋值,并不是将数据赋予变量,而是而是将数据所在的存储地址赋给了变量 id()可以直接查询到它的地址
python有对象池的概念:
如果有两个小整数变量在(-5,256),它们对应的值是相等的,它们在计算机中的存储地址也是一样的,就不会开辟新的内存地址。
如果是字符串长度小于20,那么也不会申请新的空间。
胶水语言可以使用其他语言的优势弥补自身的缺陷
3.python数据类型
python的内置数据类型
python中常见的数据类型有六种:Number(数值)、String(字符串)、List(列表)、Tuple(元组)、Dictionary(字典)、Set(集合)。
这些数据类型 不仅可以提高python的运行效率,还极大提高开发效率。
并且他们让python的操作变得简单快捷
Number数值
Python3支持int、float、bool、complex(复数)
在Python3中,只有一种整数类型,就是int,表示为长整型
在Python3中,bool继承了int类型,所以也是数值,默认0为faulse,其他都为True,True+1=2
数值为不可以变数据类型
数值类型的基本操作:
加减乘除、取余%、取整//、乘方**
当不同类型的数据进行运算,结果类型为精度较高的类型
String字符串
●python中的字符串是由多个字符组成的有序序列,字符串的个数就是字符串的长度。所以在python中是没有字符的,单个字符被认为是长度为1的字符串。
●声明一个字符串只需要使用单引号('...')或者双引号("...")将内容包住即可,也可以使用三引号('''...''',"""...""")
●在字符串中可以使用转义字符串(\)和原始字符串
●字符串是不可变的,即被定义后不可以修改
字符串的常用操作:
获取字符串中的字符元素:
因为字符串是个有序序列,所以我们访问字符串中时某些元素时,可以根据元素对应的下标来访问:str[n]。正向访问时下标从零开始,到字符串长度减一。逆向访问时,从负一开始,每次递减一。
批量获取str[a:b:c] a是起始元素的位置,b是终止元素的位置,c是步长
拼接:
字符串相加"a"+"b"=>"ab"
字符串乘数字“a”*2=>"aa"
str.join(iter) 将所给参数中的每个元素以指定的字符连接生成一个新的字符串
替换:str.replace(str1,str2):将字符串中的str1替换为str2生成新的字符串
‘python’.replace('py','PY')输出PYthon
切割:str.split(str1)以str1为分隔符对字符串进行切割
'python'.split('h')输出['pyt','on']
小写:str.lower()将字符串中的大写字符转化成小写
‘PYTHON’.lower()输出'python'
大写:str.upper():将字符串中的小写字符转化为大写
'python'.upper()输出‘PYTHON’
格式化输出:
python的字符串支持格式化输出,即将字符串中的数据按照我们所需要的形式进行输出
print('My name is %s and age is %d' !' % ('AI',63))
输出为My name is AI and age is 63!
List(列表)
●列表是一个有序的序列
●列表中可以随时进行元素的添加和删除
●列表是可变的,它的元素可以是任何数据类型
●列表由一个中括号裹住元素,元素用逗号隔开。
●创建列表的方式:
List=list(obk1,obj2,...)
List=[obj1,obj2,...]
列表推导式
列表的常用方法
▼列表为有序序列,获取元素的方式和字符串一样
▼添加:
list.append(obj):将参数内的对象添加至列表的尾部
list.insert(index,obj):将对象插入到列表的index位置
list.extend(iter):将可迭代对象的每个元素逐个插入列表的尾部
▼删除:
list.pop([index]):删除下标为index的元素,并将其返回(不传参数,默认删除最后一位元素)
list.remove(obj):删除列表中第一个出现的给定元素
▼+,*的运算符操作和字符串是相同的
▼位置查找:liste.index(obj):返回给定元素第一次出现位置的下标
▼排序:list.sort() 对列表进行排序,默认升序
▼逆序:list.reverse():将列表中的元素进行逆置
▼数量统计:list.count(obj) 返回给定元素出现的次数
touple元组
●元组是一个有序序列
●元组是不可变的,所以在定义时就要确定元组内的元素
●元组因为其不可变性,所以相比于列表而言数据更安全
●元组由一个小括号包裹,元素用逗号隔开,声明一个元组有三种方式:
Tuple=tuple(obj1,obj2,...)
Tuple=(obj1,obj2,...)
Tuple=obj1,obj2,obj3
●如果在声明元组时元组只有一个元素,需要在元素后面加上逗号,告诉解释器这不是运算符号中的括号
元组常用操作个实现方法
▼由于元组的不可变性,所以元组并没有添加删除和修改等方法。但是元素的不可变是相对的,如果元组中的某个元素是可变的,那么在不删除这个元素的情况下可以对这个元素进行修改
A=(1,[0,1]);A[1][0]=1;print(A) 输出(1,[1,1])
▼由于元组是一个有序的序列,所以它的元素获取方式和字符串以及列表是一样的
▼+,*和字符串相同
Dictionary字典
●字典是一个无需可变的序列
●字典的每个元素由两部分组成-键和值,所以字典的元素也被称为键值对。其中键是不可变且唯一的,如果字典有相同的键,则后面的键对应的值会将前面的值覆盖
●字典由一对花括号包裹,元素由逗号隔开。常见字典的创建方式:
Dict={key:value,}
Dict=dict(key=value,)
Dict=dict([(key,value),])
字典推导式
字典的常用操作和实现方法
▼获取元素:
dict.get(key,default=None)/dict[key]:获取key对应的value,前者在访问不存在的key时不会报错,会返回设置的默认值(default)
dict.items():返回一个包含所有(键,值)元组的列表
dict.keys():返回一个包含所有字典key的列表
dict.values():返回一个包含字典所有value的列表
▼添加:
dict[key]=value
▼更新:
dict.update(dict1):使用dict1来对字典进行更新
▼删除:
dict.pop(key)删除并返回key对应的值
dict.popitem()随机删除出并返回一个键值对
dict.clear()清空字典
Set集合
●集合是一个无序的可变序列
●集合中的元素是唯一的,重复的元素会被删除
●集合是一个由花括号包裹,内部元素以逗号隔开。声明一个集合的方式有
Set=set()
Set={obj1,obj2,...}
集合的常用操作
▼添加
set.add(obj):如果元素已存在,则不会进行任何操作
set.update(obj):添加对象可以是列表,字典,且可以是多个,用逗号隔开
▼删除
set.remove(obj)/set.discard(obj):如果删除元素不存在,前者会报错
set.clear():清空集合
set.pop():随机删除一个元素
▼逻辑运算
交集se1t&set2:两个集合中相同的元素
对称差集set1^set2:两个集合中不同的元素
并集set1|set2:两个集合内总共的元素(重复的删除)
差集set1-set2:集合二比集合一中不存在的元素
▼不可变集合
frozenset():不可被改变的集合
数据类型的公共方法
●len(obj):返回数据的长度
●type(obj):返回数据的类型
●enumerate(iter):返回一个可迭代对象,对象中元素为下标个数据组成的元组
●id(obj):返回数据所在内存中的从存储位置
●in(obj):判断数据是否在给定的数据之中
●max(obj)/min(obj):返回数据中的最大/最小值
●del(obj):删除对象
●类型转化:str(),list(),tuple(),set(),dict(),int(),float()
深拷贝和浅拷贝
●在Python中对于数据的拷贝可以根据拷贝形式的不同分为深拷贝和浅拷贝
●浅拷贝(copy()),即对数据的表面结构进行拷贝,如果数据为嵌套的结构,则嵌套结构里面的元素是对之前数据的引用。修改之前的数据会影响拷贝得到的结果
●深拷贝,解决了嵌套结构中深层结构只是引用的问题,它会对所有的数据进行一次复制,修改之前的数据不会改变拷贝得到的数据
●实现深拷贝:导入Python中的copy模块,使用模块中的deepcopy()方法
4.判断与循环语句
判断语句
该语言中的条件控制机制是基于条件语句的结果(True/False)来触发相应指令集合的过程
该编程语言采用if语句作为基础来进行程序流程控制。当需要处理多个条件时,则通常会结合elif和else关键字实现多分支逻辑。
x=input();
if int(x)<18:
print('未成年')
elif int(x)>=18and int(x)<55
print('青壮年')
else:
print('老年')
循环语句 while
● Python语言中的 while 语句用于实现循环结构,在特定条件下反复执行指定代码段
● 如果 while 语句的条件始终为真,则该循环将无限进行下去
● 在某些情况下,在 while 语句的 else 块中可以安排相应的代码执行
● 为了避免不必要的资源浪费,在编写使用 while 循环的代码时应尽量避免出现空循环的情况
count=0
while count<5:
print(count,'小于5')
count=count+1
else:
print(count,"大于或等于5")
循环语句for
●Python中的for循环与传统循环存在显著差异。其基本功能是遍历可迭代对象中的各项元素
●该结构允许在其结束后自动执行特定操作(无需手动添加)
●当完成所有循环体后会自动执行else块内的代码(无需提前添加关键字)
for x in ['java','c','python','c++','c#']:
print(x+'是最好的语言')
else:
print('循环结束')
循环终止 break 和 continue
● 当执行循环时,若需中断循环可采用 break 与 continue 指令
● 采用 break 指令可立即终止当前循环并使与之相关联的 else 块不再执行
● 如果在嵌套循环中使用 break 指令会终止内部所处的那个循环层, 并开始执行下一行代码
● 通过 continue 指令可跳过当前循环剩下的所有指令并直接进入下一轮次
● 两者均可应用于 while 及 for 类型的所有循环结构
for x in ['java','c','python','c++','c#']:
print(x+'是最好的语言')
if x=='python':
break
else:
print('循环结束')
5.函数和面向对象
什么是函数
●函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段
●函数能提高应用的模块性,和代码的重复利用率
●python提供了许多内建函数,比如print()。也可以自己创建函数,这被叫做用户自定义函数。
函数的定义与调用
●定义:
▼在python中用关键字定义def声明函数,后面跟函数名和小括号,括号内可以放置所需参数
▼函数体中第一行可以选择性地使用文档字符串,存放函数说明
▼函数内容以冒号起始,并且缩进
▼return标志着函数的结束,用于返回一个函数执行的结果
●函数名加小括号即可调用,可在括号内传入所需的参数
def mysum(x,y):
return x+y
mysum(1,2)
函数中的返回值
●函数可以根据返回值分为有返回值函数和无返回值函数
●无返回值:函数体中没有return,函数返回None值
●有返回值:函数体中有return语句,并且返回了相应的表达式或数值
●Python中函数可以有多个返回值(不是return多次,而是一个return后跟多个返回值),默认以元组的形式返回
函数中的参数
函数中参数的类型:
必备参数:必备参数须以正确的顺序传入函数,调用时的数量必须和声明时的一样。
关键字参数:函数调用时使用等号赋值的形式传入参数
默认参数:调用函数时,缺省参数的值如果没有传入,则被认为是默认值
不定长参数:有时可能需要一个函数能处理比当初声明时更多的参数,这些参数叫做不定长参数,声明时不会命名。args,kwargs:加了单星号(*)的变量会存放所有未命名的变量参数,加了双星号的变量,会存放命名参数。
匿名函数
●python中除了def可以创建函数外,还提供了lambda来创建匿名函数。相比于普通函数而言,匿名函数有以下特点:
▼lambda只是一个表达式,函数体比def简单很多
▼lambda不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去
▼lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数
●定义匿名函数
f=lambda x:x+1
面向对象和面向过程
●面向对象和面向过程是程序中两种常见的思维模式
●面向对象:把数据和对数据的操作方法放在一起,作为一个相互依存的整体——对象。把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
●面向过程:把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
面向对象的优势
●提高代码的复用性
●使程序的编码更加灵活,提高代码的可维护性
●提高程序的可扩展性
●提高开发效率
面向对象的术语
●类:类是作为设计蓝图来创建对象的代码段,它描述了对象的特征,该对象具有什么属性,怎样使用对象完成一些任务,它对事件进行怎样的响应等
●对象:对象是类的一个实例,通常通过调用类的一个构造函数来创建它
●方法:方法是在类中定义的函数,一般而言,一个方法描述了对象可以执行的一个操作
●属性:属性是类中定义的变量,类的属性突出刻画了对象的性质或状态
●封装:是一个概念,它的含义是把方法、属性、事件集中到一个统一的类中,并对使用者屏蔽其中的细节
●继承:继承是一种创建类的方法,在现有类(被继承的类)基础上,进行扩展生成新的类,被称为子类。被继承的类称为父类、基类、超类
●多态:一个同样的函数对于不同的对象可以具有不同的实现
python中的面向对象
●python是一门面向对象的编程语言,语言中内建了面向对象的特性
●在python中万物皆对象
●python中支持多继承
●python中创建类的方式如下
class 类名(父类)
类体
python中类的私有化
●默认情况下,属性在python中都是public,类所在模块和导入了类所在模块的其他模块都可以访问到。如果类中的某些属性不想被外界访问或者继承可以对其进行私有化
●模块级的私有化:在属性或方法前加一个下划线即可。防止模块的属性用"from mymodule import"来加载,使它只可以在本模块中使用。
●完全私有化:只能自己访问。在方法或属性前加双下划线。(Python中的完全私有化是一个假的私有化。它的作用其实是将之前的属性或方法名改为‘_类名__属性/方法’)
6.Python常用模块
sys
●sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python运行时的环境
●常用属性及方法:
sys.argv:获取从程序外部的参数
sys.exit():程序运行中退出
sys.path():获取python模块搜索路径的值
sys.platform:获取系统运行平台
sys.stdin/stdout/stderr:系统的标准输入输出、错误
os
●os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口
●常用方法及属性
os.path.basename():返回一个路径中的文件名
os.path.dirname():返回一个文件路径
os.environ:包含环境变量的映射关系,os.environ["HOMEPATH"]可以得到环境变量HOMEPATH的值
os.chdir(dir):改变当前工作目录
os.getcwd():得到当前目录
time
●time模块是python中处理时间的一个重要模块,包含了许多的有关时间操作的方法
●常用方法:
time.sleep(secs):线程休眠指定时间后继续运行
time.strftime(format[,t]):将指定的struct_time(默认为当前时间),根据指定的格式化字符串输出
time.time():返回当前时间的时间戳
time.localtime([secs]):将一个时间戳转换为当前时区的struct_time
datetime
●datetime是python中关于日期时间操作模块,内置了诸多关于日期时间转化和计算的方法
●datetime库中的操作主要是对其中四个类的操作
datetime.date:日期类
todya():获取今天的日期
strftime(format):格式化为需要的时间格式
timple():将日期转成struct_time格式
fromtimestamp(timestamp):将时间戳转化为date对象
datetime.time:时间类
datetime.time.(format):格式化输出
datetime.datetime:时间日期类
now():返回当前日期时间对象
ctime():返回日期时间字符串
date():返回日期对象
time():返回时间对象
datetime.timedelta:时间计算类
d1-d2:返回两个日期之间的timedelta
days():返回两个日期之间的天数
total_seconds():返回总秒数
NumPy
●NumPy是一个科学计算工具包,最常用的是它的N维数组对象,其他还宝库一些成熟的函数库,用于整合C/C++和Fortran代码的工具包,线性代数、傅里叶变换和随机数生成函数。NumPy提供了两种基本的对象:ndarray和ufunc。ndarray是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数
●特点:
高效矩阵与数组处理
丰富的数值计算函数
实用的线性代数、傅里叶变换和随机数生成函数
●np.zeros(shape,dtype=float,order='C'):创建一个形状为shape的全零数组。dtype为数据类型。order=C代表与c语言类似,行优先;order=F代表列优先
●np.full(shape,fill_value,dtype=None,drder='C'):生成一个fill_value填充的数组
●np.linspace(start,stop,num=50,enapoint=True,restep=False,dtype=None,axis=0):生成一个等等间隔的数组,start起始值,stop终止值,num数量,endpoint=True表示stop为最后一个值
●np.array(object,dtype=None,copy=True,order='K',subok=False,ndmin=0):生成一个数组
Pandas
●pandas全名Python Data Analysis Library,是基于NumPy的一种工具,还可以结合matplotlib来使用。该工具是为了解决数据分析任务而创建的。
▼Pands纳入了大量库和一些标准的数据模型,提供了高效地从操作大型数据及所需要的工具
▼Pandas提供了大量能使我们快速便捷处理数据的函数和方法,比如数据读取,索引切分,分组,时间序列,重塑,合并
▼对各类数据的读取,包括csv,json,excel,txt,api,html,数据库等;可以把数据高效简单存储成多种格式,包括hdf5,csv,excel
●pandas.Series:生成一个Series数据。
●pandas.DataFrame:生成一个DataFraem数据
●DataFrame.head(n=5);显示前n条数据,n表示显示的数据量
●DataFrame.tail(n=5):显示底部数据,n表示显示的数据量
●DataFrame.loc:按标签或布尔数组访问一组行和列
matplotlib
●matplotlib是一个基于Python的开源2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形,且效率极高
●通过matplotlib,开发者可以仅需要几行代码,便可以生成绘图,包括直方图,功率谱,条形图,错误图,散点图等,操作简单,图形灵活个性化
●文档完善,语法简洁,案例丰富,个性化程度高
7.正则表达式
正则表达式
●正则表达式在诸多编程语言中都是较为重要的一部分。它是一个由特殊字符组成的字符串,这个特殊的字符串描述了匹配一系列字符的规则
●正则表达式为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础
●Python中通过re模块来实现正则表达式
正则表达式的执行流程
●大致的匹配过程是:依次将文本中的字符和正则表达式做匹配,如果所有字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败





8.文件操作
文件读写
●Python内置了读写文件的函数
●函数open()返回文件对象,通常的用法需要三个参数:open(filename,mode,encoding)
filename:包含了你要访问的文件名称的字符串值
mode:决定了打开文件的模式
encoding:打开文件的编码格式,默认utf8
示例:f=open(“workfile”,“r”,encoding=“utf8”) 以只读的方式打开文件workfile,编码格式为utf8
文件打开模式

文件常用操作函数
●f.write(str):写入字符串
●f.read([size]):读数据,size表示读出多少字节的数据,没有size则全部读出
●f.readline():读一行,到文件结尾,返回空串;f.realines()按行读取全部,返回一个list,list中的每个元素表示一行数据,包含“\n”
●f.tell():返回当前文件读取位置
●f.seek(off,where):定位文件读写位置。off表示偏移量,正数向结尾移动,负数向开头移动。where为0表示起始位置开始,1表示当前位置,2表示结尾位置
●f.flush()刷新缓存
●f.close关闭文件
注意事项
●打开文件进行读写时,在操作完毕后一定要进行关闭。因为文件关闭之前,数据存在于缓存之中,使用flush刷新缓存会将数据清除。
●长时间的打开不关闭文件,有可能会引发异常
●可以使用with打开文件,这会使文件在读写完成后自动关闭
with open(filename,mode,encoding) as f:#文件操作语句
二、数据采集
1.什么是爬虫
爬虫介绍
●爬虫可以帮助我们在互联网上自动的获取我们所需要的数据和信息
●爬虫的本质是一段程序
●爬虫又被称为网页蜘蛛,网络机器人
●爬虫可以根据用途分为两类:
聚焦爬虫:针对特定的网站
通用爬虫:通常指搜索引擎的爬虫
爬虫为什么可以获取数据
●爬虫可以通过模拟浏览器发送网络请求,接收请求响应
●爬虫可以按照一定规则,自动抓取互联网信息
●浏览器访问网络过程如下

爬与偷
●由于某些需求,我们要获取某个网站的大量 数据,但是我们却不想一条条的去获取,所以我们可以使用爬虫帮助我们去批量获取。这个过程我们称为爬取数据。我们所爬取的数据本就是网站展示的免费数据,是合法的
●当爬虫程序绕过网站的一些权限和安全机制去获取一些受保护或者付费数据时,则为偷取数据,是违法的
爬虫常见术语
●JSON:(JavaScript Object Notation)是一种轻量级的数据交换格式,它使得人们很容易地进行阅读和编写,同时也方便了机器进行解析和生成。格式相思雨Python中的字典,小巧轻便使用广泛
●XML:传输和存储数据的一种格式,过于笨重,逐渐被json取代
●HTML:超文本标记语言,是常用的网站前端页面编写语言
●Ajax:是一种动态的网页加载技术
●JavaScript(JS):是一种脚本语言,常用于网页的动态效果和数据加载
2.爬虫的作用及工作流程
爬虫的工作流程
●URL:统一资源定位符,俗称网址
●http,https:传输协议
●爬虫的工作过程大概可以总结为:发送请求->获取响应->提取数据

请求

●请求:
请求行:请求方法字段、URL和HTTP协议版本
请求头:User-Agent,主机地址Host
空行:发送换行符,通知服务器以下不再有请求头
请求体:我们发送的请求数据(这一部分数据并不是每个请求必须的)
●请求方法:
get:参数放置在URL里面
post:参数放在请求体里面
响应

●响应:
状态行:协议版本,状态码,状态码描述
响应头:与请求头类似,附加了一些其他信息
空行:发送换行符,通知服务器以下不再有响应头
响应体:包含了我们所请求的数据
●常用状态码
200:请求成功
301:重定向
403:拒绝访问
404:未找到
3.爬虫常用的工具
请求和响应库:http.client,urllb,requests
http.client:该模块定义了HTTP和HTTPS协议的客户端的类。通常不直接使用,是一个非常底层 的模块。在Python2中该模块名称为httplib
urllib:可以处理url组件的集合。它的底层实现为http.client在Python2中,该模块的名称为urllib2
requests:requests的底层实现为urllib模块,它是一个优雅而简单的PythonHTTP库,非常人性化。在Python2和Python3中没有什么差异。是目前广受欢迎的Python库
requests模块的常用方法:
requests.get(url,[headers=],[prams=],[proxies=])使用get方式发送请求,得到响应response对象
requests.post(url,[header=],[data=],[proxies=])使用post方法发送请求,得到response对象
requests.session()获取一个session实例,使用这个实例的get或post方法多次来访问网站,可以在第一次后的访问中,带上第一次访问时的cookie信息
在访问某些https网站时,可能会由于证书认证问题而导致错误,这时只需要在请求方法中加入verify=False即可
response:使用requests模块发送请求后会得到response对象,里面有我们所需要的数据和信息
response.test:响应体str类型
response.content:响应体bytes类型
response.headers:响应头
response.cookies:响应的cookie
response.status_code:获取响应状态码
爬虫框架:Scrapy,Scrapy-Redis,PySpider
什么是框架
●简单来说,框架是一个将某一类问题的共性提取出来,为这些共性事先编写好响应的代码并将它们进行封装以便复用的一种工具。它可以提高我们开发的效率,使我们减少编写重复的代码
●与模块的区别:模块是指能够单独命名并独立地完成一定功能的程序语句的集合(即程序代码和数据结构的集合体),框架则是一个程序的架构
●为什么爬虫需要框架:在python所编写的爬虫程序中,我们可以使用之前介绍的三个请求相应库来完成90%的爬虫需求。但是由于一些因素,比如爬取效率低、所需数据量非常大和开发效率等,所以我们需要用到一些框架来满足这些需求。
常用的框架
●Scrapy:异步网络框架,可以加快下载速度,提高爬虫效率。并且,我们可以使用少量的代码来实现快速抓取
●Scrapy-Redis:在Scarpy的基础上实现了更强大的功能,是一个分布式的框架,在大型数据的抓取上更快
●PySpider:一个国人编写的强大的网络爬虫系统,并带有强大的WebUi。采用Python语言编写,分布式架构,支持多重数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器
数据提取工具:正则表达式,Beautiful Soup4,XPath,JsonPath
●正则表达式:效率最高的数据匹配工具,但是过于复杂,不好理解
●Beautiful Soup4:是一个HTML/XML的解释器,主要的功能是如何解析和提取HTML/XML数据,使用非常简单,但是效率比较低
●XPath:(XML Path Language)是一门在HTML/XML文档中查找信息的语言,可用来在HTML/XML文档中对元素和属性进行遍历。相对简单且易于理解,效率较高
●JsonPath:用来解析多层嵌套的JSON数据,是一种信息抽取类库,是从JSON文档中抽取指定信息的工具
其他工具:Selenium
Selenium:Web自动化测试工具,最初是为网站自动化测试而开发的,可以直接运行在浏览器上,它支持所有主流的浏览器。它可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。
4.数据提取与存储
数据加载
●网页在进行数据加载时通常分为普通加载和动态加载。由于爬虫在爬取数据时只能抓取到整个html页面代码,所以如果网页采用的是动态加载,爬虫获取到的则是动态加载的代码而非我们想要的数据
●确定网页是Ajax动态加载时,可以在浏览器的开发者平台中(F12)XHR一栏中查找加载后的数据对应的URL,这里的数据大多以JSON形式呈现
●如果网页是使用JavaScript进行渲染后加载的,则需要根据情况来实施相应的抓取策略
数据格式及处理方式
●JSON
●HTML
●XML
数据存储
●本地存储:execl、txt、csv、JSON
●数据库:Mysql、MongoDB、postgresql
5.常见的反爬机制和应对措施
什么是反爬
●爬虫的高速访问会对网站的服务器造成一定的压力,所以维护人员会采用一定的措施来防止非用户的不正常访问
●网站在编码过程中,程序员为了网站的安全性和稳定性,会在请求和响应的过程中加一些额外的验证
常见的反爬机制
●Headers字段:cookie,refer,User-Agent
●验证码:数字、滑块、计算、文字
●JavaScript:通过javaScript生成请求参数,数据加密,数据混淆
●IP地址检测:通过检测访问者的IP地址,判断是否为正常用户
应对反爬
●Headers字段:修改自身字段,让对方无法识别。
●验证码:图像识别算法、打码平台
●JS:进行JS解析,模拟JS执行过程进行破解
●IP地址检测:使用代理IP
代理IP
●代理ip的分类
透明代理:直接隐藏你的IP地址,但是可以查到你是谁
匿名代理:别人只知道你使用了代理,不知道你是谁
高匿代理:让别人无法发现你使用了代理
●代理IP工作流程如下

6.爬虫程序的实现
爬虫的实现步骤
●选择要爬取的url
●分析数据加载的方式
●找到所需数字的地址
●分析数据的规律
●选择工具
●数据提取表达式
●编写程序
●反反爬措施
●运行爬虫程序
爬虫注意事项
●编写程序前应着重分析网站结构和数据,然后再选择合适的工具构建爬虫程序
●程序成功运行后,检查获取数据是否为真实数据
●爬虫程序需要经常维护,如果目标网站的结构或者数据加载方式有变化,则之前写的爬虫程序也要一起改动
三、数据可视化
数据可视化
●数据可视化旨在借助图形化的手段,将数据以视觉形式呈现,清晰有效传达与沟通信息,帮助人们理解蕴藏在数据中的规律和现象
●数据可视化可以是静态的或者是交互的。几个世纪以来,人们一直在使用静态数据的可视化。交互的数据可视化更加先进:人们能够利用电脑和移动设备深入到图标和图形的细节,然后用交互的方式改变他们看到的数据和数据的处理方式
数据可视化的作用和意义
●数据可视化将大量高纬度繁琐数据以一种直观图标形式展现,使得数据在阅读方面更加便捷,数据更加客户,更具有说服力
●数据可视化可以帮助我们发现海量数据中存在的潜在价值和规律
●数据可视化是数据挖掘的关键辅助工具,可以使人清晰地理解数据,从而调整我们的分析方法
常用工具
●可视化在线分析平台:Plotly
●金融可视化工具:Dygraphs,Highcharts
●时间轴可视化工具:TimeLine,Dipity
●基于编程语言实现的工具:Processing,matplotlib,R
●基于JS实现的工具:Charts.js,Echarts
●函数公式数据可视化功能:wolframalpha,Tangle,seaborn
matplotlib seaborn Echarts Pycharts
实现流程
●需求分析
●数据分析
●匹配图形
●确定风格
●优化图形
●效果测试
