网络 爬虫屏蔽 robots 和noindex

robots.txt 文件位于网站的根目录下,用于表明你不希望搜索引擎抓取工具访问你网站上的哪些内容。此文件使用的是漫游器排除标准,该标准是一种内含一小组命令的协议,可依照网站各部分和特定的网页抓取工具类型(例如移动版抓取工具与桌面版抓取工具),表明可访问的网站内容。

!!! 如果你不想让自己的网页显示在搜索引擎搜索结果中,请不要将 robots.txt 用作隐藏网页的方法。 这是因为其他网页可能会指向你的网页,导致你的网页被编入索引,而让 robots.txt 文件失去效用

Robots.txt 命令仅仅只是指令,对于访问你网站的抓取工具来说,这些命令仅作为指令。正规的网页抓取工具都会遵循 robots.txt 文件中的命令,但其他抓取工具未必也会如此。因此,如果你想确保自己网站上的特定信息不会被网页抓取工具抓取,建议你采用其他屏蔽方法(如为您服务器上的隐私文件提供密码保护)。

编写规则
那就是:先写 Disallow 再写 Allow
模版 :https://www.google.com/robots.txt

noindex
要阻止某个网页出现在搜索结果中,您可以将 noindex 元标记加入该网页的 HTML 代码中,或在 HTTP 请求中返回“noindex”标头。当爬虫下次抓取该网页并看到相应的标记或标头时,就会完全阻止该网页出现在搜索结果中

!!! 要想让 noindex 指令生效,就不得使用 robots.txt 文件屏蔽相应网页。如果该网页被 robots.txt 文件屏蔽了,抓取工具将永远无法看到 noindex 指令,因此该网页可能仍会显示在搜索结果中(例如,如果有其他网页链接到该网页的话)
[cc lang=”html”]

[/cc]

HTTP 响应标头 实施
下面的 HTTP 响应示例便含有一个可指示抓取工具不要将某一网页编入索引的 X-Robots-Tag:
[cc]HTTP/1.1 200 OK
(…)
X-Robots-Tag: noindex
(…)[/cc]

option 跨域 请求详解

什么情况下需要 CORS ?

跨域资源共享标准( cross-origin sharing standard )允许在下列场景中使用跨域 HTTP 请求:

功能概述

跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。

CORS请求失败会产生错误,但是为了安全,在JavaScript代码层面是无法获知到底具体是哪里出了问题。你只能查看浏览器的控制台以得知具体是哪里出现了错误。

简单请求

某些请求不会触发 CORS 预检请求。本文称这样的请求为“简单请求”,请注意,该术语并不属于 Fetch (其中定义了 CORS)规范。若请求满足所有下述条件,则该请求可视为“简单请求”:

预检请求 

与前述简单请求不同,“需预检的请求”要求必须首先使用 OPTIONS   方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。”预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。 不属于简单请求都将有预检请求。

附带身份凭证的请求

Fetch 与 CORS 的一个有趣的特性是,可以基于  HTTP cookies 和 HTTP 认证信息发送身份凭证。一般而言,对于跨域 XMLHttpRequest 或 Fetch 请求,浏览器不会发送身份凭证信息。如果要发送凭证信息cookie,需要设置 XMLHttpRequest 的某个特殊标志位。 如 设置 withCredentials 标志设置为 true

附带身份凭证的请求与通配符

对于附带身份凭证的请求,服务器不得设置 Access-Control-Allow-Origin 的值为“*”。

这是因为请求的首部中携带了 Cookie 信息,如果 Access-Control-Allow-Origin 的值为“*”,请求将会失败。而将 Access-Control-Allow-Origin 的值设置为 http://foo.example,则请求将成功执行。

另外,响应首部中也携带了 Set-Cookie 字段,尝试对 Cookie 进行修改。如果操作失败,将会抛出异常。

vuex

vuex 保存
export default {
name: ‘App’,
created () {
//在页面加载时读取sessionStorage里的状态信息
if (sessionStorage.getItem(“store”) ) {
this.$store.replaceState(Object.assign({}, this.$store.state,JSON.parse(sessionStorage.getItem(“store”))))
}

//在页面刷新时将vuex里的信息保存到sessionStorage里
window.addEventListener(“beforeunload”,()=>{
sessionStorage.setItem(“store”,JSON.stringify(this.$store.state))
})
}
}

vue 路由

1 如果 有子路由, 父路由的name 要去掉,否则 不显示
2 为什么在keep-alive组件中使用computed计算属性数据没有变更

Props,methods,data和computed的初始化都是在beforeCreated和created之间完成的。 keep-alive组件不会执行created钩子函数
[cc][/cc]来缓存组件状态 用 activated、deactivated 钩子 更新内容

将路由导航、keep-alive、和组件生命周期钩子结合起来的,触发顺序,假设是从a组件离开,第一次进入b组件:

beforeRouteLeave:路由组件的组件离开路由前钩子,可取消路由离开。
beforeEach: 路由全局前置守卫,可用于登录验证、全局路由loading等。
beforeEnter: 路由独享守卫
beforeRouteEnter: 路由组件的组件进入路由前钩子。
beforeResolve:路由全局解析守卫
afterEach:路由全局后置钩子
beforeCreate:组件生命周期,不能访问this。
created:组件生命周期,可以访问this,不能访问dom。
beforeMount:组件生命周期
deactivated: 离开缓存组件a,或者触发a的beforeDestroy和destroyed组件销毁钩子。
mounted:访问/操作dom。
activated:进入缓存组件,进入a的嵌套子组件(如果有的话)。
执行beforeRouteEnter回调函数next。

BEM 规范

BEM 避免 选择器嵌套, 不然不可复用

block
目的让 the logo and the authorization form 互相交换位置而不通过css 和js
1. Block: 通过class 设置块,是有意义的
不能影响它的环境,不能设置它的形状 边距等
[cc lang=”html”]

[/cc]
Block nesting 嵌套
可以嵌套 且可以嵌套多层
[cc lang=”html”]

[/cc]

2.Element
element
A composite part of a block that can’t be used separately from it.
Features:

The element name describes its purpose (“What is this?” — item, text, etc.), not its state (“What type, or what does it look like?” — red, big, etc.).

The structure of an element’s full name is block-name__element-name. The element name is separated from the block name with a double underscore (__).

[cc lang=”html”]




[/cc]
element nesting 元素嵌套
An element is always part of a block, not another element. This means that element names can’t define a hierarchy such as block__elem1__elem2.
[cc lang=”html”]




[/cc]
块是定义一个作用域, 确保所有元素element 在block的前缀之下, block__element 一定在 block 包围里

Not all blocks have elements. An element is an optional block component. 元素是个可选择的块
[cc lang=”html”]



[/cc]

Should I create a block or an element?
Create a block
If a section of code might be reused and it doesn’t depend on other page components being implemented.

Create an element
If a section of code can’t be used separately without the parent entity (the block).
The exception is elements that must be divided into smaller parts – subelements – in order to simplify development. In the BEM methodology, you can’t create elements of elements. In a case like this, instead of creating an element, you need to create a service block.

3.Modifier
modifier
The same block looks different due to the use of a modifier.
An entity that defines the appearance, state, or behavior of a block or element.
Features:

The modifier name describes its appearance (“What size?” or “Which theme?” and so on — size_s or theme_islands), its state (“How is it different from the others?” — disabled, focused, etc.) and its
以 _ 做分离
[cc lang=”html”]



[/cc]

Key-value
Used when the modifier value is important. For example, “a menu with the islands design theme”: menu_theme_islands.

The structure of the modifier’s full name follows the pattern:

block-name_modifier-name_modifier-value

block-name__element-name_modifier-name_modifier-value
[cc lang=”html”]



[/cc]

A modifier can’t be used alone,
[cc lang=”html”]correct

incorrent

[/cc]

BEM entity
Blocks, elements, and modifiers are all called BEM entities.

Mix
A technique for using different BEM entities on a single DOM node.

Mixes allow you to:
Combine the behavior and styles of multiple entities without duplicating code.
Create semantically new UI components based on existing ones.
Example
[cc lang=”html”]

[/cc]

File structure
[cc]search-form/ # Directory of the search-form

__input/ # Subdirectory of the search-form__input
search-form__input.css # CSS implementation of the
# search-form__input element
search-form__input.js # JavaScript implementation of the
# search-form__input element

__button/ # Subdirectory of the search-form__button
# element
search-form__button.css
search-form__button.js

_theme/ # Subdirectory of the search-form_theme
# modifier
search-form_theme_islands.css # CSS implementation of the search-form block
# that has the theme modifier with the value
# islands
search-form_theme_lite.css # CSS implementation of the search-form block
# that has the theme modifier with the value
# lite

search-form.css # CSS implementation of the search-form block
search-form.js # JavaScript implementation of the
# search-form block[/cc]

BEM tree
Let’s consider an example of a DOM tree:
[cc lang=”html”]



[/cc]
BEM xml

[cc lang=”xml”]













[/cc]

HTML implementation:
[cc lang=”html”]
//Positioning a block relative to other blocks


CSS implementation:

.page__header {
padding: 20px;
}

.page__footer {
padding: 50px;
}
[/cc]
Positioning elements inside a block
[cc lang=”html”]


CSS implementation:

.page__inner {
margin-right: auto;
margin-left: auto;
width: 960px;
}[/cc]

Naming 命名
[cc lang=”html”].button {}
.button__icon {}
.button__text {}
.button_theme_islands {}
[/cc]

Using HTML wrappers 使用包装
[cc lang=”html”]Positioning a block relative to other blocks


Positioning HTML elements inside a block

[/cc]

css字体设置

[cc lang=”css”]body {
font-family: -apple-system, BlinkMacSystemFont, “Segoe UI”, Roboto, Helvetica, Arial, sans-serif, “Apple Color Emoji”, “Segoe UI Emoji”, “Segoe UI Symbol”;
}[/cc]

-apple-system、BlinkMacSystemFont 是什么东东?根据 Webkit 博客,-apple-system 用于调用系统默认 UI 字体,并且会根据 font-weight 声明选择恰当的变体。system 将来有可能成为标准,-apple- 为过渡阶段的厂商前缀。

[cc lang=”css”]
body {
font-family:
/* 1 */ system, -apple-system, BlinkMacSystemFont,
/* 2 */ “Segoe UI”, “Roboto”, “Oxygen”, “Ubuntu”, “Cantarell”, “Fira Sans”, “Droid Sans”,
/* 3 */ “Helvetica Neue”, sans-serif;
}[/cc]
第一组映射系统 UI 字体:

-apple-system:macOS 和 iOS 平台的 Safari 指向 San Francisco,更老版本的 macOS 指向 Neue Helvetica 和 Lucida Grande(中文字体待验证)

BlinkMacSystemFont:为 macOS Chrome 应用系统 UI 字体,与上面等同

第二组定义已知的系统 UI 字体:

Segoe UI 面向 Windows 和 Windows Phone

Roboto Android 及 较新的 Chrome OS

Oxygen 面向 KDE、Ubuntu 等

Fira Sans 面向 Firefox OS

Droid Sans 面向老版本 Android

第三组回退处理:

Helvetica Neue El Capitan 之前的 macOS 系统 UI 字体
sans-serif 字体回退

考虑到中文字体,最终的列表可能是:
[cc lang=”css”]
body {
font-family:
system, -apple-system, BlinkMacSystemFont,
“PingFang SC”, “Segoe UI”, “Microsoft YaHei”, “wenquanyi micro hei”,”Hiragino Sans GB”, “Hiragino Sans GB W3”, “Roboto”, “Oxygen”, “Ubuntu”, “Cantarell”, “Fira Sans”, “Droid Sans”,
“Helvetica Neue”, Helvetica, Arial, sans-serif;

}[/cc]

关于平方
预先定义好,使用 “PingFang-SC” 引用,浏览器根据 font-weight 去选择不同的变体。
[cc lang=”css”]
@font-face {
font-family: “PingFang-SC”;
font-weight: 100;
src: local(“PingFang SC Thin”);
}

@font-face {
font-family: “PingFang-SC”;
font-weight: 300;
src: local(“PingFang SC Light”);
}

@font-face {
font-family: “PingFang-SC”;
font-weight: 400;
src: local(“PingFang SC Regular”);
}

@font-face {
font-family: “PingFang-SC”;
font-weight: 500;
src: local(“PingFang SC Medium”);
}

@font-face {
font-family: “PingFang-SC”;
font-weight: 700;
src: local(“PingFang SC Semibold”);
}

@font-face {
font-family: “PingFang-SC”;
font-weight: 800;
src: local(“PingFang SC Heavy”);
}

body {
font-family: “PingFang-SC”, sans-serif;
}[/cc]