爬虫遵循的协议:robot协议
定义:网络爬虫排除标准。
作用:告诉搜索引擎哪里可以爬,哪里不可以爬。
爬虫分类
(1)通用爬虫:搜索引擎的主要组成,作用就是将互联网的上页面整体的爬取下来之后,保存到本地。
(2)聚焦爬虫:聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。通用爬虫和聚焦爬虫的区别:聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。
通用爬虫工作流程
1)抓取网页:通过搜索引擎将待爬取的url加入到通用爬虫的url队列中,进行网页内容的爬取
2)数据存储:将爬取下来的网页保存到本地,这个过程会有一定的去重操作,如果某个网页的内 容大部分内容都会重复,搜索引擎可能不会保存。
3)预处理:提取文字,中文分词,消除噪音(比如版权声明文字,导航条,广告等)。
4)设置网站排名,为用户提供服务。
一些反爬及其应对措施
推送门:关于反爬与反反爬
1)通过user-agent来判断是否是爬虫。
解决方案:可以通过伪装请求头中的user-agent来解决。若user-agent被检测到,可以找大量的user-agent,放入列表,然后进行更换
2)将IP进行封杀。
解决方案:可以通过代理来伪装IP。
3)通过访问频率来判断是否是一个爬虫。
解决方案:可以通过设置请求间隔,和爬取间隔。
4)当一定时间内的总请求数超过上限,弹出验证码。
解决方案:对于简单的验证码图片可以使用tesseract来处理,对于复杂的可以去打码平台。
5)通过JS来获取页面数据。
解决方案:可以使用selenium+phantomjs来加载JS获取数据。
介绍搜索引擎
1.搜索引擎的主要组成
通用爬虫:就是将互联网的上页面整体的爬取下来之后,保存到本地。通用爬虫要想爬取网页,需要网站的url.但是搜索引擎是可以搜索所有网页的。那么通用爬虫url就要涉及到所有网页,这个‘所有’是如何做到的:
- 新网站向搜索引擎主动提交网址;
- 在其他网站上设置新网站外链;
- 搜索引擎和DNS解析服务商(如DNSPod等)合作,新网站域名将被迅速抓取。
2.搜索引擎的工作流程(通用爬虫的工作流程)
(1)抓取网页:通过搜索引擎将待爬取的URL加入到通用爬虫的URL队列中,进行网页内容的爬取。
(2)数据存储:将爬取下来的网页保存到本地,这个过程会有一定的去重操作,如果某个网页的内 容大部分内容都会重复,搜索引擎可能不会保存。
(3)预处理:提取文字,中文分词,消除噪音(比如版权声明文字,导航条,广告等)。
(4)设置网站排名,为用户提供服务。
3.搜索引擎的局限性
(1)搜索引擎只能爬取原网页,但是页面90%内容都是无用的。
(2)搜索引擎不能满足不同行业,不同人的特定需求。
(3)通用搜索引擎只能爬取文字信息,不能对音频、图片等进行爬取。
(4)只能基于关键字查询,无法基于语义查询。
介绍HTTP
网络七层协议:
1.HTTP协议特点
- HTTP协议是超文本传输协议;
- HTTP协议是一个应用层协议;
- 无连接:每次请求都是独立的;
- 无状态,表示客户端每次请求都不能记录请求状态,就是两条请求直接不可通信。
2.HTTP工作过程
- 地址进行DNS解析,将URL解析出对应的内容
- 封装HTTP请求数据包
- 封装成TCP包,建立TCP连接(TCP的三次握手)
- 客户端发送请求
- 服务器接收请求,发送响应
- 客户端接收到响应,进行页面渲染
- 服务器关闭TCP连接(TCP的四次挥手)
3.HTTP协议和HTTPS协议的区别
- HTTP协议是使用明文数据传输的网络协议,明文传输会让用户存在一个非常大的安全隐患。端口80
- HTTPS协议可以理解为HTTP协议的安全升级版,就是在HTTP的基础上增加了数据加密。端口443
- HTTPS协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议要比HTTP协议安全。
4.HTTP通信
HTTP通信由两部分组成:客户端请求消息与服务器响应消息。
5.关于响应常见的响应码
6.客户端请求(Get和Post区别)
(1)组成:请求行、请求头部、空行、请求数据四个部分组成
(2)请求方法Get/Post
(3)Get和Post的区别GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
(4)常见的请求头
User-Agent:客户端请求标识
Accept:传输文件类型。Referer :请求来源
cookie (cookie):在做登录的时候需要封装这个头
Content-Type (POST数据类型)
7.服务器响应
(1)组成:状态行,响应头,空行,响应正文。
(2)常见的响应头
Content-Type:text/html;资源文件的类型,还有字符编码
Content-Length:响应长度
Content-Size响应大小
Content-Encoding告诉客户端,服务端发送的资源是采用什么编码的
Connection:keep-alive这个字段作为回应客户端的
Connection:keep-alive,告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个TCP连接发送HTTP请求。
URL
统一资源定位符:
基本格式:scheme://host[:port#]/path/…/?query-string 协议://服务器ip地址:端口号/资源路径/?key1=参数1&key2=参数2
scheme:协议(例如:HTTP、HTTPS、FTP)
host/IP:服务器的IP地址或者域名
port:服务器的端口(如果是走协议默认端口,缺省端口80),用来从互联网进入电脑
path:访问资源的路径,就是为了在电脑中找到对应的资源路径
query-string:参数,发送给http服务器的数据
anchor:锚(跳转到网页的指定锚点位置)
Q:当我们在浏览器输入一个URL,为什么可以加载出一个页面?为什么抓包的过程中请求一个URL,出现很多的资源请求?
当我们在浏览器输入一个URL,客户端会发送这个URL对应的一个请求到服务器获取内容。服务器收到这个请求,解析出对应内容,之后将内容封装到响应里发送到客户端
当客户端拿到这个HTML页面,会查看这个页面中是否有CSS、JS、image等URL,如果有,在分别进行请求,获取到这些资源。
客户端会通过HTML的语法,将获取到的所有内容完美的显示出来。
Cookie和Session
产生原因:由于HTTP是一个无状态的协议,每次请求如果需要之前的一些信息,无法记录,因此为了解决这个问题,产生了一种记录状态技术,Cookie和Session。
Cookie指某些网站为了辨别用户身份,进行会话跟踪而存储在用户本地终端上的数据,种类有会话Cookie和持久Cookie。
(1)会话Cookie指存在浏览器内存的Cookie,当浏览器关闭,会话Cookie会失效;
(2)持久Cookie是保存在硬盘上的Cookie。
Session用来存储特定的用户会话所需的属性及其配置信息。
Cookie是在客户端记录状态,Session是在服务端记录状态。
联系:当客户端发送一个Cookie,服务器会从这个Cookie中找到sessionID,再查找出相应的Session信息返回给客户端,来进行用户页面的流转。如果通过sessionID来查找Session的时候,发现没有Session(一般第一次登陆或者清空了浏览器),那么就会创建一个Session。
hashlib密码加密
def get_hex(value):
md5_ = hashlib.md5()
md5_.update(value.encode('utf-8'))
return md5_.hexdigest()
关于response.text乱码问题
response的常用属性:
1.获取字符串类型的响应正文:response.text
2.获取bytes类型的响应正文:response.content
3.响应正文字符串编码:response.encoding
4.状态码:response.status_code5.响应头:response.headers
response.text乱码问题:
#方法一:转换成utf-8格式
response.encoding='utf-8'
print(response.text)
#方法二:解码为utf-8 :
with open('index.html','w',encoding='utf-8') as fp: fp.write(response.content.decode('utf-8'))
代理
代理的作用:
1、突破自身IP 访问限制, 访问一些平时不能访问的站点。
2、访问一些单位或团体内部资源:比如使用教育网内地址段免费代理服务器, 就可以用于对教育网开放的各类FTP 下载上传, 以及各类资料查询共享等服务。
3、提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时, 同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取屮信息传给用户,以提高访问速度。
4、隐藏真实IP :上网者也可以通过这种方法隐藏自己的IP , 免受攻击。对于爬虫来说, 我们用代理就是为了隐藏自身IP , 防止自身的被*。代理根据匿名程度的分类:
JSON数据
数据的分类:
JSON的本质:是一个字符串,JSON是对JS对象的字符串表达式,它使用文本形式表示一个JS对象的信息。
JSON使用:
(1)json.dumps(Python的list或者dict),将Python的list或者dict返回为一个JSON字符串;
(2)json.loads(json字符串),将JSON字符串返回为Python的list或者dict;
(3)json.dump(list/dict,fp),将Python的list或者dict转为一个JSON字符串,保存到文件中;
(4)json.load(fp) ,从JSON文件中读出JSON数据,并转换为Python的list或者dict。
正则表达式
1、贪婪和非贪婪
(1)正则默认是贪婪模式,所以数量控制符默认是取最大值,也是贪婪。例如*
(2)非贪婪是用?来控制,尽量匹配最少的次数,0次或一次。2、Python使用格式:
pattern=re.compile('正则表达式') print(pattern.match(字符串,start,end))#默认从头开始匹配,只匹配一次,返回一个match对象 print(pattern.search(字符串,start,end))#从任意位置开始匹配,只匹配一次,返回一个match对象 print(pattern.findall(字符串,start,end))#全文多次匹配,将匹配到的结果放到一个list返回给我们 print(pattern.finditer(字符串,start,end))#全文多次匹配,将匹配到的结果放到一个match对象的迭代器返回
3、常见的正则题目