Redhat Enterprise Linux
rockylinux8-network-config
查看linux内核信息
1 | uname -a |
查看linux发行版信息
1 | cat /etc/os-release |
配置静态网路
1 | vi /etc/sysconfig/network-scripts/ifcfg-ens160 |
重启网络
1 | nmcli c reload |
SSH连接问题 网络不可达(怀疑是VMware软件问题,配置SSH映射就好了)
网络也能ping外网了,具体操作见地址
Java爬虫
Java编写的开源Web爬虫
- Apache Nutch
实现语言: Java
GitHub星标数: 1743
官方支持链接
简介:
Apache Nutch是一种高度可扩展、可伸缩的开源Web爬虫软件项目。
如果要列出最好的开源Web爬虫列表,Apache Nutch无疑金榜题名。
作为一种用于数据挖掘的高度可扩展、可伸缩的开源代码Web数据抽取软件项目,Apache Nutch得到了广泛的使用。
Nutch支持单机运行,但是在Hadoop集群上运行可最大化地发挥其强大能力。
全球范围内很多数据分析人员和科研人员、应用开发人员和Web文本挖掘工程师都在使用Apache Nutch。
Apache Nutch是一种Java编写的跨平台解决方案。
特性:
默认情况下,爬取数据和分析数据是独立的过程。
广泛支持多种文档格式,包括纯文本、HTML/XHTML+XML、XML、PDF、ZIP等。
使用XPath和命名空间实现映射。
通过Hadoop支持分布式文件系统。
链接图形式的数据库。
支持NTLM认证。
– 官方文档: https://wiki.apache.org/nutch/
– 官方网站: http://nutch.apache.org/
Node.js爬虫
- Node.js常用爬虫框架与无头浏览器
NodeCrawler
Simplecrawler
JavaScript编写的开源Web爬虫
- NodeCrawler
实现语言: JavaScript
GitHub星标数: 3999
官方支持链接
简介:
NodeCrawler是一种广为使用的Web爬虫,它基于NodeJS实现,具有非常快的爬取速度。
Nodecrawler非常适用于偏爱使用JavaScript编程或者致力于JavaScript项目的开发人员。其安装也非常简单。
JSDOM和Cheerio(用于HTML解析)实现服务器端渲染。其中,JSDOM更为稳定。
特性:
使用 Cheerio(默认)或JSDOM实现服务端DOM和自动jQuery插入。
可配置池子规模和重试次数。
控制爬取率限制。
请求的优先队列。
支持forceUTF8模式,使得爬虫可以检测并转换字符集。
与4.x乃至更新版本兼容。
– 官方文档:https://github.com/bda-research/node-crawler
– 官方网站:http://nodecrawler.org/
rockylinux install
安装、网络、包源配置
阿里镜像
- rockylinux下载地址
https://mirrors.aliyun.com/rockylinux
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
-i.bak \
/etc/yum.repos.d/Rocky-*.repo
dnf makecache
# RHEL常用命令
- [DNF](https://wangchujiang.com/linux-command/c/dnf.html)
- [NetworkManager](https://blog.csdn.net/yangshihuz/article/details/106643970)
- [sytemctl](https://linux265.com/news/3385.html)
- [firewalld](https://blog.51cto.com/andyxu/2137046)
TS的!和?用法
!用法
用在变量前表示取反
用在赋值的内容后时,使null和undefined类型可以赋值给其他类型并通过编译,表示该变量值可空
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18let y:number
y = null // 无法通过编译
y = undefined // 无法通过编译
y = null!
y = undefined!
// 由于x是可选的,因此parma.x的类型为number | undefined,无法传递给number类型的y,因此需要用x!
interface IDemo {
x?: number
}
let y:number
const demo = (parma: IDemo) => {
y = parma.x!
return y
}如果存在空情况的判断并赋具体值时,可以不用!,但是如果要想令y存在等于undefined的情况还是需要用!
1
2
3
4
5
6
7
8
9
10interface IDemo {
x?: number
}
let y:number
const demo = (parma: IDemo) => {
y = parma.x || 1 // 如果为undefined,返回y=1,如果不为undefined,则返回parma.x的值
return y
}
?用法
- 除了表示可选参数外,常用于防御性编程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35const a = fetch(...) || {} // 假设a是从后端拿到的一个对象类型数据
const unsafeData = a.b.c // 这样写时不安全的,无法确保b是否有值,如果为空则b.c会进行报错
const safeData = a?.b?.c // 实际上就是相当于 const safeData = a && a.b && a.b.c
当使用A对象属性A.B时,如果无法确定A是否为空,则需要用A?.B,表示当A有值的时候才去访问B属性,没有值的时候就不去访问,如果不使用?则会报错
// 由于函数参数可选,因此parma无法确定是否拥有,所以无法正常使用parma.x,使用parma?.x向编译器假设此时parma不为空且为IDemo类型,同时parma?.x无法保证非空,因此使用parma?.x!来保证了整体通过编译
interface IDemo {
x: number
}
let y:number
const demo = (parma?: IDemo) => {
y = parma?.x!
console.log(parma?.x) // 只是单纯调用属性时就无需!
return y
}
// 如果使用y = parma!.x!是会报错的,因为当parma为空时,是不拥有x属性的,会报找不到x的错误
但是?用法只能读操作而不能写操作,对一个可能为空的属性赋值是不会被编译通过的,此时还需用用到类型断言
interface IDemo {
x: number
}
// 编译报错,不能赋值给可选属性
const demo = (parma?: IDemo) => {
parma?.x = 1
}
// 使用类型断言
const demo_ = (parma?: IDemo) => {
let _parma = parma as IDemo
_parma.x = 1
}