ubuntu/linux shell根据进程名杀死进程 一句搞定

Linux李魔佛 发表了文章 • 0 个评论 • 25 次浏览 • 2019-04-19 23:15 • 来自相关话题

ps -ef | grep "进程名" | grep -v grep | cut -c 10-16 | xargs kill -9 
比如我要杀死python的进程,就使用
 

ps -ef | grep "python" | grep -v grep | cut -c 10-16 | xargs kill -9
 
来使用。
 
grep -v grep 因为 ps 会把grep python这个进程也打印出来,所以-v 是反转的意思,不匹配的才打印出来,然后cut 是找出10到16位的字符,这里需要大家根据自己的用户名来调整。
一般ps -ef输出是 前面 用户名,然后空格, 接着是进程号。 如果你的用户名很长,可以调整10-16的位置来适应。
 
后面就是把进程号传递给kill作为参数,-9 是强制杀死。
 
  查看全部
ps -ef | grep "进程名" | grep -v grep | cut -c 10-16 | xargs kill -9
 
比如我要杀死python的进程,就使用
 

ps -ef | grep "python" | grep -v grep | cut -c 10-16 | xargs kill -9
 
来使用。
 
grep -v grep 因为 ps 会把grep python这个进程也打印出来,所以-v 是反转的意思,不匹配的才打印出来,然后cut 是找出10到16位的字符,这里需要大家根据自己的用户名来调整。
一般ps -ef输出是 前面 用户名,然后空格, 接着是进程号。 如果你的用户名很长,可以调整10-16的位置来适应。
 
后面就是把进程号传递给kill作为参数,-9 是强制杀死。
 
 

代理ip让用户访问网络不受限

python爬虫yiniuyun 发表了文章 • 0 个评论 • 40 次浏览 • 2019-04-18 17:47 • 来自相关话题

网络业内人士对于代理ip应该是十分熟悉的,由于很多网站访问的受限,很多人无法顺利的访问一些网站。尤其是对于一些国外网站想要访问都会受到IP地址的限制。那么该如何才能避免被受限呢?这就需要使用代理服务器才能确保网络访问不受限。

为什么代理ip在访问上不会受限呢?这就是其独特之处,由于代理所拥有的网络资源,IP资源是比较丰富的,因此可以有效的突破一些网络访问对于IP地址的限制。通过更换IP来正常访问需要访问的网站。在国内很多的网站都是属于局域网,一般用户是没有资格访问的。但是如果用代理的话就能够随意访问,只要用户需要就可进行访问。可以说这是属于一种将用户与网络世界彼此相连的保护墙,能够设置不同用户的访问权限,更好的保障用户的信息安全和数据安全,避免被黑的情况发生。

同时国内很多网络用户都受到电信的限制,而使用代理就能够突破相关的限制设置,从而便于访问。此外,代理还是专门的信息中转站,能够使得代理访问网络的速度大大增加。建立在这些优势的基础上使得其访问网络不再受限。

代理ip最大的作用就是能够突破限制,为用户带来更便利的访问需求。因此经常在网络中娱乐或者是网赚的用户都是可以采用这样的方式来突破自身IP的限制,为访问带来便利。亿牛云代理是基于Linux系统研发的平台,自营线路,电信机房宽带,私密家庭IP,为客户提供的是高质量的代理。www.16yun.cn

  查看全部


网络业内人士对于代理ip应该是十分熟悉的,由于很多网站访问的受限,很多人无法顺利的访问一些网站。尤其是对于一些国外网站想要访问都会受到IP地址的限制。那么该如何才能避免被受限呢?这就需要使用代理服务器才能确保网络访问不受限。

为什么代理ip在访问上不会受限呢?这就是其独特之处,由于代理所拥有的网络资源,IP资源是比较丰富的,因此可以有效的突破一些网络访问对于IP地址的限制。通过更换IP来正常访问需要访问的网站。在国内很多的网站都是属于局域网,一般用户是没有资格访问的。但是如果用代理的话就能够随意访问,只要用户需要就可进行访问。可以说这是属于一种将用户与网络世界彼此相连的保护墙,能够设置不同用户的访问权限,更好的保障用户的信息安全和数据安全,避免被黑的情况发生。

同时国内很多网络用户都受到电信的限制,而使用代理就能够突破相关的限制设置,从而便于访问。此外,代理还是专门的信息中转站,能够使得代理访问网络的速度大大增加。建立在这些优势的基础上使得其访问网络不再受限。

代理ip最大的作用就是能够突破限制,为用户带来更便利的访问需求。因此经常在网络中娱乐或者是网赚的用户都是可以采用这样的方式来突破自身IP的限制,为访问带来便利。亿牛云代理是基于Linux系统研发的平台,自营线路,电信机房宽带,私密家庭IP,为客户提供的是高质量的代理。www.16yun.cn

 

python不支持多重继承中的重复继承

python李魔佛 发表了文章 • 0 个评论 • 27 次浏览 • 2019-04-18 16:36 • 来自相关话题

代码如下:
class First(object):
def __init__(self):
print("first")

class Second(First):
def __init__(self):
print("second")

class Third(First,Second):
def __init__(self):
print("third")
运行代码会直接报错:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-6-c90f7b77d3e0> in <module>()
7 print("second")
8
----> 9 class Third(First,Second):
10 def __init__(self):
11 print("third")

TypeError: Cannot create a consistent method resolution order (MRO) for bases First, Second
  查看全部
代码如下:
class First(object):
def __init__(self):
print("first")

class Second(First):
def __init__(self):
print("second")

class Third(First,Second):
def __init__(self):
print("third")

运行代码会直接报错:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-6-c90f7b77d3e0> in <module>()
7 print("second")
8
----> 9 class Third(First,Second):
10 def __init__(self):
11 print("third")

TypeError: Cannot create a consistent method resolution order (MRO) for bases First, Second

 

gevent异步 入门教程(入坑)

python李魔佛 发表了文章 • 0 个评论 • 25 次浏览 • 2019-04-18 11:37 • 来自相关话题

code1
import time
import gevent
import requests
def foo():
print('Running in foo')

r=requests.get('http://30daydo.com')
print(r.status_code)
print('Explicit context switch to foo again')

def bar():
print('Explicit context to bar')

r=requests.get('http://www.qq.com') #
print(r.status_code)
print('Implicit context switch back to bar')

start=time.time()
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
print('time used {}'.format(time.time()-start))
上面的异步代码不起作用,因为requests阻塞了,所以用的时间和顺序执行的时间一样.
 
或者用以下代码替代:
import time
import gevent
import requests
def foo():
print('Running in foo')
time.sleep(2) # 这样子不起作用
print('Explicit context switch to foo again')

def bar():
print('Explicit context to bar')
time.sleep(2)
print('Implicit context switch back to bar')

start=time.time()
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
print('time used {}'.format(time.time()-start))
把访问网络部分使用sleep替代,那么最后的运行时间是2+2 =4秒,并不是2秒,那么要怎样才是2秒呢,需要改成以下的代码:
 
import time
import gevent
import requests
def foo():
print('Running in foo')

gevent.sleep(2) # 通过它各自yield向对方

print('Explicit context switch to foo again')

def bar():
print('Explicit context to bar')

gevent.sleep(2)

print('Implicit context switch back to bar')

start=time.time()
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
print('time used {}'.format(time.time()-start))
使用gevent.sleep()
这个函数才可以达到目的. 查看全部
code1
import time
import gevent
import requests
def foo():
print('Running in foo')

r=requests.get('http://30daydo.com')
print(r.status_code)
print('Explicit context switch to foo again')

def bar():
print('Explicit context to bar')

r=requests.get('http://www.qq.com') #
print(r.status_code)
print('Implicit context switch back to bar')

start=time.time()
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
print('time used {}'.format(time.time()-start))

上面的异步代码不起作用,因为requests阻塞了,所以用的时间和顺序执行的时间一样.
 
或者用以下代码替代:
import time
import gevent
import requests
def foo():
print('Running in foo')
time.sleep(2) # 这样子不起作用
print('Explicit context switch to foo again')

def bar():
print('Explicit context to bar')
time.sleep(2)
print('Implicit context switch back to bar')

start=time.time()
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
print('time used {}'.format(time.time()-start))

把访问网络部分使用sleep替代,那么最后的运行时间是2+2 =4秒,并不是2秒,那么要怎样才是2秒呢,需要改成以下的代码:
 
import time
import gevent
import requests
def foo():
print('Running in foo')

gevent.sleep(2) # 通过它各自yield向对方

print('Explicit context switch to foo again')

def bar():
print('Explicit context to bar')

gevent.sleep(2)

print('Implicit context switch back to bar')

start=time.time()
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
print('time used {}'.format(time.time()-start))

使用gevent.sleep()
这个函数才可以达到目的.

python的pip安装mysqldb

python李魔佛 发表了文章 • 0 个评论 • 41 次浏览 • 2019-04-16 23:51 • 来自相关话题

换一个新环境,或者在另一台服务器上运行自己的程序,最烦就是pip安装各种依赖,尤其其他机器上的python不一致(你用的是python3,服务器用的是python2),或者两个系统都不一致。 这个时候pip安装第三方库就很折腾。
 
比如mysqldb这个库,windows用python2不知道怎样才能装上。 反正这个我几年装过,现在已经忘记怎么安装了。
今天又要装一遍,为了减轻痛苦,安装anaconda,然后使用conda install mysqldb,conda会帮你把依赖都解决掉。 不然你要装一堆的VC8,VC14, 等等。
 
然后等待一下,就安装好了。 查看全部
换一个新环境,或者在另一台服务器上运行自己的程序,最烦就是pip安装各种依赖,尤其其他机器上的python不一致(你用的是python3,服务器用的是python2),或者两个系统都不一致。 这个时候pip安装第三方库就很折腾。
 
比如mysqldb这个库,windows用python2不知道怎样才能装上。 反正这个我几年装过,现在已经忘记怎么安装了。
今天又要装一遍,为了减轻痛苦,安装anaconda,然后使用conda install mysqldb,conda会帮你把依赖都解决掉。 不然你要装一堆的VC8,VC14, 等等。
 
然后等待一下,就安装好了。

最流行的版本控制软件:git 个人笔记

python李魔佛 发表了文章 • 0 个评论 • 39 次浏览 • 2019-04-16 23:37 • 来自相关话题

最流行的版本控制软件:git
========================

git已经是当前最流行的版本控制软件之一了。全世界的程序员都在使用它。它出自linus大神之手,现在被用于内
核的版本控制。在最流行的代码托管软件github,你几乎可以找到所有开源项目的代码。

版块控制软件:我需要吗?
-----------------------

的确对于许多人——尤其是非程序员,他们可能不会想到已经出现了专门的版本控制的软件。但其实多人对版本控
制其实都有类似的需求,举个例子,Tom是社团的秘书处成员,他们经常需要做的事情就是写活动文档,然后不停地
改改到大家都觉得可以了。

不幸运的话,Tom可能有个文件夹叫“openSUSE活动策划",里面有这样的一堆文件”openSUSE活动策划", "活动策
划1", "活动策划2", "活动策划3", "活动策划4" ... "活动策划20" (可怜的Tom,一份文档改了不少于20次)

这种作法很有效,因为我们可能发现第5个版本的策划有问题,我们准备在第3个版本上面重新来过。但是也看到,
这个作法有些很丑陋的地方:一份文件,我们留了20个备份,而且还要注意文件名。

如果可以这样就好了:文件夹上只有一个“openSUSE活动策划",但当我需要第5个版本的时候,我来一个”给我还
原到第5个版本吧!“,然后这时候我们打开这个文件,它就是第5个版本的了。类似的,我们可以取出任意的版本


这就是版本控制。这种事情在程序里面发生的太多了,于是出现了各种版本控制软件。事实上,有些项目已经发展
到第1000+甚至更高的版本数了……

单线的工作流
------------

我们可以把我们的一个项目想象为一个仓库,然后我们可以把我们的东西塞进仓库里面,也可以把想要的东西拿出
来。而git则是仓库的管理员。下面是一个例子,希望有一个直观的印象,不求完全的理解和掌握。

```bash
mkdir myproject // 假设myproject是工作目录
cd myproject
git init // git <- (init) ,告诉仓库管理员,在当前目录初始化
echo 'Eat the banana' > file // 编辑了一个文件
git add file // 加入仓库
git commit -m 'add first file' // 提交更改
echo 'Eat the apply' > file // 修改了这个文件
git add file // 加入仓库
git commit -m 'update first file' // 再提交更改
```

这时候我们就有两个commit了,我们来看看工作日志:

```bash
git log

# 以下是输出
# commit ac1371173b4e630ddaebda3f9f5d948b36146c07
# Author: Norman Mo <LTaoist@@@>
# Date: Thu Jun 27 21:59:10 2013 +0800
#
# update first file
#
# commit 3c43cc913454f92bb4b80c56ba45e4ffaf556fc0
# Author: Norman Mo <LTaoist6@@@@>
# Date: Thu Jun 27 21:58:48 2013 +0800
#
# add first file
```

看到了,我们提交了两次。我们来看看现在file里面是什么:

```bash
cat file # 显然输出是 'Eat the apply'
# 现在,我们来拿回第一个版本的file文件
git checkout 3c43cc913454f92bb4b80c56ba45e4ffaf556fc0 -- file
cat file # 这时候就是eat banana了
```

这种工作的方式是单人使用最常见的方式,写一点代码,提交一下到仓库里面。写一点,提交到仓库里面。然后出
问题的时候就回退过去。git非常强大,基本上你想到的他都可以做到,提交到仓库的数据基本不会丢失,像时间机
器一样控制着代码。

多人协作
--------

git非常强大,上面只是一个功能。考虑Tom的秘书处有两个人,他们在同时写。其中Tom写前6章,他的同伴写第7~
12章。

这时候可以考虑用这种工作的方式:设立一个公共的仓库。Tom维护自己的版本,他的同伴维护自己的版本。然后大
家定期把代码合并到公共仓库上面,然后定期把新的版本取回来合并再提交到公共仓库。

如果他们用纯文本,得益于一些文本分析的方法,几乎不需要校对就可以做到。

```
git commit -m 'finish ch5' // 假设此时Tom写完了第5章
git push // Tom将代码推送到远程仓库
```

```
git commit -m 'finish ch11' // 假设此时Tom的同伴完成了第11章
git pull // pull会将最新版本拉下来,合并,然后推送到远程仓库
```

实际上工作中,为了不混淆,会新开一个分支来开发新的特性,然后对分支进行合并。

代码自动发布
-----------

另一个很强大的功能是可以实现代码的自动发布。事实上,很多云就有使用这个。具体来说,利用git的hooks,当
服务器收到一个push,服务器可以自动运行一些脚本。也可以在客户端使用hooks,当客户端准备push的时候,客户
端先运行一些脚本。

例如,我们希望在每次服务器收到push以后,杀死全部的 `p` 进程,然后重开 `p` 进程。我们可以修改 `hooks/
post-receive` :

```
echo "Killing all p process..."
killall -9 p
echo "Restart p process..."
p
```

更多更多更多……
---------------

这份教程就到这里了,更多的自己马上动手去试试吧!

在openSUSE的安装方法:

```
sudo zypper in git
```

默认应该就装了。

一般linux命令查看帮助都是 `--help` 选项:

```
git --help
```

此外,对一个子命令也是有help看的:

```
git init --help
```

这里有一个交互教程,在浏览器上面跑的模拟git的运行的,有兴趣的试试:

<http://try.github.io/>

github的help文档写得很不错,推荐一下:

<https://help.github.com/>

书籍有个远近闻名的《Pro Git》,而且有中文版的,虽然我认为这本书太厚了。。。但似乎就这么一本书……

<http://git-scm.com/book/zh>

国内有个gitcafe,也是做git托管的,他们也有整理一份help:

<https://gitcafe.com/GitCafe/Help>

记得,上面只是一个演示,多试试push,多尝试。有一天你会喜欢用这个有效的工具的。

很有用!!! 查看全部

最流行的版本控制软件:git
========================

git已经是当前最流行的版本控制软件之一了。全世界的程序员都在使用它。它出自linus大神之手,现在被用于内
核的版本控制。在最流行的代码托管软件github,你几乎可以找到所有开源项目的代码。

版块控制软件:我需要吗?
-----------------------

的确对于许多人——尤其是非程序员,他们可能不会想到已经出现了专门的版本控制的软件。但其实多人对版本控
制其实都有类似的需求,举个例子,Tom是社团的秘书处成员,他们经常需要做的事情就是写活动文档,然后不停地
改改到大家都觉得可以了。

不幸运的话,Tom可能有个文件夹叫“openSUSE活动策划",里面有这样的一堆文件”openSUSE活动策划", "活动策
划1", "活动策划2", "活动策划3", "活动策划4" ... "活动策划20" (可怜的Tom,一份文档改了不少于20次)

这种作法很有效,因为我们可能发现第5个版本的策划有问题,我们准备在第3个版本上面重新来过。但是也看到,
这个作法有些很丑陋的地方:一份文件,我们留了20个备份,而且还要注意文件名。

如果可以这样就好了:文件夹上只有一个“openSUSE活动策划",但当我需要第5个版本的时候,我来一个”给我还
原到第5个版本吧!“,然后这时候我们打开这个文件,它就是第5个版本的了。类似的,我们可以取出任意的版本


这就是版本控制。这种事情在程序里面发生的太多了,于是出现了各种版本控制软件。事实上,有些项目已经发展
到第1000+甚至更高的版本数了……

单线的工作流
------------

我们可以把我们的一个项目想象为一个仓库,然后我们可以把我们的东西塞进仓库里面,也可以把想要的东西拿出
来。而git则是仓库的管理员。下面是一个例子,希望有一个直观的印象,不求完全的理解和掌握。

```bash
mkdir myproject // 假设myproject是工作目录
cd myproject
git init // git <- (init) ,告诉仓库管理员,在当前目录初始化
echo 'Eat the banana' > file // 编辑了一个文件
git add file // 加入仓库
git commit -m 'add first file' // 提交更改
echo 'Eat the apply' > file // 修改了这个文件
git add file // 加入仓库
git commit -m 'update first file' // 再提交更改
```

这时候我们就有两个commit了,我们来看看工作日志:

```bash
git log

# 以下是输出
# commit ac1371173b4e630ddaebda3f9f5d948b36146c07
# Author: Norman Mo <LTaoist@@@>
# Date: Thu Jun 27 21:59:10 2013 +0800
#
# update first file
#
# commit 3c43cc913454f92bb4b80c56ba45e4ffaf556fc0
# Author: Norman Mo <LTaoist6@@@@>
# Date: Thu Jun 27 21:58:48 2013 +0800
#
# add first file
```

看到了,我们提交了两次。我们来看看现在file里面是什么:

```bash
cat file # 显然输出是 'Eat the apply'
# 现在,我们来拿回第一个版本的file文件
git checkout 3c43cc913454f92bb4b80c56ba45e4ffaf556fc0 -- file
cat file # 这时候就是eat banana了
```

这种工作的方式是单人使用最常见的方式,写一点代码,提交一下到仓库里面。写一点,提交到仓库里面。然后出
问题的时候就回退过去。git非常强大,基本上你想到的他都可以做到,提交到仓库的数据基本不会丢失,像时间机
器一样控制着代码。

多人协作
--------

git非常强大,上面只是一个功能。考虑Tom的秘书处有两个人,他们在同时写。其中Tom写前6章,他的同伴写第7~
12章。

这时候可以考虑用这种工作的方式:设立一个公共的仓库。Tom维护自己的版本,他的同伴维护自己的版本。然后大
家定期把代码合并到公共仓库上面,然后定期把新的版本取回来合并再提交到公共仓库。

如果他们用纯文本,得益于一些文本分析的方法,几乎不需要校对就可以做到。

```
git commit -m 'finish ch5' // 假设此时Tom写完了第5章
git push // Tom将代码推送到远程仓库
```

```
git commit -m 'finish ch11' // 假设此时Tom的同伴完成了第11章
git pull // pull会将最新版本拉下来,合并,然后推送到远程仓库
```

实际上工作中,为了不混淆,会新开一个分支来开发新的特性,然后对分支进行合并。

代码自动发布
-----------

另一个很强大的功能是可以实现代码的自动发布。事实上,很多云就有使用这个。具体来说,利用git的hooks,当
服务器收到一个push,服务器可以自动运行一些脚本。也可以在客户端使用hooks,当客户端准备push的时候,客户
端先运行一些脚本。

例如,我们希望在每次服务器收到push以后,杀死全部的 `p` 进程,然后重开 `p` 进程。我们可以修改 `hooks/
post-receive` :

```
echo "Killing all p process..."
killall -9 p
echo "Restart p process..."
p
```

更多更多更多……
---------------

这份教程就到这里了,更多的自己马上动手去试试吧!

在openSUSE的安装方法:

```
sudo zypper in git
```

默认应该就装了。

一般linux命令查看帮助都是 `--help` 选项:

```
git --help
```

此外,对一个子命令也是有help看的:

```
git init --help
```

这里有一个交互教程,在浏览器上面跑的模拟git的运行的,有兴趣的试试:

<http://try.github.io/>

github的help文档写得很不错,推荐一下:

<https://help.github.com/>

书籍有个远近闻名的《Pro Git》,而且有中文版的,虽然我认为这本书太厚了。。。但似乎就这么一本书……

<http://git-scm.com/book/zh>

国内有个gitcafe,也是做git托管的,他们也有整理一份help:

<https://gitcafe.com/GitCafe/Help>

记得,上面只是一个演示,多试试push,多尝试。有一天你会喜欢用这个有效的工具的。

很有用!!!

逸仙时空公众号

闲聊绫波丽 发表了文章 • 0 个评论 • 33 次浏览 • 2019-04-15 23:00 • 来自相关话题

纪念逝去的校园青春,可惜了这么好的一个平台。
公众号里面每天会发布一篇以前bbs上的文摘。曾经我们的师兄师姐,曾经也是那么青葱羞涩。 现在已经都是人父人母。





 
纪念逝去的校园青春,可惜了这么好的一个平台。
公众号里面每天会发布一篇以前bbs上的文摘。曾经我们的师兄师姐,曾经也是那么青葱羞涩。 现在已经都是人父人母。

扫码_搜索联合传播样式-微信标准绿版.png

 

修改win7 hosts文件IP域名映射问题的一个坑

网络安全李魔佛 发表了文章 • 0 个评论 • 41 次浏览 • 2019-04-13 20:33 • 来自相关话题

因为讨厌一些网站的弹窗,还有想要高效地学习,把一些娱乐网站给屏蔽了,比如QQ。
所以在hosts文件中添加了如下内容:
路径:C:\Windows\System32\drivers\etc
 
127.0.0.1 qq.com
127.0.0.1 cnbeta.com
10.4.16.75 windows10.microdone.cn
50.112.79.106 mukodik
0.0.0.0 account.jetbrains.com
结果发现一直无法生效。
后来在ping下发现,ping qq.com 返回的是127.0.0.1是生效的。
但是ping www.qq.com是能够ping到腾讯的服务器的,原来问题在于,你在浏览器输入qq.com,浏览器默认帮你加了www.前缀。
 
所以你要hosts文件生效,就需要把www.的前缀也加上去。
然后重新刷新下DNS就可以了
ipconfig /flushdns
  查看全部
因为讨厌一些网站的弹窗,还有想要高效地学习,把一些娱乐网站给屏蔽了,比如QQ。
所以在hosts文件中添加了如下内容:
路径:C:\Windows\System32\drivers\etc
 
127.0.0.1 qq.com
127.0.0.1 cnbeta.com
10.4.16.75 windows10.microdone.cn
50.112.79.106 mukodik
0.0.0.0 account.jetbrains.com

结果发现一直无法生效。
后来在ping下发现,ping qq.com 返回的是127.0.0.1是生效的。
但是ping www.qq.com是能够ping到腾讯的服务器的,原来问题在于,你在浏览器输入qq.com,浏览器默认帮你加了www.前缀。
 
所以你要hosts文件生效,就需要把www.的前缀也加上去。
然后重新刷新下DNS就可以了
ipconfig /flushdns
 

CentOS Zookeeper无法启动:Error contacting service,It is probably not running

python爬虫李魔佛 发表了文章 • 0 个评论 • 71 次浏览 • 2019-04-09 19:20 • 来自相关话题

启动:
./kafka-server-start.sh -daemon ../config/server.properties
报错:
Error contacting service,It is probably not running
 
关闭重启,杀进程,看端口是否被占用。无果。
后来看了下防火墙,OMG,有一台机子的防火墙没有关闭。
 
手工关闭后问题就解决了。
 
关闭防火墙命令:
systemctl stop firewalld.service #关闭防火墙
systemctl disable firewalld.service #禁止启动防火墙 查看全部
启动:
./kafka-server-start.sh -daemon ../config/server.properties
报错:
Error contacting service,It is probably not running
 
关闭重启,杀进程,看端口是否被占用。无果。
后来看了下防火墙,OMG,有一台机子的防火墙没有关闭。
 
手工关闭后问题就解决了。
 
关闭防火墙命令:
systemctl stop firewalld.service #关闭防火墙
systemctl disable firewalld.service #禁止启动防火墙

树莓派 vim代码高亮

Linux李魔佛 发表了文章 • 0 个评论 • 47 次浏览 • 2019-04-09 09:38 • 来自相关话题

首先安装vim 
sudo apt-get install-y vim
 
然后默认没有高亮语法的:

在~目录下面新建.vimrc文件可以实现1
 
然后编辑.vimrc文件
 

set nu
syntax on
set tabstop=4
 
然后就可以生效了。
如果还木有生效,记得重启下,或者注销。 查看全部
首先安装vim 
sudo apt-get install-y vim
 
然后默认没有高亮语法的:

在~目录下面新建.vimrc文件可以实现1
 
然后编辑.vimrc文件
 

set nu
syntax on
set tabstop=4
 
然后就可以生效了。
如果还木有生效,记得重启下,或者注销。

python操作kafka报错:return '<SimpleProducer batch=%s>' % self.async

数据库李魔佛 发表了文章 • 0 个评论 • 142 次浏览 • 2019-04-08 16:59 • 来自相关话题

使用的Anaconda的python3.7版本,发现使用kafka的库连接时报错,错误信息如下:
 
C:\ProgramData\Anaconda3\python.exe C:/git/base_function/kafka_usage.py
Traceback (most recent call last):
File "C:/git/base_function/kafka_usage.py", line 6, in <module>
from kafka import KafkaProducer
File "C:\ProgramData\Anaconda3\lib\site-packages\kafka\__init__.py", line 23, in <module>
from kafka.producer import KafkaProducer
File "C:\ProgramData\Anaconda3\lib\site-packages\kafka\producer\__init__.py", line 4, in <module>
from .simple import SimpleProducer
File "C:\ProgramData\Anaconda3\lib\site-packages\kafka\producer\simple.py", line 54
return '<SimpleProducer batch=%s>' % self.async
^
SyntaxError: invalid syntax
因为py3.7里面async已经变成了关键字。所以导致了不兼容。
 
解决办法:
使用最新的kafka版本,但是pyPI上的kafka还没有被替换成最新的,可以使用下面的方法升级kafka python
pip install kafka-python
 
然后问题就解决了。 查看全部
使用的Anaconda的python3.7版本,发现使用kafka的库连接时报错,错误信息如下:
 
C:\ProgramData\Anaconda3\python.exe C:/git/base_function/kafka_usage.py
Traceback (most recent call last):
File "C:/git/base_function/kafka_usage.py", line 6, in <module>
from kafka import KafkaProducer
File "C:\ProgramData\Anaconda3\lib\site-packages\kafka\__init__.py", line 23, in <module>
from kafka.producer import KafkaProducer
File "C:\ProgramData\Anaconda3\lib\site-packages\kafka\producer\__init__.py", line 4, in <module>
from .simple import SimpleProducer
File "C:\ProgramData\Anaconda3\lib\site-packages\kafka\producer\simple.py", line 54
return '<SimpleProducer batch=%s>' % self.async
^
SyntaxError: invalid syntax

因为py3.7里面async已经变成了关键字。所以导致了不兼容。
 
解决办法:
使用最新的kafka版本,但是pyPI上的kafka还没有被替换成最新的,可以使用下面的方法升级kafka python
pip install kafka-python
 
然后问题就解决了。

datetime转为date,pandas的日期类型转为python的datime

python李魔佛 发表了文章 • 0 个评论 • 86 次浏览 • 2019-04-08 15:40 • 来自相关话题

dataframe的数据格式是这样子的:





 
info看一下里面的数据类型:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 307 entries, 0 to 306
Data columns (total 7 columns):
日期 307 non-null datetime64[ns]
指数 307 non-null float64
成交额(亿元) 307 non-null float64
涨跌 307 non-null float64
涨跌额 307 non-null float64
转债数目 307 non-null float64
剩余规模 307 non-null float64
dtypes: datetime64[ns](1), float64(6)
memory usage: 16.9 KB
日期 307 non-null datetime64[ns]
 
然后转为list看看:
a=list(df['日期'].values)
如果使用上面的方法,返回的是这样的数据:
[numpy.datetime64('2017-12-29T00:00:00.000000000'),
numpy.datetime64('2018-01-02T00:00:00.000000000'),
numpy.datetime64('2018-01-03T00:00:00.000000000'),
numpy.datetime64('2018-01-04T00:00:00.000000000'),
numpy.datetime64('2018-01-05T00:00:00.000000000'),
numpy.datetime64('2018-01-08T00:00:00.000000000'),
numpy.datetime64('2018-01-09T00:00:00.000000000'),
numpy.datetime64('2018-01-10T00:00:00.000000000'),
numpy.datetime64('2018-01-11T00:00:00.000000000'),
numpy.datetime64('2018-01-12T00:00:00.000000000'),
numpy.datetime64('2018-01-15T00:00:00.000000000'),
numpy.datetime64('2018-01-16T00:00:00.000000000'),
numpy.datetime64('2018-01-17T00:00:00.000000000'),
 
如何转化为python的daetime格式呢?
 
可以使用内置的:s.dt.to_pydatetime()
s为df的一列,也就是series数据格式
 
b=list(df['日期'].dt.to_pydatetime())得到的是
[datetime.datetime(2017, 12, 29, 0, 0),
datetime.datetime(2018, 1, 2, 0, 0),
datetime.datetime(2018, 1, 3, 0, 0),
datetime.datetime(2018, 1, 4, 0, 0),
datetime.datetime(2018, 1, 5, 0, 0),
datetime.datetime(2018, 1, 8, 0, 0),
datetime.datetime(2018, 1, 9, 0, 0),
datetime.datetime(2018, 1, 10, 0, 0),
datetime.datetime(2018, 1, 11, 0, 0),
datetime.datetime(2018, 1, 12, 0, 0),
datetime.datetime(2018, 1, 15, 0, 0)
为了不想要小时,分钟,秒的数据,可以清洗一下:
b=[i.strftime('%Y-%m-%d') for i in b]
 
得到:
['2017-12-29',
'2018-01-02',
'2018-01-03',
'2018-01-04',
'2018-01-05',
'2018-01-08',
'2018-01-09',
'2018-01-10',
'2018-01-11',
'2018-01-12',
'2018-01-15',
'2018-01-16',
'2018-01-17', 
  查看全部
dataframe的数据格式是这样子的:

d1.PNG

 
info看一下里面的数据类型:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 307 entries, 0 to 306
Data columns (total 7 columns):
日期 307 non-null datetime64[ns]
指数 307 non-null float64
成交额(亿元) 307 non-null float64
涨跌 307 non-null float64
涨跌额 307 non-null float64
转债数目 307 non-null float64
剩余规模 307 non-null float64
dtypes: datetime64[ns](1), float64(6)
memory usage: 16.9 KB

日期 307 non-null datetime64[ns]
 
然后转为list看看:
a=list(df['日期'].values)
如果使用上面的方法,返回的是这样的数据:
[numpy.datetime64('2017-12-29T00:00:00.000000000'),
numpy.datetime64('2018-01-02T00:00:00.000000000'),
numpy.datetime64('2018-01-03T00:00:00.000000000'),
numpy.datetime64('2018-01-04T00:00:00.000000000'),
numpy.datetime64('2018-01-05T00:00:00.000000000'),
numpy.datetime64('2018-01-08T00:00:00.000000000'),
numpy.datetime64('2018-01-09T00:00:00.000000000'),
numpy.datetime64('2018-01-10T00:00:00.000000000'),
numpy.datetime64('2018-01-11T00:00:00.000000000'),
numpy.datetime64('2018-01-12T00:00:00.000000000'),
numpy.datetime64('2018-01-15T00:00:00.000000000'),
numpy.datetime64('2018-01-16T00:00:00.000000000'),
numpy.datetime64('2018-01-17T00:00:00.000000000'),

 
如何转化为python的daetime格式呢?
 
可以使用内置的:s.dt.to_pydatetime()
s为df的一列,也就是series数据格式
 
b=list(df['日期'].dt.to_pydatetime())
得到的是
[datetime.datetime(2017, 12, 29, 0, 0),
datetime.datetime(2018, 1, 2, 0, 0),
datetime.datetime(2018, 1, 3, 0, 0),
datetime.datetime(2018, 1, 4, 0, 0),
datetime.datetime(2018, 1, 5, 0, 0),
datetime.datetime(2018, 1, 8, 0, 0),
datetime.datetime(2018, 1, 9, 0, 0),
datetime.datetime(2018, 1, 10, 0, 0),
datetime.datetime(2018, 1, 11, 0, 0),
datetime.datetime(2018, 1, 12, 0, 0),
datetime.datetime(2018, 1, 15, 0, 0)

为了不想要小时,分钟,秒的数据,可以清洗一下:
b=[i.strftime('%Y-%m-%d') for i in b]
 
得到:
['2017-12-29',
'2018-01-02',
'2018-01-03',
'2018-01-04',
'2018-01-05',
'2018-01-08',
'2018-01-09',
'2018-01-10',
'2018-01-11',
'2018-01-12',
'2018-01-15',
'2018-01-16',
'2018-01-17',
 
 

python datetime模块:timestamp转为本地时间(东八区)

python李魔佛 发表了文章 • 0 个评论 • 79 次浏览 • 2019-04-04 15:15 • 来自相关话题

一般timestamp时间戳格式为10位,如果是13位,则需要除以1000,

1554369904000
为例,计算这个数字的本地时间。
 
如果使用
t=1554369904000
datetime.datetime.fromtimestamp(t/1000)
 
得到的是:
(2019, 4, 4, 17, 25, 4)
 
然而这个时间并不是我想要的,和我想要的时间差了8个时区。
 
那么可以使用
datetime.datetime.utcfromtimestamp(t/1000)
这个返回的就是我想要的时间了
(2019, 4, 4, 9, 25, 4)
 
 
引用:
timestamp转换为datetime
要把timestamp转换为datetime,使用datetime提供的fromtimestamp()方法:

>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t))
2015-04-19 12:20:00
注意到timestamp是一个浮点数,它没有时区的概念,而datetime是有时区的。上述转换是在timestamp和本地时间做转换。

本地时间是指当前操作系统设定的时区。例如北京时区是东8区,则本地时间:

2015-04-19 12:20:00
实际上就是UTC+8:00时区的时间:

2015-04-19 12:20:00 UTC+8:00
而此刻的格林威治标准时间与北京时间差了8小时,也就是UTC+0:00时区的时间应该是:

2015-04-19 04:20:00 UTC+0:00
timestamp也可以直接被转换到UTC标准时区的时间:

>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t)) # 本地时间
2015-04-19 12:20:00
>>> print(datetime.utcfromtimestamp(t)) # UTC时间
2015-04-19 04:20:00
 
  查看全部
一般timestamp时间戳格式为10位,如果是13位,则需要除以1000,

1554369904000
为例,计算这个数字的本地时间。
 
如果使用
t=1554369904000
datetime.datetime.fromtimestamp(t/1000)
 
得到的是:
(2019, 4, 4, 17, 25, 4)
 
然而这个时间并不是我想要的,和我想要的时间差了8个时区。
 
那么可以使用
datetime.datetime.utcfromtimestamp(t/1000)
这个返回的就是我想要的时间了
(2019, 4, 4, 9, 25, 4)
 
 
引用:
timestamp转换为datetime
要把timestamp转换为datetime,使用datetime提供的fromtimestamp()方法:

>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t))
2015-04-19 12:20:00
注意到timestamp是一个浮点数,它没有时区的概念,而datetime是有时区的。上述转换是在timestamp和本地时间做转换。

本地时间是指当前操作系统设定的时区。例如北京时区是东8区,则本地时间:

2015-04-19 12:20:00
实际上就是UTC+8:00时区的时间:

2015-04-19 12:20:00 UTC+8:00
而此刻的格林威治标准时间与北京时间差了8小时,也就是UTC+0:00时区的时间应该是:

2015-04-19 04:20:00 UTC+0:00
timestamp也可以直接被转换到UTC标准时区的时间:

>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t)) # 本地时间
2015-04-19 12:20:00
>>> print(datetime.utcfromtimestamp(t)) # UTC时间
2015-04-19 04:20:00

 
 

【python】pymongo find_one_and_update的用法

python爬虫李魔佛 发表了文章 • 0 个评论 • 109 次浏览 • 2019-04-04 11:31 • 来自相关话题

原生的mongo语句是这样的:
db.collection.findOneAndUpdate(
<filter>,
<update>,
{
projection: <document>,
sort: <document>,
maxTimeMS: <number>,
upsert: <boolean>,
returnNewDocument: <boolean>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ]
}
)
转换成python pymongo是这样的:
 
>>> db.example.find_one_and_update(
... {'_id': 'userid'},
... {'$inc': {'seq': 1}},
... projection={'seq': True, '_id': False},
... return_document=ReturnDocument.AFTER)
上面的语句的意思是:
找到_id 为userid的值得文档,然后把该文档中的seq的值+1,然后返回seq的数据,不显示_id列
最后返回的数据是这样的:

{'seq': 2}
 
注意
findOneAndUpdate
是获取mongo文档中第一条满足条件的数据并做修改。该函数是线程安全的。意思就是在多个线程中操作,不会对同一条数据进行获取修改。 查看全部
原生的mongo语句是这样的:
db.collection.findOneAndUpdate(
<filter>,
<update>,
{
projection: <document>,
sort: <document>,
maxTimeMS: <number>,
upsert: <boolean>,
returnNewDocument: <boolean>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ]
}
)

转换成python pymongo是这样的:
 
>>> db.example.find_one_and_update(
... {'_id': 'userid'},
... {'$inc': {'seq': 1}},
... projection={'seq': True, '_id': False},
... return_document=ReturnDocument.AFTER)

上面的语句的意思是:
找到_id 为userid的值得文档,然后把该文档中的seq的值+1,然后返回seq的数据,不显示_id列
最后返回的数据是这样的:

{'seq': 2}
 
注意
findOneAndUpdate
是获取mongo文档中第一条满足条件的数据并做修改。该函数是线程安全的。意思就是在多个线程中操作,不会对同一条数据进行获取修改。

scrapy-redis使用redis集群进行分布式爬取

python爬虫李魔佛 发表了文章 • 0 个评论 • 116 次浏览 • 2019-04-03 17:05 • 来自相关话题

正常情况单机的redis可以满足scrapy-redis进行分布式爬取,可是如果单机的redis的内存过小,很容易导致系统内存不够,读取数据缓慢,如果使用docker运行redis,更加可能导致redis的容器的进程被杀掉。(笔者就曾经经常遇到这种情况,机器内存才8GB,上面跑了N个docker容器,一旦内存吃紧,某个容器就被kill掉,导致爬虫经常出问题)。
 
使用redis集群可以增加redis集体内存,防止出现上面的情况。
 
scrapy redis-cluster很简单,只需要按照以下步骤:
 
1. 按照库
pip install scrapy-redis-cluster
 
2. 修改settings文件
 
# Redis集群地址
REDIS_MASTER_NODES = [
{"host": "192.168.10.233", "port": "30001"},
{"host": "192.168.10.234", "port": "30002"},
{"host": "192.168.10.235", "port": "30003"},
]

# 使用的哈希函数数,默认为6
BLOOMFILTER_HASH_NUMBER = 6

# Bloomfilter使用的Redis内存位,30表示2 ^ 30 = 128MB,默认为22 (1MB 可去重130W URL)
BLOOMFILTER_BIT = 22

# 不清空redis队列
SCHEDULER_PERSIST = True
# 调度队列
SCHEDULER = "scrapy_redis_cluster.scheduler.Scheduler"
# 去重
DUPEFILTER_CLASS = "scrapy_redis_cluster.dupefilter.RFPDupeFilter"
# queue
SCHEDULER_QUEUE_CLASS = 'scrapy_redis_cluster.queue.PriorityQueue'
然后就可以运行啦。 查看全部
正常情况单机的redis可以满足scrapy-redis进行分布式爬取,可是如果单机的redis的内存过小,很容易导致系统内存不够,读取数据缓慢,如果使用docker运行redis,更加可能导致redis的容器的进程被杀掉。(笔者就曾经经常遇到这种情况,机器内存才8GB,上面跑了N个docker容器,一旦内存吃紧,某个容器就被kill掉,导致爬虫经常出问题)。
 
使用redis集群可以增加redis集体内存,防止出现上面的情况。
 
scrapy redis-cluster很简单,只需要按照以下步骤:
 
1. 按照库
pip install scrapy-redis-cluster
 
2. 修改settings文件
 
# Redis集群地址
REDIS_MASTER_NODES = [
{"host": "192.168.10.233", "port": "30001"},
{"host": "192.168.10.234", "port": "30002"},
{"host": "192.168.10.235", "port": "30003"},
]

# 使用的哈希函数数,默认为6
BLOOMFILTER_HASH_NUMBER = 6

# Bloomfilter使用的Redis内存位,30表示2 ^ 30 = 128MB,默认为22 (1MB 可去重130W URL)
BLOOMFILTER_BIT = 22

# 不清空redis队列
SCHEDULER_PERSIST = True
# 调度队列
SCHEDULER = "scrapy_redis_cluster.scheduler.Scheduler"
# 去重
DUPEFILTER_CLASS = "scrapy_redis_cluster.dupefilter.RFPDupeFilter"
# queue
SCHEDULER_QUEUE_CLASS = 'scrapy_redis_cluster.queue.PriorityQueue'

然后就可以运行啦。

【Dataframe warning】Try using .loc[row_indexer,col_indexer] = value instead

python李魔佛 发表了文章 • 0 个评论 • 70 次浏览 • 2019-04-02 22:48 • 来自相关话题

使用dataframe直接赋值操作时
 
df['当前日期'] = datetime.date.today()
 
会出现下面的警告信息
Try using .loc[row_indexer,col_indexer] = value instead 
 
虽然得到的最终结果是正常的,可是为什么会出现上面的警告呢?
 
因为上面的操作如果稍微复杂点,那么就可能导致赋值失败。 因为中间会产生一个切片的临时副本。
 
比如:
df
A B C D E
0 5 0 3 3 7
1 9 3 5 2 4
2 7 6 8 8 1
如果想把A列中大于5的数换成100,如何操作 ?
 
A B C D E
0 5 0 3 3 7
1 1000 3 5 2 4
2 1000 6 8 8 1

df[df.A > 5]['A'] = 1000
 
上面的这个表达式是不会生效的。
 
要生效,需要写成以下:
df.loc[df.A > 5, 'A'] = 1000
 
为什么呢?
因为df[df.A]得到是一个临时切片结果,等于一个中间变量,然后在这个中间变量上的A列上做赋值操作,但是最原始的df却没有被改变。
或者你可以这样写
df=df[df.A>5]
df.A=1000
 
 
  查看全部
使用dataframe直接赋值操作时
 
df['当前日期'] = datetime.date.today()
 
会出现下面的警告信息
Try using .loc[row_indexer,col_indexer] = value instead 
 
虽然得到的最终结果是正常的,可是为什么会出现上面的警告呢?
 
因为上面的操作如果稍微复杂点,那么就可能导致赋值失败。 因为中间会产生一个切片的临时副本。
 
比如:
df
A B C D E
0 5 0 3 3 7
1 9 3 5 2 4
2 7 6 8 8 1

如果想把A列中大于5的数换成100,如何操作 ?
 
      A  B  C  D  E
0 5 0 3 3 7
1 1000 3 5 2 4
2 1000 6 8 8 1


df[df.A > 5]['A'] = 1000
 
上面的这个表达式是不会生效的。
 
要生效,需要写成以下:
df.loc[df.A > 5, 'A'] = 1000
 
为什么呢?
因为df[df.A]得到是一个临时切片结果,等于一个中间变量,然后在这个中间变量上的A列上做赋值操作,但是最原始的df却没有被改变。
或者你可以这样写
df=df[df.A>5]
df.A=1000
 
 
 

指数基金的诞生 源于公司内部矛盾

股票李魔佛 发表了文章 • 0 个评论 • 70 次浏览 • 2019-04-02 17:35 • 来自相关话题

望京博格|文

似乎所有伟大事物都诞生都源于逆境!

古代诗词歌赋大多都是诗人身处逆境有感而发;指数基金的诞生也源于一场公司内部斗争。
如果你理解了指数基金是如何诞生的,则你对应指数基金的理解也将更为深刻,接着开始约翰博格与指数基金的故事:

(一)饮鸩止渴
先锋集团的前身是1920年沃尔特摩根建立的惠灵顿基金。最初的美国基金公司创始人都经历过美国1929-1931年的大萧条,在大萧条期间美国道琼斯指数的最大跌幅为90%。在此之后,大多数基金公司采取的都是相对保守的平衡型策略:一半国债一半蓝筹。
在20世纪60年代中期,基金行业不再墨守陈规于传统的投资风格。 这被称为”沸腾时代“,其间很多年前的基金经理开始追逐各种投机股票,后来很多成熟基金经理也开始效仿追逐各种投机股票。这些股票走势如火如荼,但是通常没有基本面的支撑。投资者与基金行业不再关心什么投资”蓝筹股“的基金或者风格保守的平衡型基金,取而代之的是各种追逐“妖股”且净值高涨的基金。

1965-1974年,期间美国市场流行”漂亮50“,以施乐(Xerox),宝丽来(Polaroid),IBM,雅芳(Avon )为代表成长股飙涨。导致投资者开始追逐业绩飙涨的股票型基金,传统的平衡型基金被投资者抛弃。
在1955年平衡型基金市场份额为55%,到1965年的17%,降至1970年的5%,到1975年,这个比例更是将下降到仅剩1%。惠灵顿基金的旗舰基金都是平衡型基金,在这个样环境中度日如年。在这个关键时刻,老摩根将公司的管理权交给年轻的约翰博格。
规模是基金公司的生命之血。对于年轻的博格而言,扭转公司颓势的唯一方法是合并一家以成长股投资见长基金公司。在拜访几家备选基金公司并被拒绝之后,博格决定收购位于波士顿由四个年轻人的合伙公司[Thorndike,Doran,Paine&Lewis,Inc],以及他们旗下Ivest基金。
在合并公司的新中,四个新合伙人各拥有10%合计40%投票权,博格还是担任CEO拥有28%的投票权,公开发行的那部分拥有剩余32%的投票权,之后惠灵顿发行自己的成长股基金。

(二)替罪羔羊
历经十年的”漂亮50“行情,由于这些看似漂亮的成长股公司的业绩并没有跟上股价的上升,随着而来的业绩增速下滑导致”漂亮50“行情的破灭,在1973-1974年标普500指数下跌了50%以上。
与此同时,惠灵顿的新商业模式开始失败。博格新合伙人管理的四个新基金中的三个基金濒临清盘。从高到低,Ivest基金的规模缩水65%,好在后来它都清盘,否则会被列入金融历史的最差基金名录上。(附言:原来清盘是一条遮羞布)
新伙伴管理的另外两个股票型基金同样业绩不如人意,导致基金最后失败。更糟糕的是,在新管理层其咄咄逼人的形势下,曾经保守的惠灵顿基金管理的资产也大幅缩水。 在1966年至1976年的十年间,惠灵顿的平衡型基金称为在全美国业绩最差的平衡型基金(源于股票仓位持有漂亮50股票,在熊市跌的最惨)。
随着1973-1974年熊市的到来,博格与新伙伴自1966年以来的愉快合作也面临着分崩离析。糟糕的市场和糟糕的基金业绩意味着糟糕的业务,摧毁了惠灵顿并购的新伙伴与博格之间的任何信任。新的波士顿合作伙伴很快找到了替罪羊。当然不是他们自己,尽管他们管理的股票型基金业绩如此糟糕。 他们选择博格,合并之后惠灵顿首席执行官,作为替罪羊为惠灵顿基金持有人亏损以及公司股东的亏损负责。 由于合并初期新公司投票权改变,在熊市中期,1974年1月23日,他们联合起来解雇了CEO-约翰博格。

(三)对决开始
约翰博格是一个不会轻易服输的人。 在美国,基金还有独立的董事会(在国内称为持有人大会,由于海外基金大多数是公司型基金,所以基金常设的董事会)。惠灵顿基金的董事会与惠灵顿基金管理公司董事会成员构成有很大重合,但是由于基金汇集客户资产,所有在基金董事会中独立董事拥有很强的话语权。
博格被免除惠灵顿基金管理公司的董事长与CEO职位,但他还是惠灵顿基金的董事长与CEO,所以他要召开惠灵顿基金的董事会议,罢免惠灵顿基金管理公司作为其投资顾问的权力,也就是公募基金更换基金管理人。这件事在美国基金行业从未发生,即便到现在也仅在惠灵顿基金发生过,当然在国内基金行业20年也没有发生过。
由于独立董事的支持,博格与惠灵顿基金管理公司达成折衷方案:

(1)惠灵顿基金(后改名为先锋基金)成立新的子公司负责基金的运营工作,包括基金会计、TA登记、客户服务等;
(2)惠灵顿基金的投资管理与基金发行还由惠灵顿基金管理公司负责。
这里面第二点很重要,如果先锋发行新的基金,投资管理还是有惠灵顿基金公司负责。
(四)指数基金诞生
约翰博格与惠灵顿基金管理公司新的CEO之间仇恨已经无法化解。在1975年约翰博格打算发行一只新基金,但是又不想受到折衷方案影响(方案规定基金投资管理必须由惠灵顿基金管理公司负责)。
约翰博格必须想出摆脱”折衷方案影响“方法,在这个时候他想到指数基金,并得到(1970年获得诺贝尔经济学奖的)保罗萨缪尔森的支持。由于指数基金是一个“不需要管理的”基金,这样就无需惠灵顿基金管理公司插足先锋基金的新的业务。
1976年8月成立的第一个“市场指数”共同基金,最初名为“第一指数投资信托”(First Index Investment Trust)。指数化是终极的“不激进不保守”投资策略,充分保证了参与金融市场的涨跌。
其实第一个指数基金并不顺利,成立规模仅1200万美元(募集目标是5亿美元),而且之后经历83个月的净赎回……当时基金行业巨头们都在猜测这个指数基金什么时候会夭折,第二个指数基金在第一个指数基金成立约十年之后才出现。

(五)指数基金壮大
在先锋集团创立之前,美国基金销售如同国内现状一样,几乎所有的基金销售都以赚取销售提成为生。在那个时代,基金的认购/申购费为5%,即投资者买100美元基金,仅有95美元归入基金资产,其余5美元作为基金销售的奖励。
虽然博格的指数起初发展并不顺利,但是他也没有闲着。在1975年纽约交易所受到各方压力,结束了固定佣金指数,美国市场开始走向低佣金时代。
在这个时候约翰博格推出“免佣”基金,即销售先锋集团的基金,先锋集团不支付基金销售任何费用。这一举措在当时的同行看来似乎是“大逆不道”,先锋一边推出免佣基金,一边进一步降低基金费率,导致在之后四五年中,先锋靠降低费率导致其基金业绩大幅跑赢同业,导致投资者开始追捧先锋集团旗下产品。
其他基金同业(例如富达)被逼推出“免佣”基金,销售基金再也没有销售提成了,导致当时80%的基金销售人员失业! 但是投资者还需要专业人员帮助构建投资组合,在这个时候投资顾问(FA)诞生了。
投资顾问,帮助客户构建资产配置组合并收取咨询费,基金公司也不再支付销售提成。对于投资顾问而言,提高客户业绩最有效的方式,就是通过低成本的指数基金构建资产配置组合。
先锋集团的产品受到投资顾问偏爱,而先锋特殊的结构决定了随着其管理规模进一步增长,其基金费率则进一步降低,导致投资顾问更加偏爱先锋集团的产品,以至与进入相互促进的螺旋增长的模式,截至2018年底,先锋集团的管理规模已经突破5万亿美元,必须在强调一次:第一指数基金的成立规模仅0.12亿美元!(完)
参考文献:
(1)《约翰博格与先锋集团传记》
(2)《Stay The Course》 查看全部

望京博格|文

似乎所有伟大事物都诞生都源于逆境!

古代诗词歌赋大多都是诗人身处逆境有感而发;指数基金的诞生也源于一场公司内部斗争。
如果你理解了指数基金是如何诞生的,则你对应指数基金的理解也将更为深刻,接着开始约翰博格与指数基金的故事:

(一)饮鸩止渴
先锋集团的前身是1920年沃尔特摩根建立的惠灵顿基金。最初的美国基金公司创始人都经历过美国1929-1931年的大萧条,在大萧条期间美国道琼斯指数的最大跌幅为90%。在此之后,大多数基金公司采取的都是相对保守的平衡型策略:一半国债一半蓝筹。
在20世纪60年代中期,基金行业不再墨守陈规于传统的投资风格。 这被称为”沸腾时代“,其间很多年前的基金经理开始追逐各种投机股票,后来很多成熟基金经理也开始效仿追逐各种投机股票。这些股票走势如火如荼,但是通常没有基本面的支撑。投资者与基金行业不再关心什么投资”蓝筹股“的基金或者风格保守的平衡型基金,取而代之的是各种追逐“妖股”且净值高涨的基金。

1965-1974年,期间美国市场流行”漂亮50“,以施乐(Xerox),宝丽来(Polaroid),IBM,雅芳(Avon )为代表成长股飙涨。导致投资者开始追逐业绩飙涨的股票型基金,传统的平衡型基金被投资者抛弃。
在1955年平衡型基金市场份额为55%,到1965年的17%,降至1970年的5%,到1975年,这个比例更是将下降到仅剩1%。惠灵顿基金的旗舰基金都是平衡型基金,在这个样环境中度日如年。在这个关键时刻,老摩根将公司的管理权交给年轻的约翰博格。
规模是基金公司的生命之血。对于年轻的博格而言,扭转公司颓势的唯一方法是合并一家以成长股投资见长基金公司。在拜访几家备选基金公司并被拒绝之后,博格决定收购位于波士顿由四个年轻人的合伙公司[Thorndike,Doran,Paine&Lewis,Inc],以及他们旗下Ivest基金。
在合并公司的新中,四个新合伙人各拥有10%合计40%投票权,博格还是担任CEO拥有28%的投票权,公开发行的那部分拥有剩余32%的投票权,之后惠灵顿发行自己的成长股基金。

(二)替罪羔羊
历经十年的”漂亮50“行情,由于这些看似漂亮的成长股公司的业绩并没有跟上股价的上升,随着而来的业绩增速下滑导致”漂亮50“行情的破灭,在1973-1974年标普500指数下跌了50%以上。
与此同时,惠灵顿的新商业模式开始失败。博格新合伙人管理的四个新基金中的三个基金濒临清盘。从高到低,Ivest基金的规模缩水65%,好在后来它都清盘,否则会被列入金融历史的最差基金名录上。(附言:原来清盘是一条遮羞布)
新伙伴管理的另外两个股票型基金同样业绩不如人意,导致基金最后失败。更糟糕的是,在新管理层其咄咄逼人的形势下,曾经保守的惠灵顿基金管理的资产也大幅缩水。 在1966年至1976年的十年间,惠灵顿的平衡型基金称为在全美国业绩最差的平衡型基金(源于股票仓位持有漂亮50股票,在熊市跌的最惨)。
随着1973-1974年熊市的到来,博格与新伙伴自1966年以来的愉快合作也面临着分崩离析。糟糕的市场和糟糕的基金业绩意味着糟糕的业务,摧毁了惠灵顿并购的新伙伴与博格之间的任何信任。新的波士顿合作伙伴很快找到了替罪羊。当然不是他们自己,尽管他们管理的股票型基金业绩如此糟糕。 他们选择博格,合并之后惠灵顿首席执行官,作为替罪羊为惠灵顿基金持有人亏损以及公司股东的亏损负责。 由于合并初期新公司投票权改变,在熊市中期,1974年1月23日,他们联合起来解雇了CEO-约翰博格。

(三)对决开始
约翰博格是一个不会轻易服输的人。 在美国,基金还有独立的董事会(在国内称为持有人大会,由于海外基金大多数是公司型基金,所以基金常设的董事会)。惠灵顿基金的董事会与惠灵顿基金管理公司董事会成员构成有很大重合,但是由于基金汇集客户资产,所有在基金董事会中独立董事拥有很强的话语权。
博格被免除惠灵顿基金管理公司的董事长与CEO职位,但他还是惠灵顿基金的董事长与CEO,所以他要召开惠灵顿基金的董事会议,罢免惠灵顿基金管理公司作为其投资顾问的权力,也就是公募基金更换基金管理人。这件事在美国基金行业从未发生,即便到现在也仅在惠灵顿基金发生过,当然在国内基金行业20年也没有发生过。
由于独立董事的支持,博格与惠灵顿基金管理公司达成折衷方案:

(1)惠灵顿基金(后改名为先锋基金)成立新的子公司负责基金的运营工作,包括基金会计、TA登记、客户服务等;
(2)惠灵顿基金的投资管理与基金发行还由惠灵顿基金管理公司负责。
这里面第二点很重要,如果先锋发行新的基金,投资管理还是有惠灵顿基金公司负责。
(四)指数基金诞生
约翰博格与惠灵顿基金管理公司新的CEO之间仇恨已经无法化解。在1975年约翰博格打算发行一只新基金,但是又不想受到折衷方案影响(方案规定基金投资管理必须由惠灵顿基金管理公司负责)。
约翰博格必须想出摆脱”折衷方案影响“方法,在这个时候他想到指数基金,并得到(1970年获得诺贝尔经济学奖的)保罗萨缪尔森的支持。由于指数基金是一个“不需要管理的”基金,这样就无需惠灵顿基金管理公司插足先锋基金的新的业务。
1976年8月成立的第一个“市场指数”共同基金,最初名为“第一指数投资信托”(First Index Investment Trust)。指数化是终极的“不激进不保守”投资策略,充分保证了参与金融市场的涨跌。
其实第一个指数基金并不顺利,成立规模仅1200万美元(募集目标是5亿美元),而且之后经历83个月的净赎回……当时基金行业巨头们都在猜测这个指数基金什么时候会夭折,第二个指数基金在第一个指数基金成立约十年之后才出现。

(五)指数基金壮大
在先锋集团创立之前,美国基金销售如同国内现状一样,几乎所有的基金销售都以赚取销售提成为生。在那个时代,基金的认购/申购费为5%,即投资者买100美元基金,仅有95美元归入基金资产,其余5美元作为基金销售的奖励。
虽然博格的指数起初发展并不顺利,但是他也没有闲着。在1975年纽约交易所受到各方压力,结束了固定佣金指数,美国市场开始走向低佣金时代。
在这个时候约翰博格推出“免佣”基金,即销售先锋集团的基金,先锋集团不支付基金销售任何费用。这一举措在当时的同行看来似乎是“大逆不道”,先锋一边推出免佣基金,一边进一步降低基金费率,导致在之后四五年中,先锋靠降低费率导致其基金业绩大幅跑赢同业,导致投资者开始追捧先锋集团旗下产品。
其他基金同业(例如富达)被逼推出“免佣”基金,销售基金再也没有销售提成了,导致当时80%的基金销售人员失业! 但是投资者还需要专业人员帮助构建投资组合,在这个时候投资顾问(FA)诞生了。
投资顾问,帮助客户构建资产配置组合并收取咨询费,基金公司也不再支付销售提成。对于投资顾问而言,提高客户业绩最有效的方式,就是通过低成本的指数基金构建资产配置组合。
先锋集团的产品受到投资顾问偏爱,而先锋特殊的结构决定了随着其管理规模进一步增长,其基金费率则进一步降低,导致投资顾问更加偏爱先锋集团的产品,以至与进入相互促进的螺旋增长的模式,截至2018年底,先锋集团的管理规模已经突破5万亿美元,必须在强调一次:第一指数基金的成立规模仅0.12亿美元!(完)
参考文献:
(1)《约翰博格与先锋集团传记》
(2)《Stay The Course》

python析构函数的执行顺序

python李魔佛 发表了文章 • 0 个评论 • 74 次浏览 • 2019-04-01 21:28 • 来自相关话题

在python里面,由于有自动回收内存的机制,所以析构函数的用处要比C++弱得多。 
 
下面看代码:
 
class Foobar(object):

def __init__(self):
print('class start')

def __del__(self):
print('class end')

def main()
obj = Foobar()
print('where is del?')
print('main end')

main()
上面的代码输出结果是什么呢? 卖个关子,自己执行看看吧。 查看全部
在python里面,由于有自动回收内存的机制,所以析构函数的用处要比C++弱得多。 
 
下面看代码:
 
class Foobar(object):

def __init__(self):
print('class start')

def __del__(self):
print('class end')

def main()
obj = Foobar()
print('where is del?')
print('main end')

main()

上面的代码输出结果是什么呢? 卖个关子,自己执行看看吧。

postman使用_analyze端点 ElasticSearch

数据库李魔佛 发表了文章 • 0 个评论 • 61 次浏览 • 2019-04-01 15:31 • 来自相关话题

POSTMAN
ES 6.x如何使用_analyze端点

因为使用curl编辑查询语句很不方便。平时用postman最多,故平时查询ES经常使用postman查询。
_analyze端点是用于查询分析器的分析效果。

文档中使用如下方法查询

curl -XPOST 'localhost:9200/_analyze?analyzer=standard' -d 'I love Bears and Fish.'
只是奇怪,为何post的内容 'I love Bears and Fish.'不需要字段名?
试验了几次后,发现在6.x上,该字段的字段名是text
所以请求body应该是这样的






可以使用get方法来使用_analyze端点 查看全部
POSTMAN
ES 6.x如何使用_analyze端点

因为使用curl编辑查询语句很不方便。平时用postman最多,故平时查询ES经常使用postman查询。
_analyze端点是用于查询分析器的分析效果。

文档中使用如下方法查询

curl -XPOST 'localhost:9200/_analyze?analyzer=standard' -d 'I love Bears and Fish.'
只是奇怪,为何post的内容 'I love Bears and Fish.'不需要字段名?
试验了几次后,发现在6.x上,该字段的字段名是text
所以请求body应该是这样的

postman1.PNG


可以使用get方法来使用_analyze端点

可转债如何配债

股票李魔佛 发表了文章 • 0 个评论 • 125 次浏览 • 2019-03-29 16:24 • 来自相关话题

由于还是有很多人不断问我如何配债的问题,这里以歌尔声学为例简单说明下。

1、如果你在登记日也就是12月11日收盘时还持有一定数量歌尔声学正股的话,那么你在配债日也就是12月12日就会看到账户里有相应数量的歌尔配债。注意这里的单位是张,如图,





 
由于我只有800股歌尔声学,因此获得了13张配债,1张对应100元,这时双击它,左侧出现了卖出菜单,价格和配债代码都自动填好了,输入13张或者点击全部,然后点“卖出”。(需要注意的是:有些券商这里是买入。)

2、不管是卖出还是买入,然后检查下委托情况和扣款情况,如下图:










 

可以看到我已经被扣款1300元,这样就算成功完成了这次的13张配债 查看全部

由于还是有很多人不断问我如何配债的问题,这里以歌尔声学为例简单说明下。

1、如果你在登记日也就是12月11日收盘时还持有一定数量歌尔声学正股的话,那么你在配债日也就是12月12日就会看到账户里有相应数量的歌尔配债。注意这里的单位是张,如图,

1.jpg

 
由于我只有800股歌尔声学,因此获得了13张配债,1张对应100元,这时双击它,左侧出现了卖出菜单,价格和配债代码都自动填好了,输入13张或者点击全部,然后点“卖出”。(需要注意的是:有些券商这里是买入。)

2、不管是卖出还是买入,然后检查下委托情况和扣款情况,如下图:

2.jpg


3.jpg

 

可以看到我已经被扣款1300元,这样就算成功完成了这次的13张配债

pycharm中格式化json字符

python李魔佛 发表了文章 • 0 个评论 • 113 次浏览 • 2019-03-29 09:25 • 来自相关话题

首先把json字符保存为json后缀,然后看看json字符串中是否用的双引号,注意,单引号不起作用,要把单引号替换成双引号,然后按快捷键ctrl+alt+L 就可以快速格式化json了。
 
效果如下
 





 
首先把json字符保存为json后缀,然后看看json字符串中是否用的双引号,注意,单引号不起作用,要把单引号替换成双引号,然后按快捷键ctrl+alt+L 就可以快速格式化json了。
 
效果如下
 

json.PNG

 

scrapy命令行执行传递多个参数给spider 动态传参

python爬虫李魔佛 发表了文章 • 0 个评论 • 71 次浏览 • 2019-03-28 11:24 • 来自相关话题

有时候在命令行执行scrapy,比如scrapy crawl spiderXXXX,如果我想要传递一个自定义的参数进去给scrapy,比如我想传递一个爬取的页码数目,我要每次爬取10页。
 
那么需要在spider中定义一个构造函数
 
def __init__(self,page=None,*args, **kwargs):
super(Gaode,self).__init__(*args, **kwargs)
self.page=page


def start_requests(self):
XXXXXX 调用self.page 即可
yield Request(XXXX)
 
然后在启动scrapy的时候赋予参数的值:
 
scrapy crawl spider -a page=10
 
就可以动态传入参数 查看全部
有时候在命令行执行scrapy,比如scrapy crawl spiderXXXX,如果我想要传递一个自定义的参数进去给scrapy,比如我想传递一个爬取的页码数目,我要每次爬取10页。
 
那么需要在spider中定义一个构造函数
 
    def __init__(self,page=None,*args, **kwargs):
super(Gaode,self).__init__(*args, **kwargs)
self.page=page


def start_requests(self):
XXXXXX 调用self.page 即可
yield Request(XXXX)

 
然后在启动scrapy的时候赋予参数的值:
 
scrapy crawl spider -a page=10
 
就可以动态传入参数

学习强国Python自动化代码

python爬虫李魔佛 发表了文章 • 0 个评论 • 1200 次浏览 • 2019-03-27 17:45 • 来自相关话题

话不多说,爱国爱党爱人民!!! 本代码转载至github其他人,与本人无关。
 
# _*_ coding: utf-8 _*_

from selenium import webdriver
import time

__author__ = 'Silent_Coder'
__date__ = '2019/3/12 22:41'

HOME_PAGE = 'https://www.xuexi.cn/'
VIDEO_LINK = 'https://www.xuexi.cn/a191dbc3067d516c3e2e17e2e08953d6/b87d700beee2c44826a9202c75d18c85.html?pageNumber=39'
LONG_VIDEO_LINK = 'https://www.xuexi.cn/f65dae4a57fe21fcc36f3506d660891c/b2e5aa79be613aed1f01d261c4a2ae17.html'
LONG_VIDEO_LINK2 = 'https://www.xuexi.cn/0040db2a403b0b9303a68b9ae5a4cca0/b2e5aa79be613aed1f01d261c4a2ae17.html'
TEST_VIDEO_LINK = 'https://www.xuexi.cn/8e35a343fca20ee32c79d67e35dfca90/7f9f27c65e84e71e1b7189b7132b4710.html'
SCORES_LINK = 'https://pc.xuexi.cn/points/my-points.html'
LOGIN_LINK = 'https://pc.xuexi.cn/points/login.html'
ARTICLES_LINK = 'https://www.xuexi.cn/d05cad69216e688d304bb91ef3aac4c6/9a3668c13f6e303932b5e0e100fc248b.html'

options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
browser = webdriver.Chrome(executable_path=r'D:\OneDrive\Python\selenium\chromedriver.exe',options=options)


def login_simulation():
"""模拟登录"""
# 方式一:使用cookies方式
# 先自己登录,然后复制token值覆盖
# cookies = {'name': 'token', 'value': ''}
# browser.add_cookie(cookies)

# 方式二:自己扫码登录
browser.get(LOGIN_LINK)
browser.maximize_window()
browser.execute_script("var q=document.documentElement.scrollTop=1000")
time.sleep(10)
browser.get(HOME_PAGE)
print("模拟登录完毕\n")


def watch_videos():
"""观看视频"""
browser.get(VIDEO_LINK)
videos = browser.find_elements_by_xpath("//div[@id='Ck3ln2wlyg3k00']")
spend_time = 0

for i, video in enumerate(videos):
if i > 6:
break
video.click()
all_handles = browser.window_handles
browser.switch_to_window(all_handles[-1])
browser.get(browser.current_url)

# 点击播放
browser.find_element_by_xpath("//div[@class='outter']").click()
# 获取视频时长
video_duration_str = browser.find_element_by_xpath("//span[@class='duration']").get_attribute('innerText')
video_duration = int(video_duration_str.split(':')[0]) * 60 + int(video_duration_str.split(':')[1])
# 保持学习,直到视频结束
time.sleep(video_duration + 3)
spend_time += video_duration + 3
browser.close()
browser.switch_to_window(all_handles[0])

# if spend_time < 3010:
# browser.get(LONG_VIDEO_LINK)
# browser.execute_script("var q=document.documentElement.scrollTop=850")
# try:
# browser.find_element_by_xpath("//div[@class='outter']").click()
# except:
# pass
#
# # 观看剩下的时间
# time.sleep(3010 - spend_time)
browser.get(TEST_VIDEO_LINK)
time.sleep(3010 - spend_time)
print("播放视频完毕\n")


def read_articles():
"""阅读文章"""
browser.get(ARTICLES_LINK)
articles = browser.find_elements_by_xpath("//div[@id='Ca4gvo4bwg7400']")
for index, article in enumerate(articles):
if index > 7:
break
article.click()
all_handles = browser.window_handles
browser.switch_to_window(all_handles[-1])
browser.get(browser.current_url)
for i in range(0, 2000, 100):

js_code = "var q=document.documentElement.scrollTop=" + str(i)
browser.execute_script(js_code)
time.sleep(5)
for i in range(2000, 0, -100):
js_code = "var q=document.documentElement.scrollTop=" + str(i)
browser.execute_script(js_code)
time.sleep(5)
time.sleep(80)
browser.close()
browser.switch_to_window(all_handles[0])
print("阅读文章完毕\n")


def get_scores():
"""获取当前积分"""
browser.get(SCORES_LINK)
time.sleep(2)
gross_score = browser.find_element_by_xpath("//*[@id='app']/div/div[2]/div/div[2]/div[2]/span[1]")\
.get_attribute('innerText')
today_score = browser.find_element_by_xpath("//span[@class='my-points-points']").get_attribute('innerText')
print("当前总积分:" + str(gross_score))
print("今日积分:" + str(today_score))
print("获取积分完毕,即将退出\n")


if __name__ == '__main__':
login_simulation() # 模拟登录
read_articles() # 阅读文章
watch_videos() # 观看视频
get_scores() # 获得今日积分
browser.quit() 查看全部
话不多说,爱国爱党爱人民!!! 本代码转载至github其他人,与本人无关。
 
# _*_ coding: utf-8 _*_

from selenium import webdriver
import time

__author__ = 'Silent_Coder'
__date__ = '2019/3/12 22:41'

HOME_PAGE = 'https://www.xuexi.cn/'
VIDEO_LINK = 'https://www.xuexi.cn/a191dbc3067d516c3e2e17e2e08953d6/b87d700beee2c44826a9202c75d18c85.html?pageNumber=39'
LONG_VIDEO_LINK = 'https://www.xuexi.cn/f65dae4a57fe21fcc36f3506d660891c/b2e5aa79be613aed1f01d261c4a2ae17.html'
LONG_VIDEO_LINK2 = 'https://www.xuexi.cn/0040db2a403b0b9303a68b9ae5a4cca0/b2e5aa79be613aed1f01d261c4a2ae17.html'
TEST_VIDEO_LINK = 'https://www.xuexi.cn/8e35a343fca20ee32c79d67e35dfca90/7f9f27c65e84e71e1b7189b7132b4710.html'
SCORES_LINK = 'https://pc.xuexi.cn/points/my-points.html'
LOGIN_LINK = 'https://pc.xuexi.cn/points/login.html'
ARTICLES_LINK = 'https://www.xuexi.cn/d05cad69216e688d304bb91ef3aac4c6/9a3668c13f6e303932b5e0e100fc248b.html'

options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
browser = webdriver.Chrome(executable_path=r'D:\OneDrive\Python\selenium\chromedriver.exe',options=options)


def login_simulation():
"""模拟登录"""
# 方式一:使用cookies方式
# 先自己登录,然后复制token值覆盖
# cookies = {'name': 'token', 'value': ''}
# browser.add_cookie(cookies)

# 方式二:自己扫码登录
browser.get(LOGIN_LINK)
browser.maximize_window()
browser.execute_script("var q=document.documentElement.scrollTop=1000")
time.sleep(10)
browser.get(HOME_PAGE)
print("模拟登录完毕\n")


def watch_videos():
"""观看视频"""
browser.get(VIDEO_LINK)
videos = browser.find_elements_by_xpath("//div[@id='Ck3ln2wlyg3k00']")
spend_time = 0

for i, video in enumerate(videos):
if i > 6:
break
video.click()
all_handles = browser.window_handles
browser.switch_to_window(all_handles[-1])
browser.get(browser.current_url)

# 点击播放
browser.find_element_by_xpath("//div[@class='outter']").click()
# 获取视频时长
video_duration_str = browser.find_element_by_xpath("//span[@class='duration']").get_attribute('innerText')
video_duration = int(video_duration_str.split(':')[0]) * 60 + int(video_duration_str.split(':')[1])
# 保持学习,直到视频结束
time.sleep(video_duration + 3)
spend_time += video_duration + 3
browser.close()
browser.switch_to_window(all_handles[0])

# if spend_time < 3010:
# browser.get(LONG_VIDEO_LINK)
# browser.execute_script("var q=document.documentElement.scrollTop=850")
# try:
# browser.find_element_by_xpath("//div[@class='outter']").click()
# except:
# pass
#
# # 观看剩下的时间
# time.sleep(3010 - spend_time)
browser.get(TEST_VIDEO_LINK)
time.sleep(3010 - spend_time)
print("播放视频完毕\n")


def read_articles():
"""阅读文章"""
browser.get(ARTICLES_LINK)
articles = browser.find_elements_by_xpath("//div[@id='Ca4gvo4bwg7400']")
for index, article in enumerate(articles):
if index > 7:
break
article.click()
all_handles = browser.window_handles
browser.switch_to_window(all_handles[-1])
browser.get(browser.current_url)
for i in range(0, 2000, 100):

js_code = "var q=document.documentElement.scrollTop=" + str(i)
browser.execute_script(js_code)
time.sleep(5)
for i in range(2000, 0, -100):
js_code = "var q=document.documentElement.scrollTop=" + str(i)
browser.execute_script(js_code)
time.sleep(5)
time.sleep(80)
browser.close()
browser.switch_to_window(all_handles[0])
print("阅读文章完毕\n")


def get_scores():
"""获取当前积分"""
browser.get(SCORES_LINK)
time.sleep(2)
gross_score = browser.find_element_by_xpath("//*[@id='app']/div/div[2]/div/div[2]/div[2]/span[1]")\
.get_attribute('innerText')
today_score = browser.find_element_by_xpath("//span[@class='my-points-points']").get_attribute('innerText')
print("当前总积分:" + str(gross_score))
print("今日积分:" + str(today_score))
print("获取积分完毕,即将退出\n")


if __name__ == '__main__':
login_simulation() # 模拟登录
read_articles() # 阅读文章
watch_videos() # 观看视频
get_scores() # 获得今日积分
browser.quit()

scrapyd 日志文件中文乱码 解决方案

python爬虫李魔佛 发表了文章 • 0 个评论 • 66 次浏览 • 2019-03-27 17:13 • 来自相关话题

用网页打开scrapyd的后台管理页面后,选择日志,会发现里面的中文是乱码。即使下载下来看也是乱码。
网上一般的解决方法是修改scrapyd的源码,增加一个utf8的编码页面,需要重新写一个html的页面框架,对于一般只是看看日志的朋友来说,没必要这么大刀阔斧的。
 
可以直接使用postman来打开日志文件,里面的中文是正常的。





  查看全部
用网页打开scrapyd的后台管理页面后,选择日志,会发现里面的中文是乱码。即使下载下来看也是乱码。
网上一般的解决方法是修改scrapyd的源码,增加一个utf8的编码页面,需要重新写一个html的页面框架,对于一般只是看看日志的朋友来说,没必要这么大刀阔斧的。
 
可以直接使用postman来打开日志文件,里面的中文是正常的。

scrapyd.PNG

 

运行keras报错 No module named 'numpy.core._multiarray_umath'

深度学习李魔佛 发表了文章 • 0 个评论 • 462 次浏览 • 2019-03-26 18:10 • 来自相关话题

python用的是anaconda安装的。ModuleNotFoundError Traceback (most recent call last)
ModuleNotFoundError: No module named 'numpy.core._multiarray_umath'
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
ImportError: numpy.core.multiarray failed to import

The above exception was the direct cause of the following exception:

SystemError Traceback (most recent call last)
C:\ProgramData\Anaconda3\lib\importlib\_bootstrap.py in _find_and_load(name, import_)

SystemError: <class '_frozen_importlib._ModuleLockManager'> returned a result with an error set
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
ImportError: numpy.core._multiarray_umath failed to import
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
ImportError: numpy.core.umath failed to import
2019-03-26 18:01:48.643796: F tensorflow/python/lib/core/bfloat16.cc:675] Check failed: PyBfloat16_Type.tp_base != nullptr
 
以前没遇到这个问题,所以怀疑是conda自带的numpy版本过低,然后使用命令 pip install numpy -U
把numpy更新到最新的版本,然后问题就解决了。
  查看全部
python用的是anaconda安装的。
ModuleNotFoundError                       Traceback (most recent call last)
ModuleNotFoundError: No module named 'numpy.core._multiarray_umath'
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
ImportError: numpy.core.multiarray failed to import

The above exception was the direct cause of the following exception:

SystemError Traceback (most recent call last)
C:\ProgramData\Anaconda3\lib\importlib\_bootstrap.py in _find_and_load(name, import_)

SystemError: <class '_frozen_importlib._ModuleLockManager'> returned a result with an error set
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
ImportError: numpy.core._multiarray_umath failed to import
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
ImportError: numpy.core.umath failed to import
2019-03-26 18:01:48.643796: F tensorflow/python/lib/core/bfloat16.cc:675] Check failed: PyBfloat16_Type.tp_base != nullptr
 
以前没遇到这个问题,所以怀疑是conda自带的numpy版本过低,然后使用命令 pip install numpy -U
把numpy更新到最新的版本,然后问题就解决了。