一. 爬虫是什么?
1.爬虫的定义:脚本,程序—>自动抓取万维网上信息的程序。
2、爬虫可以解决的问题:
(1)解决冷启动的问题。
(2)搜索引擎的根基。做搜索引擎,必须使用爬虫。
(3)帮助机器学习建立知识图谱。
机器学习最重要的是训练集。训练集可以靠爬虫爬取。
(4)可以制作比较软件。

二. 搜索引擎
1 概念:
搜索引擎就是运行一些策略和算法,从互联网上获取网页信息,并将这些信息做一些处理之后保存起来
,再为用户提供检索服务的一种程序,系统。
2 主要组成:通用爬虫
3 通用爬虫:
将互联网上的网页【整体】爬取下来,保存到本地的程序。
搜索引擎之所以可以获取所有网页,是因为它把所有网页都保存到了本地。
搜索引擎的待爬取的url的来源都有:
a、新网站会主动向搜索引擎提交自己的网址。
b、在其他网站上设置的外链会被搜索引擎加入到url队列。
c、搜索引擎和dns解析商合作,如果有新网站注册,搜索引擎就可以获取网址。
4 工作过程:
(1)抓取网页:是通过通用爬虫来完成。
(2)数据的存储。
这个过程会有一定的去重操作。如果这个网页的内容大部分重,搜索引擎可能不会保存。
(3)预处理
提取出文字
中文分词。
消除噪音(广告,导航栏,版权声明文字。)
索引处理。
(4)设置网站排名,为用户提供检索服务。
5 通用爬虫的缺陷:
(1)只能爬取原网页,但是一般网页中90%的内容都是无用的。
(2)不能满足不同行业,不同人员的不同需求。
(3)只能获取文字,不能获取视频,音频,文件等内容。
(4)只能通过关键字查询,无法支持语义查询。
6 聚焦爬虫:在实施网页抓取时,会对内容进行筛选,尽量保证之抓取与需求相关的数据。

三. 爬虫的准备工作
1 robots协议
定义:网络爬虫排除标准
作用:告诉搜索引擎哪些可以爬哪些不能爬。
2 sitemap:网站地图,可以帮助我们了解一个网站的结构。
3 估算网站的大小
site:www.taobao.com

四. http和https
1 什么是http协议?
是一种规范。—>约束发布和接受html页面的规范。
2 http协议的端口号:80
https端口:443
3 http协议的特点:
(1)它是一个应用层协议。
(2)无连接
每次发送http都是单独连接,这只是正对于http1.0之前,在http1.1开始,设置一个请求头Connection,就可以做到一个长连接。
(3)无状态。
http协议不记录状态,每次请求,如果想要到之前请求的内容,必须单独发送。
为了解决这种问题,产生一种技术,就叫cookie和session。
3、url:统一资源定位符
(1)主要的作用就是:用来定位【互联网】上的任意资源的【位置】。
(2)为什么url可以用来定位任意资源?
比如在这个url “http://localhost:8890/index.html” 之中,它的组成为:
scheme:协议—http
netloc:网络地址—localhost:8890–互联网上定位一个计算机,主要是通过ip:port。
ip的作用就是帮我们找到这个计算机,port就相当于进入这个计算机门户,只有指定的门才能进得去。
path:资源在服务器的相对路径。
它是怎么定位资源的:url包含的netloc可以定位到任何计算机,进入计算机后通过path就可以找到想要的资源。
(3)url中的特殊符号。
?:问号后面是get请求的请求参数。
&:多个get请求参数拼接使用&
#:锚点—>帮助我们访问这个链接时,页面可以定位锚点位置。
在爬虫中,当我们爬去的url有锚点时,记得删掉。
(4)python的urllib下的parse模块可以帮助我们解析一个url:

from urllib import parse

			url = 'https://localhost:9999/bin/index.html?usename=zhangsanY&password=123#bottom'
			parse_result = parse.urlparse(url)
			print(parse_result)
			print(parse_result.netloc)
			print(parse_result.path)
			
			运行结果:
			ParseResult(
				scheme='https', 
				netloc='localhost:9999', 
				path='/bin/index.html', 
				params='', 
				query='usename=zhangsanY&password=123', 
				fragment='bottom')
				
			localhost:9999
			/bin/index.html

4、http的工作过程:
(1)地址解析:客户端解析出url的每一个部分。
url = ‘https://localhost:9999/bin/index.html?usename=zhangsanY&password=123#bottom’—》
(scheme=‘https’,
netloc=‘localhost:9999’,
path=’/bin/index.html’,
params=’’,
query=‘usename=zhangsanY&password=123’,
fragment=‘bottom’)
(2)封装http请求数据包
(3)封装tcp数据包,通过三次握手建立tcp连接。
(4)客户端发送请求
(5)服务器发送响应。
(6)关闭tcp连接
5、http的工作过程有几下几点要特别注意:
(1)我们在浏览器中输入一个url,他先要进过前三步,而不是直接发送请求的。
(2)要明白客户端请求和服务器响应所在的位置(应用层)。
6、当我们在浏览器中输入一个url,客户端是如何加载出整个页面的?
(1)客户端解析url,封装数据包,建立连接,给服务发送请求。
(2)服务从数据包中解析出客户端想要获取的页面,比如index.html,就把该页面按层封住成对应数据包传递给客户端。客户端在解析数据包,拿到对应index.html页面。
(3)客户端检查该index.html页面中是否有静态资源,比如js文件,image文件,css文件,如果有,在分别从服务器上请求获取这些资源。
(4)客户端获取到所有资源之后,按照html的语法,将index.html完整的显示出来。
7、客户端请求
(1)组成:
请求行:包括协议版本号,地址,请求方法
请求头
空行
请求数据
(2)重要的请求头:
User-Agent:客户端标识。
accept:允许传入的文件类型。
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
Referer:表示产生请求的网页来自于那个网页。
防盗链:新浪现在所有的网页都设置一个判断流程,在请求新闻页面时,先查看referer这个头是不是表示我们新浪网站,如果是,就说明访问路劲正确,才给数据,如过不是,就是盗用,直接不给数据。
cookie:有些网页如果你用request模块无法获取数据,同事他返回的内容一般有cookie这个单词,此时就表示你需要在请求的过程中封装cookie头;在登录的过程中,cookie的作用也很大。
content-type:post请求的数据类型。
content-length:post请求的请求数据的长度。
x-requested-with:xmlhttprequest–xhr—》当我们发送一个ajax接口数据,想要获取数据内容,必须封装这个头,这个头就表示这个请求是一个ajax。
8、服务器响应
(1)组成:
状态行:http协议版本、状态码
响应头
空行
响应正文:如果请求一个html页面,响应正文就是这个html文件的内容。
(2)响应头:
content-type:返回数据类型,告诉客户端,返回的资源类文件的类型是什么。
(3)状态码
1XX->100~199:表示服务器成功接受部分请求,还需要发剩余请求才能处理整个过程。
2XX:表示服务器成功接受请求并已经处理完整个过程。
200 ok
3XX:为了完成请求,客户端必须进一步细化请求。
如果请求资源已经移动到其他位置,常用就是302重定向。
304使用缓存资源。
4XX:客户端请求错误。404-服务器无法找到请求内容。
403-服务器拒绝访问,权限不够
5XX:服务器发生错误。
502服务器发生错误。
500,请求未完成,服务器遇到不可知问题。

如果遇到面试题,请说出常见的状态码?
			回答思路应该是,先说出分类,在列举几个。

五. hash算法
1 什么是hash:
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。
2 hash算法的特点:
1 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
2 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
3 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
4 冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。简单理解就是严格单调,不管a和b的值是多少,f(a)永远不等于f(b)
3 常见的hash算法:MD4,MD5,SHA-1,但现在都已被证实有漏洞。