爬虫知识
网络爬虫又称网页蜘蛛,爬虫即是网络上爬行的蜘蛛。可以将理解为一种在互联网上自动提取网页信息并进行解析数据的程序
网络爬虫主要的分类有:聚焦网络爬虫、增量网络爬虫、通用网络爬虫、深层网络爬虫
Robots协议又称机器人协议,通常在网站根目录下的存放的文本文件,它记录了网站哪些数据可以采集,哪些数据不能采集,以此来约束爬虫
URL:全称为统一资源定位符,其包括https协议,访问路径和资源名称。使用url定位互联网上的资源。
HTTP
HTTP协议,中文名称为超文本传输协议,其作用是保证超文本数据高效准确地传输到本地浏览器上。
特征:应用层协议;无连接;无状态。
HTTP请求
请求报文组成:请求行、请求头、空行、请求数据
HTTP协议的常用请求方法
请求方法 | |
---|---|
GET | 直接请求,从服务器获取响应数据,参数拼接在url后 |
POST | post是向服务器提交数据进行请求,参数放在请求体的body里 |
HEAD | 类似于GET请求,用于获取报文头部信息,没有具体的响应内容 |
PUT | 从客户端向服务器传送的数据取代指定的文档内容 |
DELETE | 请求服务器删除指定的页面 |
OPTIONS | 查看服务器的性能信息 |
HTTP响应码
100 | 服务器收到部分请求,应继续发送其余请求 |
101 | 服务器遵从一种协议转换到另一种协议 |
200 | 成功,完成请求 |
201 | 请求被创建完成,创建新的资源 |
302 | 请求页面已经临时跳转到新的url |
303 | 请求页面可在别的url找到 |
403 | 请求页面被禁止访问 #重点 |
404 | 无法找到对应请求页面 |
500 | 未完成,服务器遇到不可预测的情况 |
504 | 服务器网关超时 |
常见请求头
User-Agent: 客户端请求标识;包含浏览器、系统版本和cpu等信息
Accept: 客户端可接受的数据类型
Referer: 请求来源
cookie : 用于识别用户身份信息,进行会话跟踪,而储存在本地终端的数据
Content-type: POST请求的数据类型
Cookie与Session的区别:
Cookie:为了鉴别用户身份、进行session跟踪而存储在用户本地终端的数据
Session:用于存储特定用户的Session所需的属性及配置信息。
共同之处:cookie和session都是用来跟踪浏览器用户身份的会话方式。
区别:cookie是储存在客户端的数据,session是储存在服务器端的数据。
联系:服务器端可以根据客户端发送的cookie找到对应的sessionID,再找到对应的session信息,以此进行会话。
HTTP和Web服务器:
地址进行DNS解析,获取服务器ip地址,封装http请求数据包,进一步封装TCP包,进行三次握手,客户端发送请求,服务器接受请求后,发送响应,客户端收到响应,进行页面渲染;服务器关闭TCP连接;
TCP协议是一种面向连接的, 可靠的, 基于字节流的传输层通信协议
HTTP与HTTPS的区别
HTTP协议是明文数据传输的网络协议,明文传输存在安全隐患;端口80
HTTPS使用SSL+HTTP协议进行加密传输、身份认证,比HTTP协议安全。端口443
OSI模型
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
HTML与XML
HTML
HTML:超文本标记语言,用于浏览器数据展示。
XML
XML:可扩展性标记语言,与HTML不同,主要用于传输,而非显示;可作为配置文件使用。
CSS
css是一种标记语言,用于HTML文档定义布局。使得页面更美观。
CSS选择器使用讲解
JavaScript
JavaScript是一种可以嵌套在HTML代码中可由浏览器执行的脚本语言。
网络请求库
Python语言具有多个网络请求库,如:urllib、urllib3、requests和Requests-HTML等。
模拟浏览器运行库:selenium、Pyppeteer、splash、playwright。
反爬
反爬虫类型
headers检验: 如useragent、referer
验证码 : 滑块、图形、点击识物、点击排序
IP 封禁 : 禁止访问频率过高的ip
动态渲染页面 :ajax动态加载技术
url/api 参数加密: 利用接口对参数进行加密算法加密
Js 代码加密 : js进行压缩、混淆、加密,使得无法进行js逆向分析
字体反爬:真实的数据通过映射某个文件数据来显示
CSS位置偏移反爬: 利用CSS控制文字的偏移位置
验证码
打码平台识别验证码
OCR识别图形验证码
滑块验证码突破方法:
- JavaScript逆向:逆向验证码背后的JavaScript逻辑,模拟JavaScript执行获取缺口密钥信息,利用密钥进行下一步请求操作。
- 深度学习识别缺口:利用自动化测试启动浏览器模拟点击验证码,截取验证码节点,截图保存。使用labelImg标注缺口位置得到xml文件,读文件进行数据处理,返回缺口位置信息。下载预训练模型,训练得到模型,将图片保存到测试文件夹下,测试得到缺口位置数据,使用自动化测试工具模拟滑动滑块。
- OpenCv技术识别滑动验证码 使用OpenCv模块,对图片进行高斯模糊、边缘检测、轮廓提取,根据轮廓信息进行条件筛选,计算返回缺口偏移量。
Python知识点
Python的特点
解释性语言、面向对象、简洁易懂、开源
Python中is和 = = 的区别
is:判断对象的内存地址是否相等
==:判断对象的值是否相等
深拷贝与浅拷贝
深拷贝就是将一个对象完全拷贝到另一个对象中,这意味着如果你对一个对象的拷贝做出改变时,不会影响原对象。
Python浅拷贝只拷贝父级对象,不拷贝子级对象,所以对子对象进行修改,原对象的值也随之改变。
元组与列表
列表是可变的,而元组是不可变的。改变元组元素会报错。
三元运算符
[on true] if [expression] else [on false]
如果表达式为True,就执行[on true]中的语句。否则,就执行[on false]中的语句。
迭代器和生成器的区别:
迭代器:用来访问集合元素的方式;集合元素的遍历,只能前不能退。迭代器有2个基本方法:iter(),next()。
生成器:包含yield语句的函数;该函数调用返回生成器对象,可用于迭代操作。调用生成器函数时,每次遇到yield时,函数会保存当前运行信息和暂停,并返回yield的值,下一次调用next()方法时从上次保存的位置继续运行。
联系:生成器是一种迭代器,不同在于生成器可通过yield进行挂起资源,只在使用时候占用内存。
装饰器
目的:不更改原函数的代码前提下给函数增加新的功能
闭包
嵌套函数;闭包就是能够读取外部函数内的变量的函数。
优点:不需要定义全局变量,外函数的变量就可在内函数中传递,使变量保存在内存中。
缺点:内存消耗大,内存泄漏。
装饰器和闭包的区别:
闭包传递的是变量,而装饰器传递的是函数对象,只是传的参数内容不一样,闭包的概念包含了装饰器,可以说装饰器是闭包的一种,它只是传递函数对象的闭包。
help()与dir()
Help()函数是一个内置函数,用于查看函数或模块用途的详细说明
Dir()函数也是Python内置函数,dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。
数据解析提取
python解析库: lxml、Beautiful Soup、parsel、pyquery等。
Xpath: Xml路径语言,用于xml文档中查找信息。也适用于HTML文档搜索。
正则表达式
(1)(.* )贪婪模式,尽量多的去匹配
(2)(.*?) 非贪婪,尽量匹配最少的次数,0次或一次。
熟悉正则的search、findall、match、split和sub方法
JSON
全称JavaScript对象标记,JSON是对JS对象的字符串表达形式,它使用文本形式表示一个JS对象的信息。
(1)json.dumps(Python的list或者dict),将Python的list或者dict返回为一个JSON字符串;
(2)json.loads(json字符串),将JSON字符串返回为Python的list或者dict;
匿名函数lamdba
好处:无需名字,不必担心函数名冲突,简化了函数定义。
常见python知识点
Python 数据结构
python的排序算法
列表、字典、集合特征和增删改查操作
filter、reduce、map、sorted等常见函数
列表/字典生成式
自定义函数参数*args和*kwargs的含义
args:不知道函数需要传入多个参数时,使用args定义多个无名参数
*kwargs:不知道该传递多少关键字参数时,使用**kwargs来收集关键字参数
多进程+多线程
程序 | 一个应用相当于一个程序,如QQ或微信 |
---|---|
进程 | 系统进行资源分配的独立单位,一个程序至少有一个进程 |
线程 | 操作系统运算调度的最小单位, 一个进程至少有一个线程 |
协程 | 又称为微线程,一种运行在用户态的轻量级线程 |
比较:
进程是操作资源分配的最小单位,其切换所消耗资源大,效率低
线程是cpu调度的最小单位,线程切换所消耗资源一般,效率一般(不考虑GIL)
协程由程序控制进行切换,资源消耗低,效率高
应用:
IO密集型情况使用多线程或协程;
计算密集型情况下使用多进程;
GIL锁
python全局解释器锁,python线程执行之前,先会获取GIL锁,只有执行完毕或进行耗时的IO操作时,解释器才会释放GIL锁,让其他线程有机会执行。
缺点:导致python多线程无法同时执行,无法利用cpu多核。
解决方法:使用没有GIL的其他python解释器(如Jpython),或使用多进程。
互斥锁*
目的:保证多线程安全访问竞争资源,使用互斥锁的同步机制,保障资源访问同步进行。
缺点:阻止了多线程并发,降低了效率。
死锁
原因:当两个线程分别占有一部分资源并同时等待对方的资源,就会造成死锁。
解决方法:设置加锁顺序和时限,死锁检测。
面向对象和面向过程的区别
面向过程:一种以过程为中心的编程思想,把问题分解为一个个模块,依次调用模块来解决问题
优点:性能效率高、逻辑简单
缺点:难维修,难扩展
面向对象:通过把问题分解为各个对象,调用对象的属性、方法来解决对应的问题。
对象特征:封装,多态,继承
优点:易扩展,易维修,低耦合、复用性强
Scrapy
scrapy优点:高效、异步、并发、架构清晰,可扩展性极强。
Scrapy组件:spider 、Engine、pipeline、schedule、Downloader、middlewares(熟悉各个组件作用 )
Engine : 引擎;用于控制数据流和组件之间的通信,触发各种事件,是整个框架的核心。
Scheduler : 调度器;负责接收Engine发过来的Request,添加到队列中进行排序和去重,当Engine需要时,将Request交给引擎。
Downloader : 下载器;用于从网络下载Web资源。
Spiders : 爬虫;从指定网页爬取需要的信息。如:生成新Request、解析Response提取数据
Item pipeline : 条目管道;处理爬取后的数据,如:数据清洗、验证及保存数据。
Downloader Middlewares : 下载中间件;位于Engine与下载器之间,主要用于处理两者之间的请求及响应。
Spider Middlewares : 爬虫中间件; 介于Spider与Engine之间,用于处理爬虫的响应输入和请求输出。
scheduler minddlewares : 调度器中间件;介于Engine与scheduler之间,用于处理Engine发送到scheduler的请求和响应。
scrapy去重原理
利用python集合中元素不重复的特性,在scrapy去重类中,使用hash加密函数,根据Request的method、body、headers、url信息加密生成指纹字符串,使用集合记录每个Request指纹,判断生成的指纹与集合中的重复,重复则不加入集合。
scrapy-redis去重原理
和scrapy去重指纹生成一致,不同在于使用的redis数据库的集合储存操作,通过判断指纹是否成功添加进集合,如果成功则表示不重复,否之返回True判断为重复。
scrapy分布式
Scrapy 提供了一些以Redis为基础的组件,用Scrapy-Redis 的框架形式实现了分布式爬虫(内部实现了调度器和项目管道的共享)。
Mysql索引
事务
事务是一组具有原子性的SQL语句,或是一个独立的工作单元
索引的分类 | |
---|---|
主键索引(PRIMARY KEY) | 也简称主键。它可以提高查询效率,并提供唯一性约束。一张表中只能有一个主键。被标志为自动增长的字段一定是主键,但主键不一定是自动增长。 |
全文索引(FULL TEXT) | 旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。 |
普通索引 | 基本的索引类型,没有唯一性的限制,允许为NULL值。 |
唯一索引(UNIQUE KEY) | 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。唯一性索引列允许空值,而主键列不允许为空值。主键列在创建时,已经默认为空值 + 唯一索引了。 |
主键可以被其他表引用为外键,而唯一索引不能。
索引方式
一般有四种索引方式
BTREE,RTREE, HASH ,FULLTEXT。
数据库三大范式
- 第一范式:每个列都不可再拆分。
- 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
- 第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键
mysql中两种表类型的区别:
1、MyISAM:使用非聚集索引;不支持事务,而且不支持外键,如果执行大量的select(查询语句)MyISAM比较适合。(查询速度快)
2、InnoDB:使用聚集索引;支持事务,外键、行锁、事务是他的最大特点。如果有大量的update(更新)和insert(插入),InnoDB比较适合。
BTREE在MyISAM和Innodb中的区别
InnoDB的B+Tree主键索引的叶子节点就是数据文件,辅助索引的叶子节点是主键的信息;而MyISAM的B+Tree主键索引和辅助索引的叶子节点都是指向数据文件的地址指针。
Redis
Redis是一个基于内存的、高效的键值型非关系数据库,存取效率极高,而且支持多种数据储存结构。
优势:
性能极高:读写速度极高
丰富的数据类型:提供了列表、字符串、hash、集合和有序集合等类型。
原子性:所有操作是原子性的,同时支持多个操作合并后的原子性执行。
丰富的特性:支持publish/ subscribe、通知、 key过去等特性
特性:Redis既可用作数据库提供持久化储存;也可以作为缓存和消息中间件使用。它的类型有字符串、hash、列表、集合和有序集合等。
MongoDB
MongoDB是一个基于分布式文件储存的NoSql(非关系型)数据库。
特性
(1)模式自由:可以把不同结构的文档存储在同一个数据库。
(2)面向集合的存储:适用于存储对象及JSON形式数据。
(3)完整的索引:对任何属性可索引
(4)复制和高可用性:支持主从模式及服务器直接的相互复制。
(5)丰富的查询:支持丰富的查询表达式。
(6)快速就地更新:查询优化器可生成查询计划
(7)高效的传统存储方式:支持图片等二进制数据及大型对象
(8)支持自动分片及云级别的伸展性
优点
面向文件的
高性能
高可用性
丰富的查询
非结构数据的爆发增长
技术门槛低