爬虫:通过编写程序,模拟浏览器上网,让其去互联网上抓取数据的过程
爬虫在使用场景中的分类:
-通用爬虫:搜索引擎抓取系统的重要组成部分,抓取的是一整张页面的数据。
-聚焦爬虫:建立在通用爬虫的基础之上,抓取的是页面中特定的局部内容
-增量式爬虫:检测网站中数据更新的情况,只会抓取网站中最新更新出来的数据
反爬机制:门户网站,可以通过制定相应的策略或者技术手段,防止爬虫程序进行网站数据的爬取。
反反爬策略:爬虫程序可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而可以获取门户网站中相关的数据
robots.txt协议:(君子协议)规定了那些数据可以爬取,哪些不可以,没有强制限定
http协议:服务器和客户端进行数据交互的一种形式
常用的请求头信息:
User-Agent:请求载体的身份标识
Connection: 请求完毕,是断开连接还是保持连接
常用的响应头信息
Content-Type:服务器响应回客户端的数据类型(字符串 json等)
https协议:安全的http协议(超文本传输协议)涉及数据加密
加密方式:
对称秘钥加密(客户端将数据通过参数的形式发送给服务端,这些数据对称加密在客户端使用自己指定的加密,然后将加密的信息(包括解密方式)与数据一起传送给服务端)
非对称秘钥加密:使用时有两把锁,一把叫做私有秘钥,一把是公开密钥,服务器先告诉客户端按照自己给定的公开密钥进行加密,客户端按照公开秘钥加密之后,服务器接收信息再通过自己的私有秘钥进行解密,这样做解密的要是不会进行传播,避免了被劫持的风险,但是可能没有办法保证客户端拿到的公钥是正确的
证书秘钥加密:(https采用的)服务器端指定加密方式公钥,把公钥提交到整数认证机构,机构审核通过之后对公钥进行数据签名,分配已经签名的公开密钥,把密钥放在证书下面,邦迪昂在一起,服务器将证书发送给客户端,客户端可以通过数据签名验证密钥的真伪,确认正确通过公钥对数据进行加密
requests模块:python中原生的一款基于网络请求的模块
作用:模拟浏览器发请求
如何使用:
-指定url(输入网址)
-发起请求(get或post)
-获取响应数据
-将爬取的数据进行持久化存储
聚焦爬虫:爬取页面中指定的页面内容(最常用)
编码流程
-指定url(输入网址)
-发起请求(get或post)
-获取响应数据
-数据解析
-将爬取的数据进行持久化存储
数据解析分类:
-正则
-bs4
-xpath(***)
数据解析原理:
要解析的局部内容大部分是存储在对应的标签中的,图片在源码中是存储在《img》标签中,存储图片的地址,所以如果要解析图片的话,我们需要找到对应的img标签中的src属性才可以
也就是说:解析的局部文本内容都会在标签之间或者标签对应到属性中进行存储
1.进行指定标签的定位
2.标签或者标签对应的属性中存储的数据进行提取(解析)
常用的正则表达式
入门:
-字符组
字符组([])允许匹配一组可能出现的字符
可以看到可以匹配到Python python就是指匹配中括号中出现的元素任意一次,符号-表示区间【0-9】匹配数字,【a-z】匹配所有小写字母【0-9a-zA-Z】匹配所有的数字大小写字母
匹配特殊字符,匹配-的话【\-】这样就可以
不会匹配数字【^0-9】
-快捷方式
匹配到所有数字的快捷方式 \d 不需要加【】
匹配到所有英文字母的快捷方式 \w 也不需要加【】
匹配空白字符比如空格tab或者换行等 使用\s
匹配单词的边界\b 比如master如果m和r左右两边都没有字母,表示是一个独立的单词有边界使用\bmaster\b
匹配所有非数字的快捷方式\D
匹配所有的非英文字母的快捷方式\W
匹配所有非空白字符的快捷方式\S
^放在区间外面表示匹配开头 ^python以python开头的数据
$表示以什么结尾 python$表示以n结尾的单词
.字符代表匹配任何单个字符,它只能出现在方括号以外.字符只有换行符不可以匹配
可选字符--?表示希望该字符出现一次或者零次 honou?r 表示honor或honour(这是一个单词的不同写法)
\d{4}-\d{7} 在一个字符组后面加上{N}表示在他之前的字符组出现N次
-匹配多个数据,这里是表示0731-8825951
\d{8,9} 表示想匹配8个或者9个数字
字符的重复次数没有边界 \d{1,} 闭区间不写即可表示匹配一个或者无数个
还可以使用两个速写字符指定常见重复情况,可以使用+匹配1到无数个,使用*匹配0到无数个,即+相当于{1,} *相当于{0,} f.*(注意这里是.符号,表示f开头的数据
匹配以http开头,以/结尾的所有数据 ^http.*\/$
进阶:
-分组与回溯引用
当使用分组时,除了或得整个匹配,还能够在匹配中选择每一个分组,分组的实现使用()即可
分组的一个非常重要的功能,捕获数据,()被称为捕获分组,当我们想要从匹配好的数据中提取关键数据的时候可以使用分组
(\d{4})和(\d{7})就分别捕获了两段数据
或者条件
使用分组的同属还可以使用or(或者)条件
例如要提取所有图片文件的后缀名可以在各个后缀名直接加上一个|符号 (.jpg|.gif|.jpeg|.png)
如果有时候不需要捕获某个分组的内容有想要使用分组的特性,(?:表达式),这样就可以不捕获数据,还可以使用分组的功能
回溯引用
引用之前匹配分组的机制,一个自匹配在接下来会再次出现 123<font>提示</font>abcd 匹配到<font>提示</font>,正则表达式<(/w+)>(.*?)</\1> 这里的\1表示(/w+),这样的话,如果前面是font后面是list也不会进行匹配,两组数据必须相同
-替换与标记
先行断言和后行断言也可以叫做环视,也有人叫预搜索,先行断言是从左往右看,后行断言是从右往左看
-先行断言
分为正向先行断言和后向先行断言
正向先行断言(?=表达式),指在某个位置向右看,表示所在位置右侧必须能匹配表达式 取出喜欢两个字,要求喜欢后面有你,就这么写:喜欢(?=你)
提取至少包含一个大小写字母的字符串:(?=.*?[a-z])(?=.*?【A-Z】).+
反向先行断言(?!表达式)的作用是保证右边不能出现某字符
取出喜欢两个字,要求喜欢后面不能有你,就这么写:喜欢(?!你)
-后行断言
分为正向后行断言和反向后行断言
正向后行断言:(?<=表达式)指在某个位置往左看,表示所在位置左侧必须能匹配表达式 要求喜欢的前面有我,后面有你 (?<=我)喜欢(?=你)
反向后行断言(?<!表达式)从某个位置往左看,表示所在位置左侧不能匹配表达式
标签:字符,加密,断言,爬虫,匹配,数据 From: https://www.cnblogs.com/xxsadd/p/16584614.html