爬虫基础知识

一、爬虫是什么

  1. 爬虫又称数据采集,英文名:spider,就是通过编程来全自动的从互联网上采集数据,模拟正常人类发起的网络请求,然后获取网络请求所返回的数据。 跟我们人手动去点击一个连接,访问一个网页获取数据,没有本质的区别
  2. 爬虫可以解决的问题:
    (1)解决冷启动的问题。
    (2)作为搜索引擎的主要技术。做搜索引擎,必须使用爬虫。
    (3)辅助机器学习建立知识图谱。机器学习最终的是训练集。训练集可以靠爬虫爬去。
    (4)可以制作比较软件。

二、爬虫流程

  1. 分析网站—http+https
  2. 获取页面—requests
  3. 提取数据—正则,xpath
  4. 保存数据—mongodb+redis

三、爬虫分类

  1. 通用爬虫
    就是将互联网上的网页【整体】爬取下来,保存到本地的程序。
    通用爬虫的缺陷:
    (1)只能爬取原网页,但是一般网页中90%的内容都是无用的。
    (2)不能满足不同行业,不同人员的不同需求。
    (3)只能获取文字,不能获取视频,音频,文件等内容。
    (4)只能通过关键字查询,无法支持语义查询。
  2. 聚焦爬虫
    在实施网页抓取时,会对内容进行筛选,尽量保证之抓取与需求相关的数据。

四、通用爬虫的应用–搜索引擎

  1. 什么是搜索引擎
    搜索引擎就是运行一些策略和算法,从互联网上获取网页信息,并将这些信息做一些处理之后保存起来,再为用户提供检索服务的一种程序,系统。
  2. 搜索引擎的组成
    主要组成就是通用爬虫
  3. 搜索引擎的工作过程
    (1)抓取网页:是通过通用爬虫来完成。
    (2)数据的存储。
    这个过程会有一定的去重操作。如果这个网页的内容大部分重,搜索引擎可能不会保存。
    (3)预处理
    提取出文字
    中文分词。
    消除噪音(广告,导航栏,版权声明文字。)
    索引处理。
    (4)设置网站排名,为用户提供检索服务。
  4. 搜索引擎可以获取所有网页的原因
    搜索引擎把所有网页都保存到了本地。他是怎么做到的呢?一个网页就是一个url,这个问题就可以转化成通用爬虫是如何知道要爬去哪些url的,也就是:
【搜索引擎的待爬取的url的来源都有哪些?】
		a、新网站会主动向搜索引擎提交自己的网址。
		b、在其他网站上设置的外链会被搜索引擎加入到url队列。
		c、搜索引擎和dns解析商合作,如果有新网站注册,搜索引擎就可以获取网址。

五、爬虫准备知识

  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。
  4. List item
url:统一资源定位符
   (1)主要的作用就是:用来定位【互联网】上的任意资源的【位置】。
   
   (2)为什么url可以用来定位任意资源?
   			原因:url包含的netloc可以定位到任何计算机,进入计算机后通过path就可以找到想要的资源。
   			
   (3)scheme:协议---http
		
		<1>.netloc:网络地址---localhost:8890--互联网上定位一个计算机,主要是通过ip:port。
		
		<2>.ip的作用就是帮我们找到这个计算机,port就相当于进入这个计算机门户,只有指定的门才能进得去。
		
		<3>.path:资源在服务器的相对路径。
	
	(4)url中的特殊符号。
		?:问号后面是get请求的请求参数。
		&:多个get请求参数拼接使用&
		#:锚点--->帮助我们访问这个链接时,页面可以定位锚点位置。
			在爬虫中,当我们爬去的url有锚点时,记得删掉。
	
	(5)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
(6)、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连接
  1. http的工作过程有几下几点要特别注意:
    1、我们在浏览器中输入一个url,他先要进过前三步,而不是直接发送请求的。
    2、要明白客户端请求和服务器响应所在的位置。
  2. 当我们在浏览器中输入一个url,客户端是如何加载出整个页面的?
    (1)客户端解析url,封装数据包,建立连接,给服务发送请求。
    (2)服务从数据包中解析出客户端想要获取的页面,比如index.html,就把该页面按层封住成对应数据包传递给客户端。客户端在解析数据包,拿到对应index.html页面。
    (3)客户端检查该index.html页面中是否有静态资源,比如js文件,image文件,css文件,如果有,在分别从服务器上请求获取这些资源。
    (4)客户端获取到所有资源之后,按照html的语法,将index.html完整的显示出来。
  3. 客户端请求
    (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。
  1. 服务器响应
    (1)组成:
    状态行:http协议版本、状态码
    响应头
    空行
    响应正文:如果请求一个html页面,响应正文就是这个html文件的内容。
    (2)响应头:
    content-type:返回数据类型,告诉客户端,返回的资源类文件的类型是什么。
(3)状态码
	1XX->100~199:表示服务器成功接受部分请求,还需要发剩余请求才能处理整个过程。
	2XX:表示服务器成功接受请求并已经处理完整个过程。
		200 ok
	3XX:为了完成请求,客户端必须进一步细化请求。
		如果请求资源已经移动到其他位置,常用就是302重定向。
		304使用缓存资源。
	4XX:客户端请求错误。404-服务器无法找到请求内容。
		403-服务器拒绝访问,权限不够
	5XX:服务器发生错误。
		502服务器发生错误。
		500,请求未完成,服务器遇到不可知问题。