在中国网络环境下获取Golang.org上的Golang Packages

Golang李魔佛 发表了文章 • 0 个评论 • 1295 次浏览 • 2022-06-16 10:26 • 来自相关话题

在中国网络环境下获取Golang.org上的Golang Packages

背景
目前在中国网络环境下无法访问Golang.org。
问题
不能运行go get golang.org/x/XX来获取Golang packages。

解决方案
方案 A: 使用github 上的镜像

获取Golang Package在github镜像上的路径: golang.org/x/PATH_TO_PACKAGE --> github.com/golang/PATH_TO_PACKAGE.

// Ex:
golang.org/x/net/context --> github.com/golang/net/context
运行go get来安装github镜像的Golang packages。

// Ex:
go get github.com/golang/net/context
你会碰到如下错误提示:

package github.com/golang/net/context:
code in directory /go/src/github.com/golang/net/context
expects import "golang.org/x/net/context"
忽略错误。 Golang的Package的源代码已经成功下载于:
$GOPATH/src/github.com/golang/PATH_TO_PACKAGE.

复制 $GOPATH/src/github.com/golang/PATH_TO_PACKAGE 到 $GOPATH/src/golang.org/x/PATH_TO_PACKAGE.

// Ex:
mkdir $GOPATH/src/golang.org/x -p
cp $GOPATH/src/github.com/golang/net $GOPATH/src/golang.org/x/ -rf
运行 go build 来编译。

方案 B: 使用第三方网站 - https://gopm.io/download

输入包路径即可下载zip文件。 查看全部
在中国网络环境下获取Golang.org上的Golang Packages

背景
目前在中国网络环境下无法访问Golang.org。
问题
不能运行go get golang.org/x/XX来获取Golang packages。

解决方案
方案 A: 使用github 上的镜像

获取Golang Package在github镜像上的路径: golang.org/x/PATH_TO_PACKAGE --> github.com/golang/PATH_TO_PACKAGE.

// Ex:
golang.org/x/net/context --> github.com/golang/net/context
运行go get来安装github镜像的Golang packages。

// Ex:
go get github.com/golang/net/context
你会碰到如下错误提示:

package github.com/golang/net/context:
code in directory /go/src/github.com/golang/net/context
expects import "golang.org/x/net/context"
忽略错误。 Golang的Package的源代码已经成功下载于:
$GOPATH/src/github.com/golang/PATH_TO_PACKAGE.

复制 $GOPATH/src/github.com/golang/PATH_TO_PACKAGE 到 $GOPATH/src/golang.org/x/PATH_TO_PACKAGE.

// Ex:
mkdir $GOPATH/src/golang.org/x -p
cp $GOPATH/src/github.com/golang/net $GOPATH/src/golang.org/x/ -rf
运行 go build 来编译。

方案 B: 使用第三方网站 - https://gopm.io/download

输入包路径即可下载zip文件。

控制pymysql的链接超时

python李魔佛 发表了文章 • 0 个评论 • 1480 次浏览 • 2022-06-14 23:39 • 来自相关话题

看到网上尤其csdn上,大部分的教程都是说加timeout参数
 


conn = pymysql.connect(host=host, port=port, user=user, password=password, db=db, charset='utf8',timeout=3)
 

结果运行的时候直接报错的。好家伙。
 
难道都是东家抄西家,西家抄东家?
 
直接点进去源码:





 
这里直接有一个connect_timeout 的参数,这个才是最新的常数名。 查看全部
看到网上尤其csdn上,大部分的教程都是说加timeout参数
 



conn = pymysql.connect(host=host, port=port, user=user, password=password, db=db, charset='utf8',timeout=3)
 


结果运行的时候直接报错的。好家伙。
 
难道都是东家抄西家,西家抄东家?
 
直接点进去源码:

20220614032.png

 
这里直接有一个connect_timeout 的参数,这个才是最新的常数名。

华宝证券app的行情数据很慢很慢

券商万一免五绫波丽 发表了文章 • 0 个评论 • 2135 次浏览 • 2022-06-14 09:43 • 来自相关话题

使用了近30个券商app,华宝证券app的行情速度是最慢最慢的,并且app极度占用资源。
一个用了2年的手机,就被一个华宝智投的app卡死。
 
如果一个股票开盘高开,用华宝挂单,你怎么都不会卖得出去。 你只有羡慕别人的份。
 
脉冲冲高,用华宝,千万不能用现价卖出! 一定要往低压,因为行情慢,当前价格是未知。。
 
随便搜了下,是一个普遍现象。。





 





 
最主要的是,我按照实时下单,卖出,按照买一价, 10次有8次不是马上成交的。 说明你这个行情数据延误有多严重!!!!
 
至少,同样的操作习惯,在银河,国金上也没遇到过这么高的成交不了的概率。
  查看全部
使用了近30个券商app,华宝证券app的行情速度是最慢最慢的,并且app极度占用资源。
一个用了2年的手机,就被一个华宝智投的app卡死。
 
如果一个股票开盘高开,用华宝挂单,你怎么都不会卖得出去。 你只有羡慕别人的份。
 
脉冲冲高,用华宝,千万不能用现价卖出! 一定要往低压,因为行情慢,当前价格是未知。。
 
随便搜了下,是一个普遍现象。。

20220614001.png

 

20220614002.png

 
最主要的是,我按照实时下单,卖出,按照买一价, 10次有8次不是马上成交的。 说明你这个行情数据延误有多严重!!!!
 
至少,同样的操作习惯,在银河,国金上也没遇到过这么高的成交不了的概率。
 

linux下好用的git gui工具 推荐!

Linux李魔佛 发表了文章 • 0 个评论 • 2365 次浏览 • 2022-06-11 17:37 • 来自相关话题

之前写过一篇免费版的kranken
 
ubuntu下最好的图形git管理工具kranken (免费版本) 
用了一个月之后,发现免费版不支持私有仓库,这。。。。。
 
那自己的私有仓库还得专门找软件管理。
 
突然看到ubuntu下平时用的不多的vs code,发现里面git的插件可真多。
 
把最多星的git相关插件装上后,它的功能基本大部分都可以覆盖了95%kraken的可视化功能了!
 










  查看全部
之前写过一篇免费版的kranken
 
ubuntu下最好的图形git管理工具kranken (免费版本) 
用了一个月之后,发现免费版不支持私有仓库,这。。。。。
 
那自己的私有仓库还得专门找软件管理。
 
突然看到ubuntu下平时用的不多的vs code,发现里面git的插件可真多。
 
把最多星的git相关插件装上后,它的功能基本大部分都可以覆盖了95%kraken的可视化功能了!
 

20220611002.png


20220611003.png

 

腾讯云上的rshim进程是什么作用

网络安全李魔佛 发表了文章 • 0 个评论 • 3162 次浏览 • 2022-06-08 19:35 • 来自相关话题

这个应用一直开者,而且还杀不死。
 
kill -9 pid
 
之后又会重新启动一个新的进程。 看着就像病毒或者木马的特征。
 
而且百度出来的结果都是csdn式的抄袭:





 
问了腾讯云的技术人员,居然他们也不知道是什么。
 
因为笔者的3台腾讯云的轻量服务器都有这个进程:
 





 





 
因为占用的CPU不高,所以笔者认为这个不是病毒。
 
然后google了一下:
 





 
这才发现,这个只是linux底层的一个驱动。
 The rshim driver provides a way to access the rshim resources on the BlueField target from external host machine 查看全部
这个应用一直开者,而且还杀不死。
 
kill -9 pid
 
之后又会重新启动一个新的进程。 看着就像病毒或者木马的特征。
 
而且百度出来的结果都是csdn式的抄袭:

20220608005.jpg

 
问了腾讯云的技术人员,居然他们也不知道是什么。
 
因为笔者的3台腾讯云的轻量服务器都有这个进程:
 

20220608003.jpg

 

20220608002.jpg

 
因为占用的CPU不高,所以笔者认为这个不是病毒。
 
然后google了一下:
 

20220608006.jpg

 
这才发现,这个只是linux底层的一个驱动。
 
The rshim driver provides a way to access the rshim resources on the BlueField target from external host machine

golang gin ajax post 前端与后端的正确写法

Golang李魔佛 发表了文章 • 0 个评论 • 2087 次浏览 • 2022-06-08 18:42 • 来自相关话题

比较常用的场景,记录一下:
前端是一个页面html页面
<script type="text/javascript">
var submitBTN = document.getElementById("url_update");
submitBTN.onclick = function (event) {
// 注意这里是 onclick 函数
console.log("click");
$.ajax({
url: "/update-site1",
type: "POST",
data: {value:1},
cache: false,
contentType: "application/x-www-form-urlencoded",
success: function (data) {
console.log(data);

if (data.code !== 0) {
alert('更新失败')
} else {
new_str = data.res + " " + data.count
$("#txt_content").val(new_str);
alert('更新资源成功!')
}
},
fail: function (data) {
alert("更新失败!");
}
});

$.ajax({
url: "/update-site1",
type: "POST",
data: {value:2},
cache: false,
contentType: "application/x-www-form-urlencoded",
success: function (data) {
console.log(data);

if (data.code !== 0) {
alert('更新失败')
} else {
new_str = data.res + " " + data.count
$("#txt_content").val(new_str);
alert('更新资源成功!')
}
},
fail: function (data) {
alert("更新失败!");
}
})

}

</script>
效果大体上这样的:





 
有几个按钮,然后每个按钮绑定一个点击事件
 
submitBTN.onclick = function (event) {
.....
同上面代码
 
然后在代码里面执行post操作,使用的是ajax封装的方法:
 
注意,contentType用下面的:
contentType: "application/x-www-form-urlencoded",
还有不要把
processData: false,这个设置为false,否则gin的后端解析不到数据
 
写完前端之后,就去后端
 
路由方法:
绑定上面的url update-site1
router.POST("/update-site1", controllers.BaiduSite1)
 然后就是实现
controllers.BaiduSite1 这个方法:
 
func BaiduSite1(ctx *gin.Context) {
if ctx.Request.Method == "POST" {

value := ctx.PostForm("value")
fmt.Println(value)
int_value, err := strconv.Atoi(value)
if err != nil {
ctx.JSON(http.StatusOK, gin.H{
"code": 1,
"res": "",
"count": 0,
})
return
}
res, count := webmaster.PushProcess(1, int_value)
ctx.JSON(http.StatusOK, gin.H{
"code": 0,
"res": res,
"count": count,
})
}
}
 获取ajax里面的字段,
使用:context 中的PostForm方法
value := ctx.PostForm("value")
 剩下的就是一些常规的操作方法

最后需要设置json的返回数据
ctx.JSON(http.StatusOK, gin.H{
"code": 0,
"res": res,
"count": count,

 完整代码可以到公众号里面获取:
 


 
  查看全部
比较常用的场景,记录一下:
前端是一个页面html页面
<script type="text/javascript">
var submitBTN = document.getElementById("url_update");
submitBTN.onclick = function (event) {
// 注意这里是 onclick 函数
console.log("click");
$.ajax({
url: "/update-site1",
type: "POST",
data: {value:1},
cache: false,
contentType: "application/x-www-form-urlencoded",
success: function (data) {
console.log(data);

if (data.code !== 0) {
alert('更新失败')
} else {
new_str = data.res + " " + data.count
$("#txt_content").val(new_str);
alert('更新资源成功!')
}
},
fail: function (data) {
alert("更新失败!");
}
});

$.ajax({
url: "/update-site1",
type: "POST",
data: {value:2},
cache: false,
contentType: "application/x-www-form-urlencoded",
success: function (data) {
console.log(data);

if (data.code !== 0) {
alert('更新失败')
} else {
new_str = data.res + " " + data.count
$("#txt_content").val(new_str);
alert('更新资源成功!')
}
},
fail: function (data) {
alert("更新失败!");
}
})

}

</script>

效果大体上这样的:

20220608004.jpg

 
有几个按钮,然后每个按钮绑定一个点击事件
 
submitBTN.onclick = function (event) {
.....
同上面代码
 
然后在代码里面执行post操作,使用的是ajax封装的方法:
 
注意,contentType用下面的:
contentType: "application/x-www-form-urlencoded",

还有不要把
processData: false,
这个设置为false,否则gin的后端解析不到数据
 
写完前端之后,就去后端
 
路由方法:
绑定上面的url update-site1
	router.POST("/update-site1", controllers.BaiduSite1)

 然后就是实现
controllers.BaiduSite1 这个方法:
 
func BaiduSite1(ctx *gin.Context) {
if ctx.Request.Method == "POST" {

value := ctx.PostForm("value")
fmt.Println(value)
int_value, err := strconv.Atoi(value)
if err != nil {
ctx.JSON(http.StatusOK, gin.H{
"code": 1,
"res": "",
"count": 0,
})
return
}
res, count := webmaster.PushProcess(1, int_value)
ctx.JSON(http.StatusOK, gin.H{
"code": 0,
"res": res,
"count": count,
})
}
}

 获取ajax里面的字段,
使用:context 中的PostForm方法
value := ctx.PostForm("value")

 剩下的就是一些常规的操作方法

最后需要设置json的返回数据
ctx.JSON(http.StatusOK, gin.H{
"code": 0,
"res": res,
"count": count,

 完整代码可以到公众号里面获取:
 


 
 

轻量服务器原来都只是一个docker出来给你的应用

Linux李魔佛 发表了文章 • 0 个评论 • 1134 次浏览 • 2022-06-07 01:50 • 来自相关话题

一句话总结:轻量云服务器就是跑的 docker 镜像,所以当然卖的便宜。

之前的服务器好歹还给你弄个虚拟机,现在就是一个进程隔离而已,CPU 跑到 100%一段时间以后就开始失去响应了,没有强制进程调度,跑重负载肯定是不行的,所以叫:“轻量”,诚不欺我也……
一句话总结:轻量云服务器就是跑的 docker 镜像,所以当然卖的便宜。

之前的服务器好歹还给你弄个虚拟机,现在就是一个进程隔离而已,CPU 跑到 100%一段时间以后就开始失去响应了,没有强制进程调度,跑重负载肯定是不行的,所以叫:“轻量”,诚不欺我也……

python安装demjson报错:error in setup command: use_2to3 is invalid.

python李魔佛 发表了文章 • 0 个评论 • 2088 次浏览 • 2022-06-06 19:23 • 来自相关话题

原因:在setuptools 58之后的版本已经废弃了use_2to3所以安装一个旧版本的setuptools就可以了
 
随便整一个
pip install setuptools==57.5.0
原因:在setuptools 58之后的版本已经废弃了use_2to3
所以安装一个旧版本的setuptools就可以了
 
随便整一个
pip install setuptools==57.5.0

美股指数成分股历史数据

股票李魔佛 发表了文章 • 0 个评论 • 1207 次浏览 • 2022-06-06 12:53 • 来自相关话题

在网上找了很久这个数据,结果发现非常贫乏。 不像国内tushare,akshare,甚至交易所那样。可以查看某个指数的历史成分股变化。
 





找到的都是当前日期的数据。
 
所以搞了个程序定期获取。
 
每隔一个月获取一次。
 
图中数据为纳指100ETF成分股的历史数据




 
需要数据的可以关注公众号获取


后台回复:纳指100
  查看全部
在网上找了很久这个数据,结果发现非常贫乏。 不像国内tushare,akshare,甚至交易所那样。可以查看某个指数的历史成分股变化。
 

20220606001.png

找到的都是当前日期的数据。
 
所以搞了个程序定期获取。
 
每隔一个月获取一次。
 
图中数据为纳指100ETF成分股的历史数据
20220608001.jpg

 
需要数据的可以关注公众号获取


后台回复:纳指100
 

ubuntu用非root用户 无法启用80端口web服务

Linux李魔佛 发表了文章 • 0 个评论 • 1794 次浏览 • 2022-06-05 00:19 • 来自相关话题

需求 conda python
默认情况下,1024以下的端口,只有root用户可以使用,例如想用python3启动一个在80端口上的web服务,只能切换到root用户再启动。如果想不用root用户启动,怎么办呢?

解决办法
记录一种测试了的办法:
Linux 内核从 2.6.24 版本开始就有了能力的概念,这使得普通用户也能够做只有超级用户才能完成的工作。

使用 setcap 命令让指定程序拥有绑定端口的能力,这样即使程序运行在普通用户下,也能够绑定到 1024 以下的特权端口上。

# 给指定程序设置 CAP_NET_BIND_SERVICE 能力
$ sudo setcap cap_net_bind_service=+eip /home/xda/miniconda3/bin/python3.9


注意赋给的程序目标不能是软链接
 
注意 conda的python一般都是软链接
比如:

/home/xda/miniconda3/bin/python
很可能是指向
/home/xda/miniconda3/bin/python3.9的
 
如果使用的python路径 
/home/xda/miniconda3/bin/python

setcap cap_net_bind_service=+eip
 
会报错的。 查看全部
需求 conda python

默认情况下,1024以下的端口,只有root用户可以使用,例如想用python3启动一个在80端口上的web服务,只能切换到root用户再启动。如果想不用root用户启动,怎么办呢?

解决办法
记录一种测试了的办法:
Linux 内核从 2.6.24 版本开始就有了能力的概念,这使得普通用户也能够做只有超级用户才能完成的工作。

使用 setcap 命令让指定程序拥有绑定端口的能力,这样即使程序运行在普通用户下,也能够绑定到 1024 以下的特权端口上。

# 给指定程序设置 CAP_NET_BIND_SERVICE 能力
$ sudo setcap cap_net_bind_service=+eip /home/xda/miniconda3/bin/python3.9


注意赋给的程序目标不能是软链接
 
注意 conda的python一般都是软链接
比如:

/home/xda/miniconda3/bin/python
很可能是指向
/home/xda/miniconda3/bin/python3.9的
 
如果使用的python路径 
/home/xda/miniconda3/bin/python

setcap cap_net_bind_service=+eip
 
会报错的。

强赎日期计数 excel文件

可转债李魔佛 发表了文章 • 0 个评论 • 1312 次浏览 • 2022-06-04 22:54 • 来自相关话题

 
代码 名称 当前满足天数 强赎目标数 周期 以公告
113568 新春转债 已公告强赎
127043 川恒转债 暂不强赎
123086 海兰转债 暂不强赎
113548 石英转债 暂不强赎
128107 交科转债 已公告强赎
110071 湖盐转债 12 15 30
128111 中矿转债 暂不强赎
127013 创维转债 14 15 30
123092 天壕转债 暂不强赎
128046 利尔转债 19 20 30
127027 靖远转债 暂不强赎
113541 荣晟转债 公告要强赎
123085 万顺转2 暂不强赎
123083 朗新转债 12 15 30
128128 齐翔转2 暂不强赎
128106 华统转债 暂不强赎
113537 文灿转债 暂不强赎
128095 恩捷转债 已满足强赎条件
127007 湖广转债 暂不强赎
123012 万顺转债 暂不强赎
123057 美联转债 暂不强赎
113585 寿仙转债 暂不强赎
110061 川投转债 暂不强赎
113626 伯特转债 暂不强赎
113025 明泰转债 暂不强赎
123078 飞凯转债 暂不强赎
113567 君禾转债 暂不强赎
128017 金禾转债 暂不强赎
128040 华通转债 暂不强赎
128029 太阳转债 暂不强赎
123073 同和转债 暂不强赎
110055 伊力转债 暂不强赎
113525 台华转债 暂不强赎
123060 苏试转债 暂不强赎
127038 国微转债 暂不强赎
123046 天铁转债 暂不强赎
123098 一品转债 暂不强赎
110074 精达转债 暂不强赎
123114 三角转债 暂不强赎
113051 节能转债 暂不强赎
128140 润建转债 暂不强赎
123071 天能转债 暂不强赎
113027 华钰转债 暂不强赎
128091 新天转债 暂不强赎
128085 鸿达转债 暂不强赎
113620 傲农转债 暂不强赎
123052 飞鹿转债 暂不强赎
118000 嘉元转债 暂不强赎
128082 华锋转债 暂不强赎
128109 楚江转债 暂不强赎
113016 小康转债 暂不强赎
123027 蓝晓转债 暂不强赎
128137 洁美转债 暂不强赎
128101 联创转债 暂不强赎
123031 晶瑞转债 暂不强赎
128078 太极转债 暂不强赎
128030 天康转债 暂不强赎
123034 通光转债 暂不强赎
 
excel原文件:
http://xximg.30daydo.com/webupload/2022-06-04-redeem-info.xlsx
 
或者关注公众号:可转债量化分析
 
后台回复:
强赎20220604 查看全部
20220604003.png


20220604004.png

 
代码 名称 当前满足天数 强赎目标数 周期 以公告
113568 新春转债 已公告强赎
127043 川恒转债 暂不强赎
123086 海兰转债 暂不强赎
113548 石英转债 暂不强赎
128107 交科转债 已公告强赎
110071 湖盐转债 12 15 30
128111 中矿转债 暂不强赎
127013 创维转债 14 15 30
123092 天壕转债 暂不强赎
128046 利尔转债 19 20 30
127027 靖远转债 暂不强赎
113541 荣晟转债 公告要强赎
123085 万顺转2 暂不强赎
123083 朗新转债 12 15 30
128128 齐翔转2 暂不强赎
128106 华统转债 暂不强赎
113537 文灿转债 暂不强赎
128095 恩捷转债 已满足强赎条件
127007 湖广转债 暂不强赎
123012 万顺转债 暂不强赎
123057 美联转债 暂不强赎
113585 寿仙转债 暂不强赎
110061 川投转债 暂不强赎
113626 伯特转债 暂不强赎
113025 明泰转债 暂不强赎
123078 飞凯转债 暂不强赎
113567 君禾转债 暂不强赎
128017 金禾转债 暂不强赎
128040 华通转债 暂不强赎
128029 太阳转债 暂不强赎
123073 同和转债 暂不强赎
110055 伊力转债 暂不强赎
113525 台华转债 暂不强赎
123060 苏试转债 暂不强赎
127038 国微转债 暂不强赎
123046 天铁转债 暂不强赎
123098 一品转债 暂不强赎
110074 精达转债 暂不强赎
123114 三角转债 暂不强赎
113051 节能转债 暂不强赎
128140 润建转债 暂不强赎
123071 天能转债 暂不强赎
113027 华钰转债 暂不强赎
128091 新天转债 暂不强赎
128085 鸿达转债 暂不强赎
113620 傲农转债 暂不强赎
123052 飞鹿转债 暂不强赎
118000 嘉元转债 暂不强赎
128082 华锋转债 暂不强赎
128109 楚江转债 暂不强赎
113016 小康转债 暂不强赎
123027 蓝晓转债 暂不强赎
128137 洁美转债 暂不强赎
128101 联创转债 暂不强赎
123031 晶瑞转债 暂不强赎
128078 太极转债 暂不强赎
128030 天康转债 暂不强赎
123034 通光转债 暂不强赎
 
excel原文件:
http://xximg.30daydo.com/webupload/2022-06-04-redeem-info.xlsx
 
或者关注公众号:可转债量化分析
 
后台回复:
强赎20220604

星球文章 获取所有文章 爬虫

python爬虫李魔佛 发表了文章 • 0 个评论 • 1408 次浏览 • 2022-06-03 13:49 • 来自相关话题

挺讽刺的,星球自身没有目录结构,所以浏览文章,只能通过时间线,一些一年前的文章,基本就没有会看到,而且,星球的搜索功能也是一堆bug,处于搜不到的状态。
 




群里没有人没有吐槽过这个搜索功能的。
 
所以只好自己写个程序把自己的文章抓下来,作为文章目录:










 
生成的markdown文件





每次只需要运行python main.py 就可以拿到最新的星球文章链接了。 
 
需要源码可以在公众号联系~
  查看全部
挺讽刺的,星球自身没有目录结构,所以浏览文章,只能通过时间线,一些一年前的文章,基本就没有会看到,而且,星球的搜索功能也是一堆bug,处于搜不到的状态。
 
Screenshot_2022_0603_133612.jpg

群里没有人没有吐槽过这个搜索功能的。
 
所以只好自己写个程序把自己的文章抓下来,作为文章目录:

20220603002.png


20220603001.png

 
生成的markdown文件
20220603004.png


每次只需要运行python main.py 就可以拿到最新的星球文章链接了。 
 
需要源码可以在公众号联系~
 

网站状态码 514 Frequency Capped

网络李魔佛 发表了文章 • 0 个评论 • 3329 次浏览 • 2022-06-02 00:18 • 来自相关话题

网站出现这个报错,是什么原因?
 
原来问题出云服务器的限速问题上。
 
如果你在阿里云腾讯云设置了IP访问限频配置,假如设置了10QPS,
 





 
 
那么每秒不能超过10次访问速率。
 
如果你的网站图片多,很可能你的图片不会被正常加载,你的JS也可能不会被加载进来。
 
所以你可以把这个值稍微设大一点。
 
  查看全部

20220602001.png

网站出现这个报错,是什么原因?
 
原来问题出云服务器的限速问题上。
 
如果你在阿里云腾讯云设置了IP访问限频配置,假如设置了10QPS,
 

20220602002.png

 
 
那么每秒不能超过10次访问速率。
 
如果你的网站图片多,很可能你的图片不会被正常加载,你的JS也可能不会被加载进来。
 
所以你可以把这个值稍微设大一点。
 
 

NFT的邀请送藏品 机制

量化交易绫波丽 发表了文章 • 0 个评论 • 989 次浏览 • 2022-05-31 20:16 • 来自相关话题

兴趣驱使,进去这个领取去观摩观摩。
 
发现里面就是群加群,互相拉人头,拉够了人头,就会送藏品。
 
发几张图感受下: 

 
 
 

 
是不是有点传销的感觉?
 
哈哈。
 
比如注册下面的二维码:

 
然后在里面拉10个人,最后送一个未上市的藏品。
 
等上市后就卖出。 白嫖。
 
菜鸟入坑,想玩的可以注册白嫖试试,注意不要买,不要买,不要买,这样保证不会亏。
加好友一起研究哈 查看全部
兴趣驱使,进去这个领取去观摩观摩。
 
发现里面就是群加群,互相拉人头,拉够了人头,就会送藏品。
 
发几张图感受下: 

 
 
 

 
是不是有点传销的感觉?
 
哈哈。
 
比如注册下面的二维码:

 
然后在里面拉10个人,最后送一个未上市的藏品。
 
等上市后就卖出。 白嫖。
 
菜鸟入坑,想玩的可以注册白嫖试试,注意不要买,不要买,不要买,这样保证不会亏。
加好友一起研究哈

华林证券场内基金免五

券商万一免五绫波丽 发表了文章 • 0 个评论 • 1749 次浏览 • 2022-05-31 12:59 • 来自相关话题

目前笔者这里开户的华林证券的场内基金ETF,LOF免五,费率为万0.6。

其他完整费率:

股票: 万1免五

ETF/LOF: 万0.6免五,场内基金ETF,LOF免五

可转债:沪市:万0.6免五 深市:万0.6免五

两融:万1,利率6.5%起(可根据资金调整)

期权:2元/张 港股:万2

支持腾讯自选股,海豚股票APP。
 








需要的朋友可以联系微信扫码开通:

 
备注;开户 查看全部
目前笔者这里开户的华林证券的场内基金ETF,LOF免五,费率为万0.6。

其他完整费率:

股票: 万1免五

ETF/LOF: 万0.6免五,场内基金ETF,LOF免五

可转债:沪市:万0.6免五 深市:万0.6免五

两融:万1,利率6.5%起(可根据资金调整)

期权:2元/张 港股:万2

支持腾讯自选股,海豚股票APP。
 
20220531004.png

fe1632b17d7bc6b41094bad26bd60675.jpeg

需要的朋友可以联系微信扫码开通:

 
备注;开户

百度seo 索引量下降后如何自查

网络马化云 发表了文章 • 0 个评论 • 1201 次浏览 • 2022-05-31 11:59 • 来自相关话题

1、会不会是网站被黑客攻击后增加了大量垃圾网页
2、会不会是Robost协议出了问题,导致大批保密页面被百度抓取
3、大幅增加的url会不会占用有限的抓取配额,导致重要优质内容未被抓取
 





 
如果是因为百度误判,可以对其进行申诉
 

关于申诉,除了再一次播报申诉地址(http://ziyuan.baidu.com/feedback)外,我们给各位站长提个醒,在撰写申诉内容时应该尽量将问题描述具体,引用SEO爱好者痞子瑞的经验:“网站索引量异常,可以使用百度搜索资源平台(原百度站长平台)的索引量查询工具,一级一级的遍历一下自己网站的主要子域名或目录,以确定到底是哪个子域名或目录的索引量出现了异常。”“每个频道选取一些页面,在百度网页搜索中直接搜索这样页面的URL,以定位被删除快照网页的最小范围。”“然后在投诉内容中明确给出“病体”的URL,并附上相应的数据变动截图。”这样才便于处理投诉的百度工作人员快速寻找问题症结。 查看全部
1、会不会是网站被黑客攻击后增加了大量垃圾网页
2、会不会是Robost协议出了问题,导致大批保密页面被百度抓取
3、大幅增加的url会不会占用有限的抓取配额,导致重要优质内容未被抓取
 

011751413165869.jpeg

 
如果是因为百度误判,可以对其进行申诉
 


关于申诉,除了再一次播报申诉地址(http://ziyuan.baidu.com/feedback)外,我们给各位站长提个醒,在撰写申诉内容时应该尽量将问题描述具体,引用SEO爱好者痞子瑞的经验:“网站索引量异常,可以使用百度搜索资源平台(原百度站长平台)的索引量查询工具,一级一级的遍历一下自己网站的主要子域名或目录,以确定到底是哪个子域名或目录的索引量出现了异常。”“每个频道选取一些页面,在百度网页搜索中直接搜索这样页面的URL,以定位被删除快照网页的最小范围。”“然后在投诉内容中明确给出“病体”的URL,并附上相应的数据变动截图。”这样才便于处理投诉的百度工作人员快速寻找问题症结。


数字藏品NFT 的常见术语 入门必备

量化交易绫波丽 发表了文章 • 0 个评论 • 1732 次浏览 • 2022-05-31 11:48 • 来自相关话题

随着NFT的大火,入局NFT的人群基数迅速增加。许多人有了新身份,成为了“NFT藏家“。但同时也出现了一个尴尬的问题——NFT的行话让许多小白玩家一头雾水。本来是为了找到组织寻求帮助而加入社群的小白玩家,却完全看不懂大家的聊天内容,老藏家们的聊天不是一句话带3个英文缩写,就是充满看得懂的中文字连起来却读不懂的词语。

你和NFT老藏家的距离就像是“魔法师”和“麻瓜”之间的差距,那么接下来的20个术语,

一、基础平台和应用软件

1. OS:

Opensea的简称,国际NFT交易平台,是目前全球最多用户使用,市场份额占比最高,交易量最大的NFT交易平台。

2. DC

Discord的简称,功能强大的社群通讯软件。目前绝大部分NFT项目的社群聚集地,项目方通常在DC发布重要通道,进社群推广等等。也是目前许多自发NFT社群的根据地。

3. MetaMask (狐狸钱包):

以太坊生态系统中最受欢迎,用户数量最大的NFT钱包。

二、入门级必备术语

1. White List (白名单):

简称WL,也就是NFT项目的白名单。拥有白名单可以在项目公开发售前提前购买NFT,不用和大批人比网速比手速。尤其是在目前大火项目二级市场价格都偏高,而首发作品都处于上架秒空的情况下,白名单可以是“拿到即赚到”。

2. Blue Chips (蓝筹项目):

原指赌场上的蓝色筹码(赌场桌上最基础的筹码组合是1美元的白色筹码、5美元的红色筹码和25美元的蓝色筹码),蓝色筹码为最具有价值的筹码。延伸到蓝筹项目就是指有价值、建议长期持有的优质NFT。

3. Airdrop (空投):

你的钱包会免费收到一个NFT。目前空投被项目方广泛用来激励长期持有者,在国内大多用“转赠”来代替“空投”用法。

4. Mint(铸造) :

翻译成中文,做名词有薄荷的意思,做动词则是铸造。也就是生成NFT的过程,某一个NFT项目的首次铸造。

5. Gas Fee (燃料费):

燃料费, 也可理解成手续费。从技术层面来说,区块链的每一个节点都是需要维护的,而在以太坊中的每笔交易都需要“矿工们”帮你完成,而你则要支付一定的报酬给矿工们。在海外你需要使用eth等虚拟货币进行支付,而在国内则支持RMB支付。因而Gas Fee 也称作“矿工费”。

6. DAO

Decentralized Autonomous Organization的首字母缩写,也就是“去中心化自治组织”。目前多数NFT项目方都会有自己的DAO, 当你持有该项目的NFT时你就有资质成为DAO成员,DAO群成员拥有对该项目未来发展整体方向的治理权。通过DAO,项目方可以凝聚社群,从而提升项目的发展长驱动力。

7. Roadmap(路线图):

路线图,专门指某个NFT项目计划为社群增加价值而进行的一系列活动。路线图目前已经成为许多藏家入手新项目之前必须考察的一点,一个NFT项目是否拥有路线图在一定程度上决定了该项目的规划能力以及运营能力。

8. Floor Price (地板价):

地板价,指某一NFT项目在交易市场中的最低入手价格,Floor Price的价格越高,代表该NFT项目的整体价格走向明朗。抄底也是指在该项目处于Floor Price的时候大量购入,等待其后续的爆发时机。

三、进阶级术语

1. 10k project

指由约10000个头像组成的NFT项目,10k project 以Bored Ape Yacht Club 以及 Croptofunks 为代表。但值得注意的是,这里的10k并不是固定的,该术语仅指代这一类型的头像合集,并未规定10k 的具体数量。

2. PFP

PFP在不同的行业有着不同的含义,在NFT界的PFP特指[Profile Picture],也就是“个人资料图片”。不少10 projet 都是PFP项目,比如库里购入了Cryptofunk,并将它用作自己社交媒体的头像。目前,PFP仍然广收藏家的欢迎,拥有一个价值极高的NFT,可以彰显自己的财力和投资眼光。

3. FOMO:

Fear of Missing Out的首字母缩写——错失恐惧症,意思是害怕错过的情绪。类似于担心抢不到心仪的商品或怕比别人手慢而盲目跟风下单看到什么买什么。(这里建议大家理智购买藏品,不要过分FOMO)

4. Cope:

跟 FOMO 相反的意思,意识是后悔做了某事。比如因为之前没有在地板价的时候购入,目前价格一路飙升非常的Cope。又比如之前FOMO过头,买了太多现在积仓过多,非常后悔。

5. Apeing (into something):

这里的Apein和任何Ape项目都无关。是指,出于FOMO情绪,大量投入超出自己经济承受能力的资金,也指没有对NFT项目进行一个调研和了解就盲目进行投资。

6. Rug:

Rug pull 的缩写,原意为拉地毯,在NFT行业中延伸指:在项目方或者平台卷款潜逃事件。具体指:NFT项目的创建者争取到投资,然后突然放弃项目,骗取项目投资者的资金。比如Frosties项目创始人因Rug pull就被美国司法部指控欺诈和洗钱。

7.1:1 Art:

意思是指每件作品都是独一无二的(1 of 1),10k project中多数都是1:1 ART,这也是PFP项目容易受到市场追捧的一个原因。

8.McDonald's:

字面意思: 麦当劳。当有人在Discord中说 McDonald's则意味着没钱了,吃土,去搬砖的意思。国内社群更多用美团来代替。 查看全部
随着NFT的大火,入局NFT的人群基数迅速增加。许多人有了新身份,成为了“NFT藏家“。但同时也出现了一个尴尬的问题——NFT的行话让许多小白玩家一头雾水。本来是为了找到组织寻求帮助而加入社群的小白玩家,却完全看不懂大家的聊天内容,老藏家们的聊天不是一句话带3个英文缩写,就是充满看得懂的中文字连起来却读不懂的词语。

你和NFT老藏家的距离就像是“魔法师”和“麻瓜”之间的差距,那么接下来的20个术语,

一、基础平台和应用软件

1. OS:

Opensea的简称,国际NFT交易平台,是目前全球最多用户使用,市场份额占比最高,交易量最大的NFT交易平台。

2. DC

Discord的简称,功能强大的社群通讯软件。目前绝大部分NFT项目的社群聚集地,项目方通常在DC发布重要通道,进社群推广等等。也是目前许多自发NFT社群的根据地。

3. MetaMask (狐狸钱包):

以太坊生态系统中最受欢迎,用户数量最大的NFT钱包。

二、入门级必备术语

1. White List (白名单):

简称WL,也就是NFT项目的白名单。拥有白名单可以在项目公开发售前提前购买NFT,不用和大批人比网速比手速。尤其是在目前大火项目二级市场价格都偏高,而首发作品都处于上架秒空的情况下,白名单可以是“拿到即赚到”。

2. Blue Chips (蓝筹项目):

原指赌场上的蓝色筹码(赌场桌上最基础的筹码组合是1美元的白色筹码、5美元的红色筹码和25美元的蓝色筹码),蓝色筹码为最具有价值的筹码。延伸到蓝筹项目就是指有价值、建议长期持有的优质NFT。

3. Airdrop (空投):

你的钱包会免费收到一个NFT。目前空投被项目方广泛用来激励长期持有者,在国内大多用“转赠”来代替“空投”用法。

4. Mint(铸造) :

翻译成中文,做名词有薄荷的意思,做动词则是铸造。也就是生成NFT的过程,某一个NFT项目的首次铸造。

5. Gas Fee (燃料费):

燃料费, 也可理解成手续费。从技术层面来说,区块链的每一个节点都是需要维护的,而在以太坊中的每笔交易都需要“矿工们”帮你完成,而你则要支付一定的报酬给矿工们。在海外你需要使用eth等虚拟货币进行支付,而在国内则支持RMB支付。因而Gas Fee 也称作“矿工费”。

6. DAO

Decentralized Autonomous Organization的首字母缩写,也就是“去中心化自治组织”。目前多数NFT项目方都会有自己的DAO, 当你持有该项目的NFT时你就有资质成为DAO成员,DAO群成员拥有对该项目未来发展整体方向的治理权。通过DAO,项目方可以凝聚社群,从而提升项目的发展长驱动力。

7. Roadmap(路线图):

路线图,专门指某个NFT项目计划为社群增加价值而进行的一系列活动。路线图目前已经成为许多藏家入手新项目之前必须考察的一点,一个NFT项目是否拥有路线图在一定程度上决定了该项目的规划能力以及运营能力。

8. Floor Price (地板价):

地板价,指某一NFT项目在交易市场中的最低入手价格,Floor Price的价格越高,代表该NFT项目的整体价格走向明朗。抄底也是指在该项目处于Floor Price的时候大量购入,等待其后续的爆发时机。

三、进阶级术语

1. 10k project

指由约10000个头像组成的NFT项目,10k project 以Bored Ape Yacht Club 以及 Croptofunks 为代表。但值得注意的是,这里的10k并不是固定的,该术语仅指代这一类型的头像合集,并未规定10k 的具体数量。

2. PFP

PFP在不同的行业有着不同的含义,在NFT界的PFP特指[Profile Picture],也就是“个人资料图片”。不少10 projet 都是PFP项目,比如库里购入了Cryptofunk,并将它用作自己社交媒体的头像。目前,PFP仍然广收藏家的欢迎,拥有一个价值极高的NFT,可以彰显自己的财力和投资眼光。

3. FOMO:

Fear of Missing Out的首字母缩写——错失恐惧症,意思是害怕错过的情绪。类似于担心抢不到心仪的商品或怕比别人手慢而盲目跟风下单看到什么买什么。(这里建议大家理智购买藏品,不要过分FOMO)

4. Cope:

跟 FOMO 相反的意思,意识是后悔做了某事。比如因为之前没有在地板价的时候购入,目前价格一路飙升非常的Cope。又比如之前FOMO过头,买了太多现在积仓过多,非常后悔。

5. Apeing (into something):

这里的Apein和任何Ape项目都无关。是指,出于FOMO情绪,大量投入超出自己经济承受能力的资金,也指没有对NFT项目进行一个调研和了解就盲目进行投资。

6. Rug:

Rug pull 的缩写,原意为拉地毯,在NFT行业中延伸指:在项目方或者平台卷款潜逃事件。具体指:NFT项目的创建者争取到投资,然后突然放弃项目,骗取项目投资者的资金。比如Frosties项目创始人因Rug pull就被美国司法部指控欺诈和洗钱。

7.1:1 Art:

意思是指每件作品都是独一无二的(1 of 1),10k project中多数都是1:1 ART,这也是PFP项目容易受到市场追捧的一个原因。

8.McDonald's:

字面意思: 麦当劳。当有人在Discord中说 McDonald's则意味着没钱了,吃土,去搬砖的意思。国内社群更多用美团来代替。

ubuntu下最好的图形git管理工具kranken (免费版本)

Linux李魔佛 发表了文章 • 0 个评论 • 3504 次浏览 • 2022-05-30 19:06 • 来自相关话题

kranken  是笔者在ubuntu下用过最好的git图形界面工具。





 
不过最新的版本已经要收费了。
 
但是如果你用回以前的旧版本,还是可以依然免费的。[url]https://release.axocdn.com/lin ... 1.deb[/url]
[url]https://release.axocdn.com/lin ... 1.rpm[/url]
[url]https://release.axocdn.com/lin ... ar.gz[/url]
[url]https://release.axocdn.com/win ... 1.exe[/url]
 如果上面链接下载不了,可以换一个源。我在本地ip下似乎下不了,跑到腾讯云上的云服务器 就可以正常下载。
反正多试几次就可以。
 
不要点击安装,不然出错了,也不知道是什么问题。
 
使用命令行安装:sudo dpkg -i gitkraken-amd64.deb
如果报错,依赖出错,那么可以这样操作:sudo apt --fix-broken install
搞定 查看全部
kranken  是笔者在ubuntu下用过最好的git图形界面工具。

20220530003.png

 
不过最新的版本已经要收费了。
 
但是如果你用回以前的旧版本,还是可以依然免费的。
[url]https://release.axocdn.com/lin ... 1.deb[/url] 

[url]https://release.axocdn.com/lin ... 1.rpm[/url]

[url]https://release.axocdn.com/lin ... ar.gz[/url]

[url]https://release.axocdn.com/win ... 1.exe[/url]

 
如果上面链接下载不了,可以换一个源。我在本地ip下似乎下不了,跑到腾讯云上的云服务器 就可以正常下载。
反正多试几次就可以。
 
不要点击安装,不然出错了,也不知道是什么问题。
 
使用命令行安装:
sudo dpkg -i gitkraken-amd64.deb

如果报错,依赖出错,那么可以这样操作:
sudo apt --fix-broken install

搞定

忠告:千万不要在集思录开银河证券(中关村营业部) 有图为证

券商万一免五绫波丽 发表了文章 • 0 个评论 • 2644 次浏览 • 2022-05-30 15:47 • 来自相关话题

个人的亲身经历,在集思录上的广告贴帮家人开了几个银河证券的户。





 
就是这样的帖子,真TM害人。 直接扫描开户后,后面连经理都找不到,打电话,一直忙音,我的天。
 

 
 
上面是家人的中关村营业部的账户(并非随意喷这个垃圾营业部的,是确实开到这个营业部的)。
 
这个账户是很久前开的(大概3年前吧,疫情刚开始的时候),当时银河证券在集思录的页面是上宣传的是万一免五开户。所以当时也没有留意就开了。
 
开了之后由于一直做的基金套利和可转债交易。 股票没有交易过。
 
然后今天居然银行板块非常低估,所以打算入点银行股,定投计划。
 
结果上周买了一点苏州银行。
今天开交割单。
 

 
股票的费率是万3
 
现在都什么年代了,居然股票还能开出万3的费率。这个不确定他们是不是在背地里暗自把我这个账户的费率提高上去了。
 
然后打电话过去他们的营业部:
 






 
全程就一个字,拽。(当然手机也有自动录音)
 
我们营业部都是服务百万级别的大户,你爱用不用,现在北京疫情办事不方便,现在也没有免五,调不了免五了。
销户的话随意啦。
巴拉巴拉。
 
听完后,第二天就把账户清理了,预约了销户。
然后找了另外一个朋友,轻松开了费率万一免五的银河。
狗日的中关村银河。886
 
 
 
 
 
  查看全部
个人的亲身经历,在集思录上的广告贴帮家人开了几个银河证券的户。

20220530001.png

 
就是这样的帖子,真TM害人。 直接扫描开户后,后面连经理都找不到,打电话,一直忙音,我的天。
 

 
 
上面是家人的中关村营业部的账户(并非随意喷这个垃圾营业部的,是确实开到这个营业部的)。
 
这个账户是很久前开的(大概3年前吧,疫情刚开始的时候),当时银河证券在集思录的页面是上宣传的是万一免五开户。所以当时也没有留意就开了。
 
开了之后由于一直做的基金套利和可转债交易。 股票没有交易过。
 
然后今天居然银行板块非常低估,所以打算入点银行股,定投计划。
 
结果上周买了一点苏州银行。
今天开交割单。
 

 
股票的费率是万3
 
现在都什么年代了,居然股票还能开出万3的费率。这个不确定他们是不是在背地里暗自把我这个账户的费率提高上去了。
 
然后打电话过去他们的营业部:
 

Screenshot_20220530_154345_com.huawei_.contacts_.png


 
全程就一个字,拽。(当然手机也有自动录音)
 
我们营业部都是服务百万级别的大户,你爱用不用,现在北京疫情办事不方便,现在也没有免五,调不了免五了。
销户的话随意啦。
巴拉巴拉。
 
听完后,第二天就把账户清理了,预约了销户。
然后找了另外一个朋友,轻松开了费率万一免五的银河。
狗日的中关村银河。886
 
 
 
 
 
 

python seo 小工具 查询百度权重,备案信息

python李魔佛 发表了文章 • 0 个评论 • 1090 次浏览 • 2022-05-28 14:29 • 来自相关话题

平时主要比较频繁查询 站长之家这个网站:
 




还有百度的收录情况:





 
对于经常操作的朋友,需要使用程序查询,还可以批量查询,并保存到excel或者数据库。





 
上图为入库到mongodb的数据
 
源码实现:
main.py 入口函数:from baidu_collection import baidu_site_collect
from seo_info import crawl_info
from configure.settings import DBSelector
import datetime
import argparse

client = DBSelector().mongo('qq')
doc = client['db_parker']['seo']


def main():

parser = argparse.ArgumentParser()
'''
Command line options
'''
parser.add_argument(
'-n',
'--name', type=str,
help='input web domain'
)

parser.add_argument(
'-f',
'--file', type=str,
help='input web site domain file name'
)

FLAGS = parser.parse_args()
site_list=
if FLAGS.name:
print(FLAGS.name)
if '.' in FLAGS.name:
site_list.append(FLAGS.name)

elif FLAGS.file:
print(FLAGS.file)
with open(FLAGS.file,'r') as fp:
webs=fp.readlines()

site_list.extend(list(map(lambda x:x.strip(),webs)))

if site_list:

run(site_list=site_list)
else:
print("please input correct web domain")


def run(site_list):

# TODO: 改为命令行形式


for site in site_list:
count = baidu_site_collect(site)
info = crawl_info(site)
print(info)
print(count)
info['site'] = site
info['baidu_count'] = count
info['update_time'] = datetime.datetime.now()
doc.insert_one(info)


if __name__ == '__main__':
main()


其他具体实现的文件:
 
baidu_collection.py from parsel import Selector
import requests

def baidu_site_collect(site):
# 百度收录
headers = {'User-Agent': 'Chrome Google FireFox IE'}
url = 'https://www.baidu.com/s?wd=site:{}&rsv_spt=1&rsv_iqid=0xf8b7b7e50006c034&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_dl=ib&rsv_sug3=14&rsv_sug1=7&rsv_sug7=100&rsv_n=2&rsv_btype=i&inputT=8238&rsv_sug4=8238'.format(site)
resp = requests.get(
url=url,
headers=headers
)

resp.encoding='utf8'
html = resp.text
selector = Selector(text=html)

count = selector.xpath('//div[@class="op_site_domain c-row"]/div/p/span/b/text()').extract_first()
if count:
count=int(count.replace(',',''))
return count

if __name__=='__main__':
site='30daydo.com'
print(baidu_site_collect(site))




seo_info.pyimport argparse
from atexit import register
import sys
import requests
import re
from parsel import Selector

#参数自定义

# parser = argparse.ArgumentParser()
# parser.add_argument('-r', dest='read', help='path file')
# parser.add_argument('-u',dest='read',help='targetdomain')
# parser_args = parser.parse_args()
#爬虫模块查询

VERBOSE = True

def askurl(target_url):
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'
}


#baidu权重
baidu_url=f"https://rank.chinaz.com/{target_url}"
baidu_txt=requests.get(url=baidu_url,headers=headers)
baidu_html=baidu_txt.content.decode('utf-8')
baidu_PC=re.findall('PC端</i><img src="//csstools.chinaz.com/tools/images/rankicons/baidu(.*?).png"></a></li>',baidu_html,re.S)
baidu_moblie=re.findall('移动端</i><img src="//csstools.chinaz.com/tools/images/rankicons/bd(.*?).png"></a></li>',baidu_html,re.S)
#分割线
print("*"*60)

#如果查询html中有正则出来到权重关键字就输出,否则将不输出
result={}

baidu_pc_weight = None
baidu_mobile_weight = None

if len(baidu_PC) > 0:
print('百度_PC:', baidu_PC[0])
baidu_pc_weight=baidu_PC[0]
if len(baidu_moblie) > 0:
print('百度_moblie:', baidu_moblie[0])
baidu_mobile_weight = baidu_moblie[0]
else:
print("百度无权重")

result['baidu_pc_weight']=baidu_pc_weight
result['baidu_mobile_weight']=baidu_mobile_weight

#360权重
url=f"https://rank.chinaz.com/sorank/{target_url}/"
text = requests.get(url=url,headers=headers)
html=text.content.decode('utf-8')
sorank360_PC=re.findall('PC端</i><img src="//csstools.chinaz.com/tools/images/rankicons/360(.*?).png"></a><',html,re.S)
sorank360_Mobile=re.findall('移动端</i><img src="//csstools.chinaz.com/tools/images/rankicons/360(.*?).png"',html,re.S)

_360_pc_weight=None
_360_mobile_weight=None

# 如果查询html中有正则出来到权重关键字就输出,否则将不输出
if len(sorank360_PC) > 0:
_360_pc_weight=sorank360_PC[0]
print("360_PC:", sorank360_PC[0])
if len(sorank360_Mobile) > 0:
_360_mobile_weight=sorank360_Mobile[0]
print("360_moblie:", sorank360_Mobile[0])
else:
print("360无权重")

result['360_pc_weight']=_360_pc_weight
result['360_mobile_weight']=_360_mobile_weight


#搜狗权重


sogou_pc_weight=None
sogou_mobile_weight=None

sogou_url = f"https://rank.chinaz.com/sogoupc/{target_url}"
sougou_txt = requests.get(url=sogou_url, headers=headers)
sougou_html = sougou_txt.content.decode('utf-8')
sougou_PC = re.findall('PC端</i><img src="//csstools.chinaz.com/tools/images/rankicons/sogou(.*?).png"></a></li>',sougou_html, re.S)
sougou_mobile = re.findall('移动端</i><img src="//csstools.chinaz.com/tools/images/rankicons/sogou(.*?).png"></a></li>',sougou_html, re.S)

# 如果查询html中有正则出来到权重关键字就输出,否则将不输出
if len(sougou_PC) > 0:
print('搜狗_PC:', sougou_PC[1])
sogou_pc_weight=sougou_PC[1]

if len(sougou_mobile) > 0 :
print('搜狗_moblie:', sougou_mobile[1])
sogou_mobile_weight=sougou_mobile[1]

else:
print('搜狗无权重')


result['sogou_pc_weight']=sogou_pc_weight
result['sogou_mobile_weight']=sogou_mobile_weight


#神马权重
shenma_pc_weight =None
shenma_url=f'https://rank.chinaz.com/smrank/{target_url}'
shenma_txt=requests.get(url=shenma_url,headers=headers)
shenma_html=shenma_txt.content.decode('utf-8')
shenma_PC=re.findall('class="tc mt5"><img src="//csstools.chinaz.com/tools/images/rankicons/shenma(.*?).png"></a></li>',shenma_html,re.S)

# 如果查询html中有正则出来到权重关键字就输出,否则将不输出
if len(shenma_PC) > 0:
print('神马权重为:', shenma_PC[1])
shenma_pc_weight=shenma_PC[1]
else:
print("神马无权重")


result['shenma_pc_weight']=shenma_pc_weight
# result['shenma_mobile_weight']=None


#头条权重

toutiao_pc_weight=None
toutiao_url=f'https://rank.chinaz.com/toutiao/{target_url}'
toutiao_txt=requests.get(url=toutiao_url,headers=headers)
toutiao_html=toutiao_txt.content.decode('utf-8')
toutiao_PC=re.findall('class="tc mt5"><img src="//csstools.chinaz.com/tools/images/rankicons/toutiao(.*?).png"></a></li>',toutiao_html,re.S)

# 如果查询html中有正则出来到权重关键字就输出,否则将不输出
if len(toutiao_PC) > 0:
print('头条权重为:', toutiao_PC[1])
toutiao_pc_weight=toutiao_PC[1]
else:
print("头条无权重")

result['toutiao_pc_weight']=toutiao_pc_weight
# result['toutiao_mobile_weight']=None


#备案信息、title、企业性质
beian_url=f"https://seo.chinaz.com/{target_url}"
beian_txt=requests.get(url=beian_url,headers=headers)
beian_html=beian_txt.content.decode('utf-8')

with open('beian_html.html','w') as fp:
fp.write(beian_html)

title,beian_no,name,ip,nature,register,years=parse_info(beian_html)

result['name']=name
result['title']=title
result['beian_no']=beian_no
result['ip']=ip
result['nature']=nature
result['register']=register
result['years']=years


try:
print("备案信息:",beian_no,"名称:",name,"网站首页Title:",title,"企业性质:",nature,"IP地址为:",ip)
print("*"*60)
except:
print("没有查询到有效信息!")

return result

strip_fun = lambda x:x.strip() if x is not None else ""

def parse_info(html):

resp = Selector(text=html)
title = strip_fun(resp.xpath('//div[@class="_chinaz-seo-t2l ellipsis"]/text()').extract_first())
table = resp.xpath('//table[@class="_chinaz-seo-newt"]/tbody')

if table[0].xpath('.//tr[4]/td[2]/span[1]/i'):
beian_num=strip_fun(table[0].xpath('.//tr[4]/td[2]/span[1]/i/a/text()').extract_first())
else:
beian_num=strip_fun(table[0].xpath('.//tr[4]/td[2]/span[1]/a/text()').extract_first())

name=strip_fun(table[0].xpath('.//tr[4]/td[2]/span[2]/i/text()').extract_first())
if not name:
print('---->',name)
name=strip_fun(table[0].xpath('.//tr[4]/td[2]/span[2]/i/a/text()').extract_first())

nature=strip_fun(table[0].xpath('.//tr[4]/td[2]/span[3]/i/text()').extract_first())
ip=strip_fun(table[0].xpath('.//tr[5]/td[2]/div/span[1]/i/a/text()').extract_first())
register=strip_fun(table[0].xpath('.//tr[3]/td[2]/div[1]/span[1]/i/text()').extract_first())
years=strip_fun(table[0].xpath('.//tr[3]/td[2]/div[2]/span[1]/i/text()').extract_first())



return title,beian_num,name,ip,nature,register,years


def crawl_info(site):
return askurl(site)

if __name__ == '__main__':
main()
 
运行效果:





需要完整代码,可关注公众号联系: 查看全部
平时主要比较频繁查询 站长之家这个网站:
 
20220528005.png

还有百度的收录情况:

20220528006.png

 
对于经常操作的朋友,需要使用程序查询,还可以批量查询,并保存到excel或者数据库。

202205280071.png

 
上图为入库到mongodb的数据
 
源码实现:
main.py 入口函数:
from baidu_collection import baidu_site_collect
from seo_info import crawl_info
from configure.settings import DBSelector
import datetime
import argparse

client = DBSelector().mongo('qq')
doc = client['db_parker']['seo']


def main():

parser = argparse.ArgumentParser()
'''
Command line options
'''
parser.add_argument(
'-n',
'--name', type=str,
help='input web domain'
)

parser.add_argument(
'-f',
'--file', type=str,
help='input web site domain file name'
)

FLAGS = parser.parse_args()
site_list=
if FLAGS.name:
print(FLAGS.name)
if '.' in FLAGS.name:
site_list.append(FLAGS.name)

elif FLAGS.file:
print(FLAGS.file)
with open(FLAGS.file,'r') as fp:
webs=fp.readlines()

site_list.extend(list(map(lambda x:x.strip(),webs)))

if site_list:

run(site_list=site_list)
else:
print("please input correct web domain")


def run(site_list):

# TODO: 改为命令行形式


for site in site_list:
count = baidu_site_collect(site)
info = crawl_info(site)
print(info)
print(count)
info['site'] = site
info['baidu_count'] = count
info['update_time'] = datetime.datetime.now()
doc.insert_one(info)


if __name__ == '__main__':
main()


其他具体实现的文件:
 
baidu_collection.py 
from parsel import Selector
import requests

def baidu_site_collect(site):
# 百度收录
headers = {'User-Agent': 'Chrome Google FireFox IE'}
url = 'https://www.baidu.com/s?wd=site:{}&rsv_spt=1&rsv_iqid=0xf8b7b7e50006c034&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_dl=ib&rsv_sug3=14&rsv_sug1=7&rsv_sug7=100&rsv_n=2&rsv_btype=i&inputT=8238&rsv_sug4=8238'.format(site)
resp = requests.get(
url=url,
headers=headers
)

resp.encoding='utf8'
html = resp.text
selector = Selector(text=html)

count = selector.xpath('//div[@class="op_site_domain c-row"]/div/p/span/b/text()').extract_first()
if count:
count=int(count.replace(',',''))
return count

if __name__=='__main__':
site='30daydo.com'
print(baidu_site_collect(site))




seo_info.py
import argparse
from atexit import register
import sys
import requests
import re
from parsel import Selector

#参数自定义

# parser = argparse.ArgumentParser()
# parser.add_argument('-r', dest='read', help='path file')
# parser.add_argument('-u',dest='read',help='targetdomain')
# parser_args = parser.parse_args()
#爬虫模块查询

VERBOSE = True

def askurl(target_url):
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'
}


#baidu权重
baidu_url=f"https://rank.chinaz.com/{target_url}"
baidu_txt=requests.get(url=baidu_url,headers=headers)
baidu_html=baidu_txt.content.decode('utf-8')
baidu_PC=re.findall('PC端</i><img src="//csstools.chinaz.com/tools/images/rankicons/baidu(.*?).png"></a></li>',baidu_html,re.S)
baidu_moblie=re.findall('移动端</i><img src="//csstools.chinaz.com/tools/images/rankicons/bd(.*?).png"></a></li>',baidu_html,re.S)
#分割线
print("*"*60)

#如果查询html中有正则出来到权重关键字就输出,否则将不输出
result={}

baidu_pc_weight = None
baidu_mobile_weight = None

if len(baidu_PC) > 0:
print('百度_PC:', baidu_PC[0])
baidu_pc_weight=baidu_PC[0]
if len(baidu_moblie) > 0:
print('百度_moblie:', baidu_moblie[0])
baidu_mobile_weight = baidu_moblie[0]
else:
print("百度无权重")

result['baidu_pc_weight']=baidu_pc_weight
result['baidu_mobile_weight']=baidu_mobile_weight

#360权重
url=f"https://rank.chinaz.com/sorank/{target_url}/"
text = requests.get(url=url,headers=headers)
html=text.content.decode('utf-8')
sorank360_PC=re.findall('PC端</i><img src="//csstools.chinaz.com/tools/images/rankicons/360(.*?).png"></a><',html,re.S)
sorank360_Mobile=re.findall('移动端</i><img src="//csstools.chinaz.com/tools/images/rankicons/360(.*?).png"',html,re.S)

_360_pc_weight=None
_360_mobile_weight=None

# 如果查询html中有正则出来到权重关键字就输出,否则将不输出
if len(sorank360_PC) > 0:
_360_pc_weight=sorank360_PC[0]
print("360_PC:", sorank360_PC[0])
if len(sorank360_Mobile) > 0:
_360_mobile_weight=sorank360_Mobile[0]
print("360_moblie:", sorank360_Mobile[0])
else:
print("360无权重")

result['360_pc_weight']=_360_pc_weight
result['360_mobile_weight']=_360_mobile_weight


#搜狗权重


sogou_pc_weight=None
sogou_mobile_weight=None

sogou_url = f"https://rank.chinaz.com/sogoupc/{target_url}"
sougou_txt = requests.get(url=sogou_url, headers=headers)
sougou_html = sougou_txt.content.decode('utf-8')
sougou_PC = re.findall('PC端</i><img src="//csstools.chinaz.com/tools/images/rankicons/sogou(.*?).png"></a></li>',sougou_html, re.S)
sougou_mobile = re.findall('移动端</i><img src="//csstools.chinaz.com/tools/images/rankicons/sogou(.*?).png"></a></li>',sougou_html, re.S)

# 如果查询html中有正则出来到权重关键字就输出,否则将不输出
if len(sougou_PC) > 0:
print('搜狗_PC:', sougou_PC[1])
sogou_pc_weight=sougou_PC[1]

if len(sougou_mobile) > 0 :
print('搜狗_moblie:', sougou_mobile[1])
sogou_mobile_weight=sougou_mobile[1]

else:
print('搜狗无权重')


result['sogou_pc_weight']=sogou_pc_weight
result['sogou_mobile_weight']=sogou_mobile_weight


#神马权重
shenma_pc_weight =None
shenma_url=f'https://rank.chinaz.com/smrank/{target_url}'
shenma_txt=requests.get(url=shenma_url,headers=headers)
shenma_html=shenma_txt.content.decode('utf-8')
shenma_PC=re.findall('class="tc mt5"><img src="//csstools.chinaz.com/tools/images/rankicons/shenma(.*?).png"></a></li>',shenma_html,re.S)

# 如果查询html中有正则出来到权重关键字就输出,否则将不输出
if len(shenma_PC) > 0:
print('神马权重为:', shenma_PC[1])
shenma_pc_weight=shenma_PC[1]
else:
print("神马无权重")


result['shenma_pc_weight']=shenma_pc_weight
# result['shenma_mobile_weight']=None


#头条权重

toutiao_pc_weight=None
toutiao_url=f'https://rank.chinaz.com/toutiao/{target_url}'
toutiao_txt=requests.get(url=toutiao_url,headers=headers)
toutiao_html=toutiao_txt.content.decode('utf-8')
toutiao_PC=re.findall('class="tc mt5"><img src="//csstools.chinaz.com/tools/images/rankicons/toutiao(.*?).png"></a></li>',toutiao_html,re.S)

# 如果查询html中有正则出来到权重关键字就输出,否则将不输出
if len(toutiao_PC) > 0:
print('头条权重为:', toutiao_PC[1])
toutiao_pc_weight=toutiao_PC[1]
else:
print("头条无权重")

result['toutiao_pc_weight']=toutiao_pc_weight
# result['toutiao_mobile_weight']=None


#备案信息、title、企业性质
beian_url=f"https://seo.chinaz.com/{target_url}"
beian_txt=requests.get(url=beian_url,headers=headers)
beian_html=beian_txt.content.decode('utf-8')

with open('beian_html.html','w') as fp:
fp.write(beian_html)

title,beian_no,name,ip,nature,register,years=parse_info(beian_html)

result['name']=name
result['title']=title
result['beian_no']=beian_no
result['ip']=ip
result['nature']=nature
result['register']=register
result['years']=years


try:
print("备案信息:",beian_no,"名称:",name,"网站首页Title:",title,"企业性质:",nature,"IP地址为:",ip)
print("*"*60)
except:
print("没有查询到有效信息!")

return result

strip_fun = lambda x:x.strip() if x is not None else ""

def parse_info(html):

resp = Selector(text=html)
title = strip_fun(resp.xpath('//div[@class="_chinaz-seo-t2l ellipsis"]/text()').extract_first())
table = resp.xpath('//table[@class="_chinaz-seo-newt"]/tbody')

if table[0].xpath('.//tr[4]/td[2]/span[1]/i'):
beian_num=strip_fun(table[0].xpath('.//tr[4]/td[2]/span[1]/i/a/text()').extract_first())
else:
beian_num=strip_fun(table[0].xpath('.//tr[4]/td[2]/span[1]/a/text()').extract_first())

name=strip_fun(table[0].xpath('.//tr[4]/td[2]/span[2]/i/text()').extract_first())
if not name:
print('---->',name)
name=strip_fun(table[0].xpath('.//tr[4]/td[2]/span[2]/i/a/text()').extract_first())

nature=strip_fun(table[0].xpath('.//tr[4]/td[2]/span[3]/i/text()').extract_first())
ip=strip_fun(table[0].xpath('.//tr[5]/td[2]/div/span[1]/i/a/text()').extract_first())
register=strip_fun(table[0].xpath('.//tr[3]/td[2]/div[1]/span[1]/i/text()').extract_first())
years=strip_fun(table[0].xpath('.//tr[3]/td[2]/div[2]/span[1]/i/text()').extract_first())



return title,beian_num,name,ip,nature,register,years


def crawl_info(site):
return askurl(site)

if __name__ == '__main__':
main()

 
运行效果:

20220528072.png

需要完整代码,可关注公众号联系:

ubuntu下虚拟机对比virtualbox 和 vmware

Linux李魔佛 发表了文章 • 0 个评论 • 2092 次浏览 • 2022-05-28 01:27 • 来自相关话题

个人小白用户就选vmware player就好了。
 
virtual box当时选择的是在snap store安装的,不过安装完成之后系统依赖不满足,需要下载系统内核开发库。kernel-headers, kernel-devel. 这个整下来,需要800MB,并且很多系统依赖库可能要被重新安装,因为对应的版本可能对不上。
 






 
看到这,想起以前基本每年一次ubuntu重装经历,心有余悸。 思考略1秒,果断关闭,卸载virtual box。选择vmware的怀抱。
 
vmware的安装包是bundle格式,设置x 可执行权限后,直接安装就可以了。




 
一路顺畅。
  查看全部
个人小白用户就选vmware player就好了。
 
virtual box当时选择的是在snap store安装的,不过安装完成之后系统依赖不满足,需要下载系统内核开发库。kernel-headers, kernel-devel. 这个整下来,需要800MB,并且很多系统依赖库可能要被重新安装,因为对应的版本可能对不上。
 

20220528002.png


 
看到这,想起以前基本每年一次ubuntu重装经历,心有余悸。 思考略1秒,果断关闭,卸载virtual box。选择vmware的怀抱。
 
vmware的安装包是bundle格式,设置x 可执行权限后,直接安装就可以了。
20220528001.png

 
一路顺畅。
 

Got recursion not available from 8.8.8.8

网络李魔佛 发表了文章 • 0 个评论 • 1810 次浏览 • 2022-05-26 12:18 • 来自相关话题

github被墙,然后改dns也不管用。
返回的报错:Got recursion not available from 8.8.8.8
返回的github的ip地址还是为127.0.0.1
 
只能直接修改hosts文件了 查看全部
github被墙,然后改dns也不管用。
返回的报错:
Got recursion not available from 8.8.8.8

返回的github的ip地址还是为127.0.0.1
 
只能直接修改hosts文件了

原来ubuntu发行的版本数字是按照年份来定的22.04 是22年4月发行的

Linux李魔佛 发表了文章 • 0 个评论 • 1258 次浏览 • 2022-05-26 11:30 • 来自相关话题

怪不得以前好奇,怎么ubuntu为啥都是双数版本。
最早用的10.04 这么看就是12年前的操作系统了。
 
而18.04也差不多也是4年前的操作系统了。
 
而当前最新的应该就是22.04 LTS 长期支持版本了。
 
 
怪不得以前好奇,怎么ubuntu为啥都是双数版本。
最早用的10.04 这么看就是12年前的操作系统了。
 
而18.04也差不多也是4年前的操作系统了。
 
而当前最新的应该就是22.04 LTS 长期支持版本了。
 
 

github ssh 报错 Permission denied (publickey) 原因居然是DNS 污染!

网络李魔佛 发表了文章 • 0 个评论 • 1258 次浏览 • 2022-05-26 08:52 • 来自相关话题

折腾了一天,各种加密方式换了一遍。
最后还怀疑自己电脑的ssl文件被修改了, 重装了一遍 openssh client和server。
 
结果还造成了悲剧,snap store安装的应用全部不见了。(里面应用包含pycharm goland vs code,mysql连接工具等)。
 
最后ping了github的ip,居然是这个

 
 
到站长助手查了它的DNS:
 

 
那问题就解决了。
 
把hosts的github.com 映射为上面可以使用的那几个即可。
  查看全部
折腾了一天,各种加密方式换了一遍。
最后还怀疑自己电脑的ssl文件被修改了, 重装了一遍 openssh client和server。
 
结果还造成了悲剧,snap store安装的应用全部不见了。(里面应用包含pycharm goland vs code,mysql连接工具等)。
 
最后ping了github的ip,居然是这个

 
 
到站长助手查了它的DNS:
 

 
那问题就解决了。
 
把hosts的github.com 映射为上面可以使用的那几个即可。
 

B站累计500万播放量的UP主,收益有多少?

闲聊绫波丽 发表了文章 • 0 个评论 • 15830 次浏览 • 2022-05-25 03:09 • 来自相关话题

有点意思,看过一些所谓的大V的视频截图,然后发现这个收益率惨得可怜。
 
所以还是不建议大家靠这个B站视频来发财致富了。
 





 
累计300w的视频播放,总共收益只有300元,那么大概1万此播放,收益率只有1元,Oh my god。
 
感慨up主的时间真的很廉价。
 
再看多几个up主的收益。
 





 
大概有80w的播放量,然后总共的收益为600元
 





 
所以大概推算出来,B站上的收益,大约是1w的播放量,收益1元。 
 
 
 
  查看全部
有点意思,看过一些所谓的大V的视频截图,然后发现这个收益率惨得可怜。
 
所以还是不建议大家靠这个B站视频来发财致富了。
 

202205250051.png

 
累计300w的视频播放,总共收益只有300元,那么大概1万此播放,收益率只有1元,Oh my god。
 
感慨up主的时间真的很廉价。
 
再看多几个up主的收益。
 

20220525052.png

 
大概有80w的播放量,然后总共的收益为600元
 

20220525053.png

 
所以大概推算出来,B站上的收益,大约是1w的播放量,收益1元。 
 
 
 
 

vs code远程开发 ssh端口不是默认22时如何配置

网络李魔佛 发表了文章 • 0 个评论 • 1583 次浏览 • 2022-05-23 19:19 • 来自相关话题

有时候服务器的ssh端口不是22,比如时2222的时候,需要如何配置呢?
 
其实这个和ssh远程连接一样。
 
ssh root@192.168.1.1:2222
 
然后按下enter键 就可以了。
 
 
有时候服务器的ssh端口不是22,比如时2222的时候,需要如何配置呢?
 
其实这个和ssh远程连接一样。
 
ssh root@192.168.1.1:2222
 
然后按下enter键 就可以了。
 
 

B站批量下载某个UP主的所有视频

python李魔佛 发表了文章 • 0 个评论 • 2230 次浏览 • 2022-05-21 18:48 • 来自相关话题

B站上不少优秀的学习资源,下载到本地观看,便于快进,多倍速。 也可以放到平板,手机,在没有网络,或者网络条件不佳的环境下观看。
 

 
使用python实现
https://github.com/Rockyzsu/bilibili
 
B站视频下载
自动批量下载B站一个系列的视频

下载某个UP主的所有视频

使用:

下载you-get库,git clone https://github.com/soimort/you-get.git 复制其本地路径,比如/root/you-get/you-get

初次运行,删除history.db 文件, 修改配置文件config.py

START=1 # 下载系列视频的 第一个
END=1 # 下载系列视频的最后一个 , 比如一个系列教程有30个视频, start=5 ,end = 20 下载从第5个到第20个
ID='BV1oK411L7au' # 视频的ID
YOU_GET_PATH='/home/xda/othergit/you-get/you-get' # 你的you-get路径
MINS=1 # 每次循环等待1分钟
user_id = '518973111' # UP主的ID
total_page = 3 # up主的视频的页数
执行 python downloader.py ,进行下载循环

python people.py ,把某个up主的视频链接加入到待下载队列

python add_data.py --id=BV1oK411L7au --start=4 --end=8 下载视频id为BV1oK411L7au的系列教程,从第4开始,到第8个结束,如果只有一个的话,start和end设为1即可。

可以不断地往队列里面添加下载链接。
主要代码:
# @Time : 2019/1/28 14:19
# @File : youtube_downloader.py

import logging
import os
import subprocess
import datetime
import sqlite3
import time
from config import YOU_GET_PATH,MINS
CMD = 'python {} {}'
filename = 'url.txt'


class SQLite():
def __init__(self):
self.conn = sqlite3.connect('history.db')
self.cursor = self.conn.cursor()
self.create_table()

def create_table(self):
create_sql = 'create table if not exists tb_download (url varchar(100),status tinyint,crawltime datetime)'
create_record_tb = 'create table if not exists tb_record (idx varchar(100) PRIMARY KEY,start tinyint,end tinyint,status tinyint)'
self.cursor.execute(create_record_tb)
self.conn.commit()
self.cursor.execute(create_sql)
self.conn.commit()

def exists(self,url):
querySet = 'select * from tb_download where url = ? and status = 1'
self.cursor.execute(querySet,(url,))
ret = self.cursor.fetchone()
return True if ret else False

def insert_history(self,url,status):
query = 'select * from tb_download where url=?'
self.cursor.execute(query,(url,))
ret = self.cursor.fetchone()
current = datetime.datetime.now()

if ret:
insert_sql='update tb_download set status=?,crawltime=? where url = ?'
args=(status,status,current,url)
else:
insert_sql = 'insert into tb_download values(?,?,?)'
args=(url,status,current)

try:
self.cursor.execute(insert_sql,args)
except:
self.conn.rollback()
return False
else:
self.conn.commit()
return True

def get(self):
sql = 'select idx,start,end from tb_record where status=0'
self.cursor.execute(sql)
ret= self.cursor.fetchone()
return ret

def set(self,idx):
print('set status =1')
sql='update tb_record set status=1 where idx=?'
self.cursor.execute(sql,(idx,))
self.conn.commit()

def llogger(filename):
logger = logging.getLogger(filename) # 不加名称设置root logger

logger.setLevel(logging.DEBUG) # 设置输出级别

formatter = logging.Formatter(
'[%(asctime)s][%(filename)s][line: %(lineno)d]\[%(levelname)s] ## %(message)s)',
datefmt='%Y-%m-%d %H:%M:%S')

# 使用FileHandler输出到文件
prefix = os.path.splitext(filename)[0]
fh = logging.FileHandler(prefix + '.log')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)

# 使用StreamHandler输出到屏幕
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)

# 添加两个Handler
logger.addHandler(ch)
logger.addHandler(fh)
return logger


logger = llogger('download.log')
sql_obj = SQLite()

def run():
while 1:
result = sql_obj.get()
print(result)
if result:
idx=result[0]
start=result[1]
end=result[2]
try:
download_bilibili(idx,start,end)
except:
pass
else:
sql_obj.set(idx)
else:
time.sleep(MINS*60)

def download_bilibili(id,start_page,total_page):
global doc

bilibili_url = 'https://www.bilibili.com/video/{}?p={}'
for i in range(start_page, total_page+1):

next_url = bilibili_url.format(id, i)
if sql_obj.exists(next_url):
print('have download')
continue

try:
command = CMD.format(YOU_GET_PATH, next_url)
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
shell=True)

output, error = p.communicate()

except Exception as e:
print('has execption')
sql_obj.insert_history(next_url,status=0)
logger.error(e)
continue
else:
output_str = output.decode()
if len(output_str) == 0:
sql_obj.insert_history(next_url,status=0)
logger.info('下载失败')
continue

logger.info('{} has been downloaded !'.format(next_url))
sql_obj.insert_history(next_url,status=1)

run()

  查看全部
B站上不少优秀的学习资源,下载到本地观看,便于快进,多倍速。 也可以放到平板,手机,在没有网络,或者网络条件不佳的环境下观看。
 

 
使用python实现
https://github.com/Rockyzsu/bilibili
 
B站视频下载
自动批量下载B站一个系列的视频

下载某个UP主的所有视频

使用:

下载you-get库,git clone https://github.com/soimort/you-get.git 复制其本地路径,比如/root/you-get/you-get

初次运行,删除history.db 文件, 修改配置文件config.py

START=1 # 下载系列视频的 第一个
END=1 # 下载系列视频的最后一个 , 比如一个系列教程有30个视频, start=5 ,end = 20 下载从第5个到第20个
ID='BV1oK411L7au' # 视频的ID
YOU_GET_PATH='/home/xda/othergit/you-get/you-get' # 你的you-get路径
MINS=1 # 每次循环等待1分钟
user_id = '518973111' # UP主的ID
total_page = 3 # up主的视频的页数
执行 python downloader.py ,进行下载循环

python people.py ,把某个up主的视频链接加入到待下载队列

python add_data.py --id=BV1oK411L7au --start=4 --end=8 下载视频id为BV1oK411L7au的系列教程,从第4开始,到第8个结束,如果只有一个的话,start和end设为1即可。

可以不断地往队列里面添加下载链接。

主要代码:
# @Time : 2019/1/28 14:19
# @File : youtube_downloader.py

import logging
import os
import subprocess
import datetime
import sqlite3
import time
from config import YOU_GET_PATH,MINS
CMD = 'python {} {}'
filename = 'url.txt'


class SQLite():
def __init__(self):
self.conn = sqlite3.connect('history.db')
self.cursor = self.conn.cursor()
self.create_table()

def create_table(self):
create_sql = 'create table if not exists tb_download (url varchar(100),status tinyint,crawltime datetime)'
create_record_tb = 'create table if not exists tb_record (idx varchar(100) PRIMARY KEY,start tinyint,end tinyint,status tinyint)'
self.cursor.execute(create_record_tb)
self.conn.commit()
self.cursor.execute(create_sql)
self.conn.commit()

def exists(self,url):
querySet = 'select * from tb_download where url = ? and status = 1'
self.cursor.execute(querySet,(url,))
ret = self.cursor.fetchone()
return True if ret else False

def insert_history(self,url,status):
query = 'select * from tb_download where url=?'
self.cursor.execute(query,(url,))
ret = self.cursor.fetchone()
current = datetime.datetime.now()

if ret:
insert_sql='update tb_download set status=?,crawltime=? where url = ?'
args=(status,status,current,url)
else:
insert_sql = 'insert into tb_download values(?,?,?)'
args=(url,status,current)

try:
self.cursor.execute(insert_sql,args)
except:
self.conn.rollback()
return False
else:
self.conn.commit()
return True

def get(self):
sql = 'select idx,start,end from tb_record where status=0'
self.cursor.execute(sql)
ret= self.cursor.fetchone()
return ret

def set(self,idx):
print('set status =1')
sql='update tb_record set status=1 where idx=?'
self.cursor.execute(sql,(idx,))
self.conn.commit()

def llogger(filename):
logger = logging.getLogger(filename) # 不加名称设置root logger

logger.setLevel(logging.DEBUG) # 设置输出级别

formatter = logging.Formatter(
'[%(asctime)s][%(filename)s][line: %(lineno)d]\[%(levelname)s] ## %(message)s)',
datefmt='%Y-%m-%d %H:%M:%S')

# 使用FileHandler输出到文件
prefix = os.path.splitext(filename)[0]
fh = logging.FileHandler(prefix + '.log')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)

# 使用StreamHandler输出到屏幕
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)

# 添加两个Handler
logger.addHandler(ch)
logger.addHandler(fh)
return logger


logger = llogger('download.log')
sql_obj = SQLite()

def run():
while 1:
result = sql_obj.get()
print(result)
if result:
idx=result[0]
start=result[1]
end=result[2]
try:
download_bilibili(idx,start,end)
except:
pass
else:
sql_obj.set(idx)
else:
time.sleep(MINS*60)

def download_bilibili(id,start_page,total_page):
global doc

bilibili_url = 'https://www.bilibili.com/video/{}?p={}'
for i in range(start_page, total_page+1):

next_url = bilibili_url.format(id, i)
if sql_obj.exists(next_url):
print('have download')
continue

try:
command = CMD.format(YOU_GET_PATH, next_url)
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
shell=True)

output, error = p.communicate()

except Exception as e:
print('has execption')
sql_obj.insert_history(next_url,status=0)
logger.error(e)
continue
else:
output_str = output.decode()
if len(output_str) == 0:
sql_obj.insert_history(next_url,status=0)
logger.info('下载失败')
continue

logger.info('{} has been downloaded !'.format(next_url))
sql_obj.insert_history(next_url,status=1)

run()

 

python3的map是迭代器,不用for循环或者next触发是不会执行的

python李魔佛 发表了文章 • 0 个评论 • 1239 次浏览 • 2022-05-21 17:59 • 来自相关话题

最近刚好有位群友咨询,他写的代码如下:
def update_data(id,start,end):
status=0
conn = sqlite3.connect('history.db')
cursor = conn.cursor()
insert_sql ='insert into tb_record values(?,?,?,?)'

try:
cursor.execute(insert_sql,(id,start,end,status))
except Exception as e:
print(e)
print('Error')
else:
conn.commit()
print("successfully insert") 
bv_list = []
for i in range(1, total_page + 1):
bv_list.extend(visit(i))
print(bv_list)
map(lambda x:update_data(x,1,1),bv_list)
作用很简单,就是拿到列表后用map放入到sqlite里面。
但是上面的代码并不起作用。
因为map只是定义了一个迭代器,并没有被触发。
 
可以加一个list(map(lambda x:update_data(x,1,1),bv_list))
这样就可以执行了。 查看全部
最近刚好有位群友咨询,他写的代码如下:
def update_data(id,start,end):
status=0
conn = sqlite3.connect('history.db')
cursor = conn.cursor()
insert_sql ='insert into tb_record values(?,?,?,?)'

try:
cursor.execute(insert_sql,(id,start,end,status))
except Exception as e:
print(e)
print('Error')
else:
conn.commit()
print("successfully insert")
 
bv_list = []
for i in range(1, total_page + 1):
bv_list.extend(visit(i))
print(bv_list)
map(lambda x:update_data(x,1,1),bv_list)

作用很简单,就是拿到列表后用map放入到sqlite里面。
但是上面的代码并不起作用。
因为map只是定义了一个迭代器,并没有被触发。
 
可以加一个list(map(lambda x:update_data(x,1,1),bv_list))
这样就可以执行了。

dataframe如何 遍历所有的列?

python李魔佛 发表了文章 • 0 个评论 • 1998 次浏览 • 2022-05-21 02:16 • 来自相关话题

如果遍历行,我们经常会使用df.iterrows(), 而列呢?
可以使用df.items()
 Python pandas.DataFrame.items用法及代码示例
用法:
DataFrame.items()
迭代(列名,系列)对。

遍历 DataFrame 列,返回一个包含列名和内容的元组作为一个系列。

生成(Yield):
label:对象
被迭代的 DataFrame 的列名。

content:Series
属于每个标签的列条目,作为一个系列。

例子:
>>> df = pd.DataFrame({'species':['bear', 'bear', 'marsupial'],
... 'population':[1864, 22000, 80000]},
... index=['panda', 'polar', 'koala'])
>>> df
species population
panda bear 1864
polar bear 22000
koala marsupial 80000
>>> for label, content in df.items():
... print(f'label:{label}')
... print(f'content:{content}', sep='\n')
...
label:species
content:
panda bear
polar bear
koala marsupial
Name:species, dtype:object
label:population
content:
panda 1864
polar 22000
koala 80000
Name:population, dtype:int64 查看全部
如果遍历行,我们经常会使用df.iterrows(), 而列呢?
可以使用df.items()
 
Python pandas.DataFrame.items用法及代码示例
用法:
DataFrame.items()
迭代(列名,系列)对。

遍历 DataFrame 列,返回一个包含列名和内容的元组作为一个系列。

生成(Yield):
label:对象
被迭代的 DataFrame 的列名。

content:Series
属于每个标签的列条目,作为一个系列。

例子:
>>> df = pd.DataFrame({'species':['bear', 'bear', 'marsupial'],
... 'population':[1864, 22000, 80000]},
... index=['panda', 'polar', 'koala'])
>>> df
species population
panda bear 1864
polar bear 22000
koala marsupial 80000
>>> for label, content in df.items():
... print(f'label:{label}')
... print(f'content:{content}', sep='\n')
...
label:species
content:
panda bear
polar bear
koala marsupial
Name:species, dtype:object
label:population
content:
panda 1864
polar 22000
koala 80000
Name:population, dtype:int64

ubuntu20 conda安装python ta-lib 股票分析库

Linux李魔佛 发表了文章 • 0 个评论 • 1715 次浏览 • 2022-05-20 23:11 • 来自相关话题

. 使用 Anaconda 里面的conda 工具


$ conda install -c quantopian ta-lib=0.4.9一般而说,上面的会失败,可以按照下面的方法:2. 自己手工编译安装,适合需要自己修改内部的一些函数

a) 下载ta-lib的源码


$ wget [url=http://prdownloads.sourceforge ... ar.gz(]http://prdownloads.sourceforge ... ar.gz[/url] 如果无法下载的话,可以直接复制到浏览器下载,我的wget就是无法下载,估计有反盗链设计了

prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz或者文末也可以获取。


$ untar and cd  
$ ./configure --prefix=/usr  
$ make  
$ sudo make install  
假如之前用anaconda安装过,需要将生成的库替换到anaconda安装的目录


$ cp /usr/lib/libta_lib* /home/user/anaconda2/lib/  

b) 下载ta-lib的Python wrapper







pip install ta-lib或者

$ git clone https://github.com/mrjbq7/ta-lib.git  
$ cd ta-lib  
$ python setup.py install  最后在Python里面 import talib没有报错就安装成功了 
在公众号后台留言: talib 就可以获取文件。

  查看全部
. 使用 Anaconda 里面的conda 工具


$ conda install -c quantopian ta-lib=0.4.9
一般而说,上面的会失败,可以按照下面的方法:
2. 自己手工编译安装,适合需要自己修改内部的一些函数

a) 下载ta-lib的源码


$ wget [url=http://prdownloads.sourceforge ... ar.gz(]http://prdownloads.sourceforge ... ar.gz[/url]
如果无法下载的话,可以直接复制到浏览器下载,我的wget就是无法下载,估计有反盗链设计了

prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
或者文末也可以获取。


$ untar and cd  
$ ./configure --prefix=/usr  
$ make  
$ sudo make install  
假如之前用anaconda安装过,需要将生成的库替换到anaconda安装的目录


$ cp /usr/lib/libta_lib* /home/user/anaconda2/lib/  

b) 下载ta-lib的Python wrapper







pip install ta-lib
或者

$ git clone https://github.com/mrjbq7/ta-lib.git  
$ cd ta-lib  
$ python setup.py install  
最后在Python里面 import talib没有报错就安装成功了
 
在公众号后台留言: talib 就可以获取文件。