什么是爬虫
又称 网络机器人,是一种按照一定规则,自动抓取万维网信息的程序或者脚本。
通俗的讲: 就是模拟客户端发起网络请求,接收请求的响应,按照一定的规则,自动的抓取互联网信息的程序。
爬虫的基本流程
- 分析网站:得到目标url
- 根据url,发起请求,获取页面HTML源码
- 从页面源码中提取数据
- 提取目标数据,做数据的筛选和持久化存储
- 从页面中提取新的url地址,继续执行第二部操作
- 爬虫结束:所有的url提取完毕,并且得到数据
网页的三大特征
- url唯一的统一资源定位符
- 通过html文本的展示
- 所有的网页http或者https来传输的
通用爬虫和聚焦爬虫
通用爬虫
是搜索引擎的重要组成部分,目的:竟可能的将所有互联网上的网页下载到本地,经过预处理(去噪,分词,去广告),最终将数据存储到本地,做一个镜像备份,形成一个检索系统
聚焦爬虫
聚焦爬虫,是"面向特定主题需求"的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。
Robot.txt是什么,里边的参数什么意思
也叫爬虫协议、机器人协议等,全称是“网络爬虫排除标准”,就是一个规范,告诉搜索引擎,哪些目录下的资源可以爬取,那些不可以爬取
User-agent: Baiduspider(识别是哪家的爬虫)
Allow: /article (可以爬取的目录)
Allow: /oshtml
Allow: /ershou
Allow: /$
Disallow: /product/ (不可以爬取的目录)
Disallow: /
七层协议
从上到下
- 应用层 : 为用户的应用程序提供网络服务的(http,https,ftp...)
- 表示层 : 负责端到端的数据信息可以被拎一个主机所理解和识别,并且按照一定的格式将信息传递到会话层
- 会话层 : 管理主机间的会话进程,负责建立,管理,终止会话进程
- 传输层 : 进行数据传输的(TCP,UDP)
- 网络层 :路由器
- 数据链路层 :网桥,交换机
- 物理层 : 网线,网卡### HTTP协议 和 HTTPS协议
HTTP协议
HyperText Transfer Protocol)中文名叫超文本传输协议: 是用于从网络传送超文本数据到本地浏览器的传送协议
HTTPS协议
HTTPS协议(Hypertext Transfer Protocol over Secure Socket Layer)简单讲是HTTP的安全版,在HTTP协议的基础上加入SSL层(HTTP+SSL) 。 SSL(Secure Sockets Layer 安全套接层)主要用于Web的安全传输协议,在传输层对网络连接进行加密,保障在Internet上数据传输的安全
注意:HTTPS比HTTP更安全,但是性能更低
区别 | tcp | udp |
---|---|---|
传输方式: | 面向链接 | 非面向连接 |
传输的数据: | 传输的是数据流 | 传输的是数据包(可能丢包) |
传输的效率: | 慢 | 快 |
传输的稳定性:高 | 低 |
get和post的区别
- GET是从服务器上获取数据,POST是向服务器传送数据
- GET请求参数显示,都显示在浏览器网址上,HTTP服务器根据该请求所包含URL中的参数来产生响应内容,即“Get”请求的参数是URL的一部分
- POST请求参数在请求体当中,消息长度没有限制而且以隐式的方式进行发送,通常用来向HTTP服务器提交量比较大的数据(比如请求中包含许多参数或者文件上传操作等),请求的参数包含在“Content-Type”消息头里,指明该消息体的媒体类型和编码.
url的基本组成部分
- URI(Uniform Resource Identifier):统一资源标识符
- URL(Uniform / Universal Resource Locator的缩写):统一资源定位符,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
- URN(Universal Resource Name):统一资源名称,只命名资源而不指定如何定位资源
- 关系:URI是URL与URN的父类,URN用的很少,我们一般会提到URI和URL,每一个URL都是一个URI,但是并不是每一个URI都是一个URL.
基本格式
scheme://host[:port#]/path/…/[?query-string][#anchor]
- scheme:协议(例如:http, https, ftp)
- host:服务器的IP地址或者域名
- port#:服务器的端口(如果是走协议默认端口,缺省端口80)
- path:访问资源的路径
- query-string:参数,发送给http服务器的数据
- anchor:锚(跳转到网页的指定锚点位置
发起一个请求的基本流程
- 当用户 在浏览器的地址栏中输入一个URL并按回车键之后(会先经过DNS服务将域名解析为ip),浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。
- 当我们在浏览器输入URL http://www.baidu.com 的时候,浏览器发送一个Request请求去获取 http://www.baidu.com 的html文件,服务器把Response文件对象发送回给浏览器。
- 浏览器分析Response中的 HTML,发现其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。 浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。
- 当所有的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。
请求头参数和响应头里边的参数
常用的请求报头
- User-Agent (浏览器名称)
-
Cookie
浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能 -
Referer (页面跳转处)
Referer:表明产生请求的网页来自于哪个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面, 是从什么网站来的等。
有时候遇到下载某网站图片,需要对应的referer,否则无法下载图片,那是因为人家做了防盗链,原理就是根据referer去判断是否是本网站的地址 ,如果不是,则拒绝,如果是,就可以下载 -
Content-Type (POST数据类型)
Content-Type:POST请求里用来表示的内容类型。
举例:Content-Type = Text/XML; charset=gb2312:
指明该请求的消息体中包含的是纯文本的XML类型的数据,字符编码采用“gb2312”。 -
Host (主机和端口号)
Host:对应网址URL中的Web名称和端口号,用于指定被请求资源的Internet主机和端口号,通常属于URL的一部分。 - X-Requested-With: XMLHttpRequest(表示是一个Ajax异步请求)
- Connection (链接类型) Connection:表示客户端与服务连接类型
- Client 发起一个包含 Connection:keep-alive 的请求,HTTP/1.1使用 keep-alive 为默认值。
- Server收到请求后:
1. 如果 Server 支持 keep-alive,回复一个包含 Connection:keep-alive 的响应,不关闭连接;
2. 如果 Server 不支持 keep-alive,回复一个包含 Connection:close 的响应,关闭连接。
3. 如果client收到包含 Connection:keep-alive 的响应,向同一个连接发送下一个请求,直到一方主动关闭连接。
4. keep-alive在很多情况下能够重用连接,减少资源消耗,缩短响应时间,比如当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都去请求建立连接。
-
Upgrade-Insecure-Requests (升级为HTTPS请求)
Upgrade-Insecure-Requests:升级不安全的请求,意思是会在加载 http 资源时自动替换成 https 请求,让浏览器不再显示https页面中的http请求警报。
HTTPS 是以安全为目标的 HTTP 通道,所以在 HTTPS 承载的页面上不允许出现 HTTP 请求,一旦出现就是提示或报错。 -
Accept (传输文件类型)
Accept:指浏览器或其他客户端可以接受的MIME(Multipurpose Internet Mail Extensions(多用途互联网邮件扩展))文件类型,服务器可以根 据它判断并返回适当的文件格式。
举例:
-
Accept: /:表示什么都可以接收。
-
Accept:image/gif:表明客户端希望接受GIF图像格式的资源;
-
Accept:text/html:表明客户端希望接受html文本。
-
Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8:表示浏览器支持的 MIME 类型分别是 html文本、xhtml和xml文档、所有 的图像格式资源。
q是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容。若没有指定q值,则默认为1,按从左到右排序顺序;若被 赋值为0,则用于表示浏览器不接受此内容类型。
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;Application:用于传输应用程序数据或者二进制数据。(http://blog.sina.com.cn/s/blog_866e403f010179f1.html)
-
Accept-Encoding(文件编解码格式)
Accept-Encoding:指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应 之后先解码,然后再检查文件格式,许多情形下这可以减少大量的下载时间。
举例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0
如果有多个Encoding同时匹配, 按照q值顺序排列,本例中按顺序支持 gzip, identity压缩编码,支持gzip的浏览器会返回经过gzip编码的HTML页面。
如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。 -
Accept-Language(语言种类)
Accept-Langeuage:指出浏览器可以接受的语言种类,如en或en-us指英语,zh或者zh-cn指中文,当服务器能够提供一种以上的语言版本时要用到。 -
Accept-Charset(字符编码) Accept-Charset:指出浏览器可以接受的字符编码。
举例:Accept-Charset:gb2312,utf-8
- gb2312:标准简体中文字符集;
- utf-8:UNICODE 的一种变长字符编码,可以解决多种语言文本显示问题,从而实现应用国际化和本地化。
如果在请求消息中没有设置这个域,缺省表示任何字符集都可以接受。
常用的响应报头
理论上所有的响应头信息都应该是回应请求头的。但是服务端为了效率,安全,还有其他方面的考虑,会添加相对应的响应头信息,从上图可以看到
-
Cache-Control:must-revalidate, no-cache, private。(是否需要缓存资源)
这个值告诉客户端,服务端不希望客户端缓存资源,在下次请求资源时,必须要从新请求服务器,不能从缓存副本中获取资源。
-
Cache-Control是响应头中很重要的信息,当客户端请求头中包含* Cache-Control:max-age=0请求, 明确表示不会缓存服务器资源时,Cache-Control作为作为回应信息,通常会返回no-cache, 意思就是说,"那就不缓存呗"。
-
当客户端在请求头中没有包含Cache-Control时,服务端往往会定,不同的资源不同的缓存策略, 比如说oschina在缓存图片资源的策略就是Cache-Control:max-age=86400,这个意思是,从当 前时间开始,在86400秒的时间内,客户端可以直接从缓存副本中读取资源,而不需要向服务器请求。
- Connection:keep-alive(保持连接) 这个字段作为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个tcp连接发送http请求。
- Content-Encoding:gzip(web服务器支持的返回内容压缩编码类型) 告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。
-
Content-Type:text/html;charset=UTF-8(文件类型和字符编码格式)
告诉客户端,资源文件的类型,还有字符编码,客户端通过utf-8对资源进行解码,然后对资源进行html解析。
通常我们会看到有些网站是乱码的,往往就是服务器端没有返回正确的编码。 -
Date:Sun, 21 Sep 2016 06:18:21 GMT(服务器消息发出的时间)
这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是 GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题。 -
Expires:Sun, 1 Jan 2000 01:00:00 GMT(响应过期的日期和时间)
这个响应头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本,很显然这个值会存在 问题,因为客户端和服务器的时间不一定会都是相同的,如果时间不同就会导致问题。所以这个响应头是 没有Cache-Control:max-age=*这个响应头准确的,因为max-age=date中的date是个相对时间,不仅更 好理解,也更准确。 -
Pragma:no-cache 这个含义与Cache-Control(是否缓存资源)等同。
8.Server:Tengine/1.4.6(服务器和服务器版本)
这个是服务器和相对应的版本,只是告诉客户端服务器的信息。 -
Transfer-Encoding:chunked
这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。一般分块发送的资源都是服务器动态生成的, 在发送时还不知道发送资源的大小,所以采用分块发送,每一块都是独立的,独立的块都能标示自己的长度, 最后一块是0长度的,当客户端读到这个0长度的块时,就可以确定资源已经传输完了。 -
Vary: Accept-Encoding
告诉缓存服务器,缓存压缩文件和非压缩文件两个版本,现在这个字段用处并不大,因为现在的浏览器都是 支持压缩的。 响应状态码 响应状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
bytes类型和str类型的相互转换,bytes和bytearray的区别
- encode()转换二级制 括号什么都不填默认utf-8
- decode()把二进制转成字符串
- bytearray bytearray和bytes不一样的地方在于,bytearray是可变的
网友评论