爬虫基础知识
一、爬虫是什么
- 爬虫又称数据采集,英文名:spider,就是通过编程来全自动的从互联网上采集数据,模拟正常人类发起的网络请求,然后获取网络请求所返回的数据。 跟我们人手动去点击一个连接,访问一个网页获取数据,没有本质的区别
- 爬虫可以解决的问题:
(1)解决冷启动的问题。
(2)作为搜索引擎的主要技术。做搜索引擎,必须使用爬虫。
(3)辅助机器学习建立知识图谱。机器学习最终的是训练集。训练集可以靠爬虫爬去。
(4)可以制作比较软件。
二、爬虫流程
- 分析网站—http+https
- 获取页面—requests
- 提取数据—正则,xpath
- 保存数据—mongodb+redis
三、爬虫分类
- 通用爬虫
就是将互联网上的网页【整体】爬取下来,保存到本地的程序。
通用爬虫的缺陷:
(1)只能爬取原网页,但是一般网页中90%的内容都是无用的。
(2)不能满足不同行业,不同人员的不同需求。
(3)只能获取文字,不能获取视频,音频,文件等内容。
(4)只能通过关键字查询,无法支持语义查询。 - 聚焦爬虫
在实施网页抓取时,会对内容进行筛选,尽量保证之抓取与需求相关的数据。
四、通用爬虫的应用–搜索引擎
- 什么是搜索引擎
搜索引擎就是运行一些策略和算法,从互联网上获取网页信息,并将这些信息做一些处理之后保存起来,再为用户提供检索服务的一种程序,系统。 - 搜索引擎的组成
主要组成就是通用爬虫 - 搜索引擎的工作过程
(1)抓取网页:是通过通用爬虫来完成。
(2)数据的存储。
这个过程会有一定的去重操作。如果这个网页的内容大部分重,搜索引擎可能不会保存。
(3)预处理
提取出文字
中文分词。
消除噪音(广告,导航栏,版权声明文字。)
索引处理。
(4)设置网站排名,为用户提供检索服务。 - 搜索引擎可以获取所有网页的原因
搜索引擎把所有网页都保存到了本地。他是怎么做到的呢?一个网页就是一个url,这个问题就可以转化成通用爬虫是如何知道要爬去哪些url的,也就是:
【搜索引擎的待爬取的url的来源都有哪些?】
a、新网站会主动向搜索引擎提交自己的网址。
b、在其他网站上设置的外链会被搜索引擎加入到url队列。
c、搜索引擎和dns解析商合作,如果有新网站注册,搜索引擎就可以获取网址。
五、爬虫准备知识
- robots协议
定义:网络爬虫排除标准
作用:告诉搜索引擎哪些可以爬哪些不能爬。 - sitemap:网站地图,可以帮助我们了解一个网站的结构。
- 估算网站的大小
site:www.taobao.com
六、http和https
- 什么是http协议?
是一种约束发布和接受html页面的规范。 - http协议的端口号:80
https端口:443 - http协议的特点:
(1)他是一个应用层协议。
(2)无连接
每次发送http都是单独连接,这只是正对于http1.0之前,在http1.1开始,设置一个请求头Connection,就可以做到一个长连接。
(3)无状态。
http协议不记录状态,每次请求,如果想要到之前请求的内容,必须单独发送。为了解决这种问题,产生一种技术,就叫cookie和session。 - 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连接
- http的工作过程有几下几点要特别注意:
1、我们在浏览器中输入一个url,他先要进过前三步,而不是直接发送请求的。
2、要明白客户端请求和服务器响应所在的位置。 - 当我们在浏览器中输入一个url,客户端是如何加载出整个页面的?
(1)客户端解析url,封装数据包,建立连接,给服务发送请求。
(2)服务从数据包中解析出客户端想要获取的页面,比如index.html,就把该页面按层封住成对应数据包传递给客户端。客户端在解析数据包,拿到对应index.html页面。
(3)客户端检查该index.html页面中是否有静态资源,比如js文件,image文件,css文件,如果有,在分别从服务器上请求获取这些资源。
(4)客户端获取到所有资源之后,按照html的语法,将index.html完整的显示出来。 - 客户端请求
(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)组成:
状态行:http协议版本、状态码
响应头
空行
响应正文:如果请求一个html页面,响应正文就是这个html文件的内容。
(2)响应头:
content-type:返回数据类型,告诉客户端,返回的资源类文件的类型是什么。
(3)状态码
1XX->100~199:表示服务器成功接受部分请求,还需要发剩余请求才能处理整个过程。
2XX:表示服务器成功接受请求并已经处理完整个过程。
200 ok
3XX:为了完成请求,客户端必须进一步细化请求。
如果请求资源已经移动到其他位置,常用就是302重定向。
304使用缓存资源。
4XX:客户端请求错误。404-服务器无法找到请求内容。
403-服务器拒绝访问,权限不够
5XX:服务器发生错误。
502服务器发生错误。
500,请求未完成,服务器遇到不可知问题。