-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
179 lines (179 loc) · 42 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title><![CDATA[shell运算符]]></title>
<url>%2F2018%2F02%2F10%2Fshell-operator%2F</url>
<content type="text"><![CDATA[shell运算符包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符关系运算符 运算符 说明 -eq 检测两个数是否相等,相等返回 true。 -ne 检测两个数是否相等,不相等返回 true。 -gt 检测左边的数是否大于右边的,如果是,则返回 true。 -lt 检测左边的数是否小于右边的,如果是,则返回 true。 -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。检测左边的数是否小于等于右边的,如果是,则返回 true。 -le 检测左边的数是否小于等于右边的,如果是,则返回 true。 布尔运算符 运算符 说明 ! 非运算,表达式为 true 则返回 false,否则返回 true。 -o 或运算,有一个表达式为 true 则返回 true -a 与运算,两个表达式都为 true 才返回 true 逻辑运算符 运算符 说明 && 逻辑的 AND \\ 逻辑的 OR 字符串运算符 运算符 说明 = 检测两个字符串是否相等,相等返回 true。 != 检测两个字符串是否相等,不相等返回 true -z 检测字符串长度是否为0,为0返回 true。 -n 检测字符串长度是否为0,不为0返回 true。 str 检测字符串是否为空,不为空返回 true 123456789101112131415161718192021222324252627282930313233 a="abc"b="efg"if [ $a = $b ]then echo "$a = $b : a 等于 b"else echo "$a = $b: a 不等于 b"fiif [ $a != $b ]then echo "$a != $b : a 不等于 b"else echo "$a != $b: a 等于 b"fiif [ -z $a ]then echo "-z $a : 字符串长度为 0"else echo "-z $a : 字符串长度不为 0"fiif [ -n $a ]then echo "-n $a : 字符串长度不为 0"else echo "-n $a : 字符串长度为 0"fiif [ $a ]then echo "$a : 字符串不为空"else echo "$a : 字符串为空"fi]]></content>
<categories>
<category>shell</category>
</categories>
<tags>
<tag>shell</tag>
</tags>
</entry>
<entry>
<title><![CDATA[shell变量]]></title>
<url>%2F2018%2F02%2F10%2Fshell-bianliang%2F</url>
<content type="text"><![CDATA[shell变量,传参,数组只读变量使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。 1234# 只读变量myurl="www.shell.com"readonly myurlmyurl="www.shell2.com" 运行结果:1./bianliang.sh: line 13: myurl: readonly variable 删除变量使用 unset 命令可以删除变量。语法: 1unset variable_name 变量被删除后不能再次使用。unset 命令不能删除只读变量。 123myUrl="http://www.shell3.com"unset myUrlecho $myUrl 运行结果为空 获取字符串长度12str="abcd"echo ${#str} 输出4 提取字符串1echo ${str:1:2} 输出bc Linux 的字符串截取#、## 表示从左边开始删除。一个 # 表示从左边删除到第一个指定的字符;两个 # 表示从左边删除到最后一个指定的字符。 %、%% 表示从右边开始删除。一个 % 表示从右边删除到第一个指定的字符;两个 % 表示从左边删除到最后一个指定的字符。删除包括了指定的字符本身。 123456789101112var="http://www.shell.com/linux/linux-shell-variable.html"s1=${var%%t*}s2=${var%t*}s3=${var%%.*}s4=${var#*/}s5=${var##*/}echo "source:"${var}echo "%%t*:"${s1}echo "%t*:"${s2}echo "%%.*/:"${s3}echo "#*/:"${s4}echo "##*/:"${s5} 运行结果:1234567source:http://www.shell.com/linux/linux-shell-variable.html%%t*:h%t*:http://www.shell.com/linux/linux-shell-variable.h%%.*/:http://www#*/:/www.shell.com/linux/linux-shell-variable.html##*/:linux-shell-variable.html[root@localhost Linux]# 参数传递 参数 说明 $# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数如”$*“用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。如”$@”用「”」括起来的情况、以”$1” “$2” … “$n” 的形式输出所有参数。 $- 显示Shell使用的当前选项,与set命令功能相同。 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 $* 与 $@ 区别: 相同点:都是引用所有参数。 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 “ * “ 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。12345678910echo "---$*---"for i in "$*";do echo $idoneecho "---$@---"for i in "$@";do echo $idone 运行结果:1234567./bianliang.sh 1 2 3---1 2 3---1 2 3---1 2 3---123 数组for循环遍历数组123456my_array=(a b "c","d" abc)echo "----for------"for i in ${my_array[@]}do echo $ido 运行结果1234567[root@localhost Linux]# ./array.sh----for------abc,dabc[root@localhost Linux]# while循环输出 使用 let i++ 自增1234567echo "while loop, use let i++ increment"j=0while [ $j -lt ${#my_array[@]} ]do echo ${my_array[j]} let j++done 结果同上]]></content>
<categories>
<category>shell</category>
</categories>
<tags>
<tag>shell</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Linux批量查找复制]]></title>
<url>%2F2018%2F02%2F06%2FLinux-cp%2F</url>
<content type="text"><![CDATA[Linux批量查找文件并复制场景要查找到一个目录下的所有txt文件并复制到其他地方例如:目录/a下: /a 目录下面的内容1234567/a/1.txt/a/2.txt/a/3.doc/a/4.xml/a/b/5.txt/a/c/6.txt... 现在需要将所有的txt文件复制到/b目录下 目前有两种办法: 用find命令的选项-exec来执行相应的命令 1# find /a –name *.txt -exec cp {} /b \; {}表示的是由find找到的内容 -exec 是find命令额外动作的开始; \;表示的是额外动作的结束。-exec和\;中间的部分就是额外动作执行的命令。 利用管道(|) 和 xargs 命令1# find /a –name *.txt | xargs cp –t /b xargs 读取find的结果作为cp的输入数据。这里需要注意的是cp命令一定要加-t选项。因为-t选项后面跟着的目录是目标目录。如果不加-t的话-b会被认为是源目录,而xargs读入的文件成了目标目录。这样是会报错误的。]]></content>
<categories>
<category>Linux</category>
</categories>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title><![CDATA[screen命令]]></title>
<url>%2F2017%2F11%2F28%2Fscreen%2F</url>
<content type="text"><![CDATA[screen命令在执行一些长时间任务的时候由于ssh断连会导致任务断掉,所以需要后台运行,nohup或者screen,但screen更强大一下。 创建一个session1screen -S name 其中-S参数表示为session指定一个名称,这样在查询的时候更容易知道应该连接到哪个session 从一个创建的session中退出同时按下ctrl a两个键,松开后按下d 如何查询当前有多少个session:1screen -ls 如何进入一个已经创建的session:1screen -r pid 如何销毁一个session:1kill pid]]></content>
<categories>
<category>Linux</category>
</categories>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title><![CDATA[python自定义异常]]></title>
<url>%2F2017%2F11%2F21%2Fpyhton-except%2F</url>
<content type="text"><![CDATA[在写ssh类的时候遇到一个问题就是无论命令执行功与否程序都都会一直执行下去,造成很多错误。试着用自定义异常解决了这个问题。 try异常在try块里抛,如果会产生多个异常,捕捉第一个,匹配except,后边的不再捕捉 except抓异常 elsetry无异常,才会执行else finally无论try块是否抛异常,永远执行的代码,通常用来执行关闭文件,断开服务器连接的功能 写一个自己的异常类123class Error(Exception): def __str__(self): return "error" 在执行语句前应用12345678910111213try: self.chan.send(source_passwd+'\n') sleep(1) rets=self.chan.recv(65535) print rets if 'scp:' in rets: raise Errorexcept Exception: print 'error' print rets exit(1)finally: print 'end' 在返回rets中若找到scp:则抛出一个自定义异常,except用来接收异常并打印异常返回,不管有没有异常都会执行finally]]></content>
<categories>
<category>python</category>
</categories>
<tags>
<tag>python</tag>
</tags>
</entry>
<entry>
<title><![CDATA[redhat7 配置使用centos的yum源]]></title>
<url>%2F2017%2F11%2F20%2Flinux-yum%2F</url>
<content type="text"><![CDATA[redhat7 配置使用centos的yum源检查是否安装yum包查看RHEL是否安装了yum,若是安装了,那么又有哪些yum包 rpm -qa |grep yum 删除redhat自带的yum包rpm -qa|grep yum|xargs rpm -e –nodeps(不检查依赖,直接删除rpm包) rpm -qa |grep yum 查看,无信息显示表示已经卸载完成。 下载新的yum包。使用Centos7的yum包(或者上传rpm包)wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-3.4.3-150.el7.centos.noarch.rpm wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-40.el7.noarch.rpm wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-utils-1.1.31-40.el7.noarch.rpm wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/python-urlgrabber-3.10-8.el7.noarch.rpm ( rpm -qa|grep python-urlgrabber|xargs rpm -e –nodeps ) 安装yum软件包 注意:单个的安装包可能会依赖其它包(例如yum和yum-fastestmirror会相互依赖),所以我们可以把所有这些包放在一起,用一行命令将它们同时安装即可: rpm -ivh python-urlgrabber-3.10-8.el7.noarch.rpm rpm -ivh yum-metadata-parser-1.1.4-10.el7.x86_64.rpm yum-3.4.3-150.el7.centos.noarch.rpm yum-plugin-fastestmirror-1.1.31-40.el7.noarch.rpm 更换yum源。使用阿里云的源下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo CentOS 6wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repoCentOS 7wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo更改CentOS-Media.repo使其为不生效:enabled=0第三步:修改CentOS-Base.repo文件中的$releasever全部替换为版本号7. 运行yum makecache生成缓存yum clean allyum makecacheyum update 其他办法(redhat7)安装epel-release-latest-7.noarch.rpm 添加rhel-debuginfo.repo1234567891011121314151617181920212223242526[base]name=CentOS-$releasever - Basebaseurl=http://mirrors.163.com/centos/7/os/$basearch/gpgcheck=1gpgkey=http://mirrors.163.com/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7#released updates[updates]name=CentOS-$releasever - Updatesbaseurl=http://mirrors.163.com/centos/7/updates/$basearch/gpgcheck=1gpgkey=http://mirrors.163.com/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7[extras]name=CentOS-$releasever - Extrasbaseurl=http://mirrors.163.com/centos/7/extras//$basearch/gpgcheck=1gpgkey=http://mirrors.163.com/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7[centosplus]name=CentOS-$releasever - Plusbaseurl=http://mirrors.163.com/centos/7/centosplus//$basearch/gpgcheck=1enabled=0]]></content>
<categories>
<category>linux</category>
</categories>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title><![CDATA[函数可变参数处理]]></title>
<url>%2F2017%2F11%2F20%2Fpyhton-params%2F</url>
<content type="text"><![CDATA[Python参数收集的机制使用星号“*”实现,这里即在指定的参数params前面加上一个“*”,“*”的意思就是用params参数收集传入是不定个数的参数,并将收集的到参数以元组的方式存储在params中 Python中在定义函数的时候为不定个数的参数的函数提供的参数收集的机制12def func_params(*params): print params func_params(1)(1,)func_params(1, 2, 3)(1, 2, 3) func_params()() 当然也可以可变参数前面还有普通参数123def func_params1(param1, *params): print param1 print params >>> func_params1(1)1()>>> func_params1(1, 2)1(2,)>>> func_params1(1, 2, 3, 4)1(2, 3, 4)>>> func_params1(1,2,3,[“q”],”ww”,”eqwe”)1(2, 3, [‘q’], ‘ww’, ‘eqwe’) 需要注意的是不定参数后面不能再有普通参数: 上面是函数不能处理关键字参数,如: func_params1(1, params=1)Traceback (most recent call last): File ““, line 1, in func_params1(1, params=1)TypeError: func_params1() got an unexpected keyword argument ‘params’ 关键字参数的处理可以使用“**”来实现:12345678910111213141516171819def func_keys(**keys): print keys ``` \>>> func_keys() {} \>>> func_keys(p1=1) {'p1': 1} \>>> func_keys(p1=1, p2=2,p3='3') {'p2': 2, 'p3': '3', 'p1': 1}上面再参数keys前面加上“\**”,表明参数keys将接收关键字参数,并将关键字和值分别作为键-值对存储在字典中;上面这种函数定义方式的时候,参数要么为空,要么为一个关键字参数:**同样关键字参数后面不能有普通参数*** 关键字参数可以和可变参数结合使用:```pythondef func_keys3(*params, **keys): print params print keys >>> func_keys3()(){}>>> func_keys3(1,2,3)(1, 2, 3){}>>> func_keys3(1,2,k1=1,k2=2)(1, 2){‘k2’: 2, ‘k1’: 1}注意函数定义时,可变参数要在关键字参数的前面 普通参数、可变参数和关键字参数可以结合使用:1234def func_misc(p1, p2, p3, *params, **keys): print p1, p2, p3 print params print keys >>> func_misc(1, 2, 3)1 2 3(){}>>> func_misc(1, 2, 3, 4, 5, 6)1 2 3(4, 5, 6){}>>> func_misc(1, 2, 3, 4, k1=1, k2=2)1 2 3(4,){‘k2’: 2, ‘k1’: 1}>>> func_misc(1, 2, 3, k1=1, k2=2)1 2 3(){‘k2’: 2, ‘k1’: 1} 参数收集的反转过程在参数收集中可以使用“*”和“*”分别将参数收集为元组和字典,同样可以实现其反转过程,可以使用“\”和“**”执行相反的操作;如: “*”反转操作:123def func(p1, p2): print p1 print p2 >>> t=(1,2)>>> func(*t)12 “**”反转操作: 12345678910111213141516k={'p1':1, 'p2':2, 'p3':3} def func_k(p1, p2, p3): print p1, p2, p3 func_k(**k) 1 2 3 def func_k1(p1): print p1 def func_k2(p1,p2,p3,p4=1): print p1,p2,p3 print p4 func_k2(**k) 1 2 3 1]]></content>
<categories>
<category>python</category>
</categories>
<tags>
<tag>python</tag>
</tags>
</entry>
<entry>
<title><![CDATA[python_yield]]></title>
<url>%2F2017%2F11%2F16%2Fpython-yield%2F</url>
<content type="text"><![CDATA[Python yield 使用浅析在学习看到一篇博客后深有体会作为转载学习地址 以生成生成斐波那契数列为例 简单输出斐波那契數列前 N 个数123456def fab(max): n, a, b = 0, 0, 1 while n < max: print b a, b = b, a + b n = n + 1 执行 fab(5)结果没问题,但直接在 fab 函数中用 print 打印数字会导致该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 输出斐波那契數列前 N 个数第二版,返回一个list12345678def fab(max): n, a, b = 0, 0, 1 L = [] while n < max: L.append(b) a, b = b, a + b n = n + 1 return L 可以使用如下方式打印出 fab 函数返回的 List12for n in fab(5): print n 改写后的 fab 函数通过返回 List 能满足复用性的要求,但是该函数在运行中占用的内存会随着参数 max 的增大而增大,如果要控制内存占用,最好不要用 List 通过 iterable 对象来迭代1for i in range(1000): pass 会导致生成一个 1000 个元素的 List,而代码:1for i in xrange(1000): pass 则不会生成一个 1000 个元素的 List,而是在每次迭代中返回下一个数值,内存空间占用很小。因为 xrange 不返回 List,而是返回一个 iterable 对象。利用 iterable 我们可以把 fab 函数改写为一个支持 iterable 的 class,以下是第三个版本的 Fab: 第三个版本12345678910111213141516class Fab(object): def __init__(self, max): self.max = max self.n, self.a, self.b = 0, 0, 1 def __iter__(self): return self def next(self): if self.n < self.max: r = self.b self.a, self.b = self.b, self.a + self.b self.n = self.n + 1 return r raise StopIteration() Fab 类通过 next() 不断返回数列的下一个数,内存占用始终为常数 然而,使用 class 改写的这个版本,代码远远没有第一版的 fab 函数来得简洁。如果我们想要保持第一版 fab 函数的简洁性,同时又要获得 iterable 的效果,yield 就派上用场了: 使用 yield 的第四版1234567def fab(max): n, a, b = 0, 0, 1 while n < max: yield b # print b a, b = b, a + b n = n + 1 简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。 文件读取另一个 yield 的例子来源于文件读取。如果直接对文件对象调用 read() 方法,会导致不可预测的内存占用。好的方法是利用固定长度的缓冲区来不断读取文件内容。通过 yield,我们不再需要编写读文件的迭代类,就可以轻松实现文件读取:123456789def read_file(fpath): BLOCK_SIZE = 1024 with open(fpath, 'rb') as f: while True: block = f.read(BLOCK_SIZE) if block: yield block else: return]]></content>
<categories>
<category>python</category>
</categories>
<tags>
<tag>python_yield</tag>
</tags>
</entry>
<entry>
<title><![CDATA[python_string]]></title>
<url>%2F2017%2F11%2F16%2Fpython-string%2F</url>
<content type="text"><![CDATA[Python标准库— string模块String模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作。 常用方法 常用方法 描述 str.capitalize() 把字符串的首字母大写 str.center(width) 将原字符串用空格填充成一个长度为width的字符串,原字符串内容居中 str.count(s) 返回字符串s在str中出现的次数 str.decode(encoding=’UTF-8’,errors=’strict’) 以指定编码格式解码字符串 str.encode(encoding=’UTF-8’,errors=’strict’) 以指定编码格式编码字符串 str.endswith(s) 判断字符串str是否以字符串s结尾 str.find(s) 返回字符串s在字符串str中的位置索引,没有则返回-1 str.index(s) 和find()方法一样,但是如果s不存在于str中则会抛出异常 str.isalnum() 如果str至少有一个字符并且都是字母或数字则返回True,否则返回False str.isalpha() 如果str至少有一个字符并且都是字母则返回True,否则返回False str.isdigit() 如果str只包含数字则返回 True 否则返回 False str.islower() 如果str存在区分大小写的字符,并且都是小写则返回True 否则返回False str.isspace() 如果str中只包含空格,则返回 True,否则返回 False str.istitle() 如果str是标题化的(单词首字母大写)则返回True,否则返回False str.isupper() 如果str存在区分大小写的字符,并且都是大写则返回True 否则返回False str.ljust(width) 返回一个原字符串左对齐的并使用空格填充至长度width的新字符串 str.lower() 转换str中所有大写字符为小写 str.lstrip() 去掉str左边的不可见字符 str.partition(s) 用s将str切分成三个值 str.replace(a, b) 将字符串str中的a替换成b str.rfind(s) 类似于 find()函数,不过是从右边开始查找 str.rindex(s) 类似于 index(),不过是从右边开始 str.rjust(width) 返回一个原字符串右对齐的并使用空格填充至长度width的新字符串 str.rpartition(s) 类似于 partition()函数,不过是从右边开始查找 str.rstrip() 去掉str右边的不可见字符 str.split(s) 以s为分隔符切片str str.splitlines() 按照行分隔,返回一个包含各行作为元素的列表 str.startswith(s) 检查字符串str是否是以s开头,是则返回True,否则返回False str.strip() 等于同时执行rstrip()和lstrip() str.title() 返回”标题化”的str,所有单词都是以大写开始,其余字母均为小写 str.upper() 返回str所有字符为大写的字符串 str.zfill(width) 返回长度为 width 的字符串,原字符串str右对齐,前面填充0]]></content>
<categories>
<category>python</category>
</categories>
<tags>
<tag>String</tag>
</tags>
</entry>
<entry>
<title><![CDATA[python爬取微博评论并存储到数据库(二)]]></title>
<url>%2F2017%2F11%2F14%2Fweibo1%2F</url>
<content type="text"><![CDATA[从数据库中取出爬到的评论数据并处理取数据从数据库中读取数据,取出前13000条评论,将其转化为list以方便删除其中无用的数据,将处理后的数据分别存到不同的list中 123456789101112131415161718192021222324def readmysql(): commentlist = [] textlist = [] userlist = [] conn = MySQLdb.connect(host='127.0.0.1', user='root', db='scrpay', passwd='123456', charset='utf8') with conn: cur = conn.cursor() cur.execute('SELECT * FROM weibo WHERE id < %d' % 13000) rows = cur.fetchall()#取出数据 for row in rows: row = list(row)#将tuple转换为list进而修改 del row[0] if row not in commentlist: commentlist.append(row) comment_id = row[0] user_name = row[1] userlist.append(user_name) created_at = row[2] text = row[3] textlist.append(text) likenum = row[4] source = row[5] #print comment_id.encode('utf-8'),user_name.encode('utf-8'),created_at.encode('utf-8'),text.encode('utf-8'),likenum.encode('utf-8'),source.encode('utf-8') return commentlist, textlist, userlist 分析数据用云词显示出现词汇的频率123456789101112131415161718def wordtocloud(textlist): fulltext='' cloud = WordCloud(font_path='font.ttf', background_color="white", # 背景颜色 max_words=2000, # 词云显示的最大词数 #mask=back_coloring, # 设置背景图片 max_font_size=100, # 字体最大值 random_state=42, width=1000, height=860, margin=2,# 设置图片默认的大小,但是如果使用背景图片的话,那么保存的图片大小将会按照其大小保存,margin为词语边缘距离 ) #将数据放到文本中,使用jieba分词分出所有词汇 for li in textlist: fulltext += ' '.join(jieba.cut(li,cut_all = False)) wc = cloud.generate(fulltext) #image_colors = ImageColorGenerator(back_coloring) plt.figure("wordc") plt.imshow(wc.recolor()) wc.to_file('微博评论词云.png')]]></content>
<categories>
<category>python</category>
</categories>
<tags>
<tag>python</tag>
</tags>
</entry>
<entry>
<title><![CDATA[用python爬取微博评论并存储到数据库]]></title>
<url>%2F2017%2F11%2F13%2Fweibo%2F</url>
<content type="text"><![CDATA[python 对微博评论进行爬取微博授权调用微博API进行登录,这是方法微博API登录授权 具体实现安装微博API1pip install weibo 测试新建微博应用参考:微博API登录授权1234567App_key = '自己的'App_secret = '自己的'CALLBACK_URL = 'https://api.weibo.com/oauth2/default.html' # 回调链接client = APIClient(app_key=App_key, app_secret=App_secret, redirect_uri=CALLBACK_URL)url = client.get_authorize_url()webbrowser.open_new(url) 微博授权,将返回一个code,在地址栏 输入code进行授权。此处可以自动化使用selenium进行自动点击获取 12345code = raw_input()r = client.request_access_token(code)access_token = r.access_token # 新浪返回的token,类似abc123xyz456expires_in = r.expires_inclient.set_access_token(access_token, expires_in) 根据单条微博ID抓取返回,使用移动端12weibo_id = ('4154417035431509') # 单条微博IDurl = 'https://m.weibo.cn/api/comments/show?id=' + weibo_id + '&page={}' 伪装headers1234567891011headers = { 'User-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', 'Host': 'm.weibo.cn', 'Accept': 'application/json, text/plain, */*;q=0.01', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.8', 'Accept-Encoding': 'gzip, deflate, br', 'Referer': 'https://m.weibo.cn/status/' + weibo_id, 'Cookie': 'ALF=1512569395; SCF=Am_oMeVmtKxusW2bqPM2Bq2tboM-dQhvoAfmoVm30hFM1YxnCOElOw4yQAduKN_s_57PdgmRBDzA-neEV88QH-U.; SUB=_2A253Bdc-DeRhGeNO6VMT8ybFwzuIHXVUCfl2rDV6PUJbktANLXPBkW1qA44VXJ9g04C0C9ZKqCcDhlEdcw..; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9Wh6Lb0JMxwuem5b4Kz02AcF5JpX5K-hUgL.Fo-7eo2Ee0n41hM2dJLoI7LhIs8awgLJ9g.t; SUHB=0YhhquN90t0cqa; SSOLoginState=1510057838; _T_WM=47eac210afab7501038eb13a03e0305b; H5:PWA:UID=1; __guid=52195957.3372748557967896000.1510057840112.0652; H5_INDEX=2; H5_INDEX_TITLE=Chaoyifei; M_WEIBOCN_PARAMS=featurecode%3D20000320%26oid%3D4160547165300149%26luicode%3D20000061%26lfid%3D4160547165300149; monitor_count=16', 'DNT': '1', 'Connection': 'keep-alive',} 登录并获取返回12r = requests.get(url=url.format(i), headers=headers) comment_page = r.json()['data'] 获取评论内容并过滤表情符号1234567891011121314user = comment_page[j] comment_id = user['user']['id'] # print comment_id user_name = user['user']['screen_name'] # print (user_name) created_at = user['created_at'] # print created_at # 屏蔽表情符 text = re.sub('<.*?>|回复<.*?>:|[\U00010000-\U0010ffff]|[\uD800-\uDBFF][\uDC00-\uDFFF]', '', user['text']) # print text likenum = user['like_counts'] # print likenum source = re.sub('[\U00010000-\U0010ffff]|[\uD800-\uDBFF][\uDC00-\uDFFF]', '', user['source']) 插入到数据库(数据库已经建表)1234567891011121314source = re.sub('[\U00010000-\U0010ffff]|[\uD800-\uDBFF][\uDC00-\uDFFF]', '', user['source']) # print source+'\r\n' conn = MySQLdb.connect(host='127.0.0.1', user='root', db='scrpay', passwd='123456', charset='utf8') cur = conn.cursor() sql = "insert into weibo(comment_id,user_name,created_at,text,likenum,source) values(%s,%s,%s,%s,%s,%s)" param = (comment_id, user_name, created_at, text, likenum, source) try: A = cur.execute(sql, param) conn.commit() print '成功' except Exception as e: print e print '失败' conn.rollback()]]></content>
<categories>
<category>python</category>
</categories>
<tags>
<tag>pyhton</tag>
</tags>
</entry>
<entry>
<title><![CDATA[wordcloud云词基本使用]]></title>
<url>%2F2017%2F11%2F12%2Fwordcloud%2F</url>
<content type="text"><![CDATA[文本挖掘-wordcloud、主题模型与文本分类分词、取词是关键和基础。图片毕竟只是一个可视化的展示手段,内容更重要。分词前要想清楚是否屏蔽某些词性(jieba提供这种功能,但是学习的还不透彻,以后可以专门记录一些分词的东西),分词以后也可以手动删除一些词语,使重点突出。 遮罩图片的选择很重要。首先需要是大面积白底,否则会整张图片铺满词语。其次,图片的颜色要丰富,最好能有渐变度,这样的配色会很舒服。但是符合条件的图片实在是太难找了…可遇而不可求。 最后,完美的图片需要很多次地微调参数。词语的数量,字体的大小等,都会对整张图片的效果和词云形状的拟合度产生影响。 这些只是对现有工具的简单学习应用,并没有什么创新与创造。 安装1pip install wordcloud 使用示例:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374#coding:utf-8 from os import path from scipy.misc import imread #(scipy是基于numpy提供更强大的科学计算库)import matplotlib.pyplot as plt #(绘图库)import jieba #(分词库)from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator #STOPWORDS停词,去掉一些无意义的词比如(我,你,是等语气词)stopwords = {} def importStopword(filename=''): global stopwords f = open(filename, 'r', encoding='utf-8') #() line = f.readline().rstrip() while line: stopwords.setdefault(line, 0) stopwords[line] = 1 line = f.readline().rstrip() f.close() def processChinese(text): seg_generator = jieba.cut(text) # 使用结巴分词,也可以不使用 seg_list = [i for i in seg_generator if i not in stopwords] seg_list = [i for i in seg_list if i != u' '] seg_list = r' '.join(seg_list) return seg_list importStopword(filename='./stopwords.txt') # 获取当前文件路径 # __file__ 为当前文件, 在ide中运行此行会报错,可改为 # d = path.dirname('.') d = path.dirname(__file__) text = open(path.join(d, 'love.txt'),encoding ='utf-8').read() #如果是中文 #text = processChinese(text)#中文不好分词,使用Jieba分词进行 # read the mask / color image # taken from http://jirkavinse.deviantart.com/art/quot-Real-Life-quot-Alice-282261010 # 设置背景图片 back_coloring = imread(path.join(d, "./image/love.jpg")) wc = WordCloud( font_path='./font/cabin-sketch.bold.ttf',#设置字体 background_color="black", #背景颜色 max_words=2000,# 词云显示的最大词数 mask=back_coloring,#设置背景图片 max_font_size=100, #字体最大值 random_state=42, ) # 生成词云, 可以用generate输入全部文本(中文不好分词),也可以我们计算好词频后使用generate_from_frequencies函数 wc.generate(text) # wc.generate_from_frequencies(txt_freq) # txt_freq例子为[('词a', 100),('词b', 90),('词c', 80)] # 从背景图片生成颜色值 image_colors = ImageColorGenerator(back_coloring) plt.figure() # 以下代码显示图片 plt.imshow(wc) plt.axis("off") plt.show() # 绘制词云 # 保存图片 wc.to_file(path.join(d, "名称.png"))]]></content>
<categories>
<category>库</category>
</categories>
<tags>
<tag>Python</tag>
</tags>
</entry>
<entry>
<title><![CDATA[jieba分词]]></title>
<url>%2F2017%2F11%2F12%2Fjieba%2F</url>
<content type="text"><![CDATA[jieba分词基本用法特点 支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分析; 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义; 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。 支持繁体分词 支持自定义词典主要功能* jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型 jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细 待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8 jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用jieba.lcut 以及 jieba.lcut_for_search 直接返回 list jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。示例: 123456789101112import jiebaseg_list = jieba.cut("我来到北京清华大学", cut_all=True)print("Full Mode: " + "/ ".join(seg_list)) # 全模式seg_list = jieba.cut("我来到北京清华大学", cut_all=False)print("Default Mode: " + "/ ".join(seg_list)) # 精确模式seg_list = jieba.cut("他来到了网易杭研大厦") # 默认是精确模式print(", ".join(seg_list))seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 搜索引擎模式print(", ".join(seg_list)) 输出:1234567【全模式】: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学【精确模式】: 我/ 来到/ 北京/ 清华大学【新词识别】:他, 来到, 了, 网易, 杭研, 大厦 (此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了)【搜索引擎模式】: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造]]></content>
<categories>
<category>python,库</category>
</categories>
<tags>
<tag>Python</tag>
</tags>
</entry>
<entry>
<title><![CDATA[mysql基本操作]]></title>
<url>%2F2017%2F11%2F10%2Fmysql%2F</url>
<content type="text"><![CDATA[mysql基本操作对用户授权的操作grant 权限 on 数据库名.表名 to 用户名@’可以访问的地址’ identified by “密码”权限: all 所有权限 usage 无权限 select,update,insert,delete,等权限数据库.表名:   *.*   所有数据库的所有表        数据库名.*  单个数据库的所有表       数据库名.表名   单个数据库的某个表用户名: 授权的用户名可以访问的地址:% 所有地址,但是localhost不能访问     localhost  只有localhost可以访问     192.168.1.0/24  可以访问网段地址     192.168.1.1  只能某个地址访问flush privileges; 刷新授权 操作 给bigdata用户授予在localhost登录,对mysql数据库进行create,select,update,insert,delete操作,但是不设置密码就可以登陆 12mysql> grant create,select,update,insert,delete on mysql.* to bigdata@'localhost';mysql> flush privileges; 登录数据库查看权限:1mysql>show grants; 给bigdata用户授予从192.168.0.7的机器登陆,并有bigdatas数据库相应的权限 123mysql> grant create,select,insert,update on bigdata.* to bigdata@'192.168.0.7' identified by "bigdata";Query OK, 0 rows affected (0.00 sec)mysql> flush privileges; 客户端登录1mysql -h192.168.0.7 -uzhaoyun -pzhaoyun; 给用户授予可以把自己权限再授给其他人的权限 1mysql> grant create on bigdta1 to zhaoyun@'192.168.0.7' identified by "bigdta" with grant option ; 撤销权限 1mysql> revoke create on bigdata.* from bigdata@'192.168.0.7' ; 清空数据表清空数据表使id从1开始truncate table 表名;]]></content>
<categories>
<category>基础</category>
</categories>
<tags>
<tag>mysql</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Linux防火墙]]></title>
<url>%2F2017%2F11%2F06%2FLinx-fireworld%2F</url>
<content type="text"><![CDATA[Linux各系统防火墙设置Centos,RedhatCnetos6,Redhat6 查看防火墙状态: 1[linuxidc@localhost ~]$service iptable status 关闭防火墙(临时关闭) 1servcie iptables stop 永久关闭防火墙 1chkconfig iptables off 开启防火墙 1servcie iptables start 防火墙特定端口打开关闭 方法一: 123/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT/etc/init.d/iptables saveservice iptables restart 方法二 vi /etc/sysconfig/iptables 打开配置文件加入如下语句:-A INPUT -p tcp -m state –state NEW -m tcp –dport 80 -j ACCEPT 重启防火墙,修改完成。 关闭特定端口: 方法一:/sbin/iptables -I INPUT -p tcp –dport 80 -j DROP /etc/init.d/iptables save 保存修改service iptables restart 重启防火墙,修改生效 方法二: vi /etc/sysconfig/iptables 打开配置文件加入如下语句: -A INPUT -p tcp -m state –state NEW -m tcp –dport 80 -j DROP 重启防火墙,修改完成 查看端口状况:1/etc/init.d/iptables status Cnetos7,Redhat7 启动 1systemctl start firewalld 停止 1systemctl disable firewalld 禁用 1systemctl stop firewalld 状态 1systemctl status firewalld 开启端口 firewall-cmd –zone=public –add-port=80/tcp –permanent (–permanent永久生效,没有此参数重启后失效) 重新载入 1firewall-cmd --reload 查看 1firewall-cmd --zone= public --query-port=80/tcp 删除 1firewall-cmd --zone= public --remove-port=80/tcp --permanent systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。启动一个服务:systemctl start firewalld.service关闭一个服务:systemctl stop firewalld.service重启一个服务:systemctl restart firewalld.service显示一个服务的状态:systemctl status firewalld.service在开机时启用一个服务:systemctl enable firewalld.service在开机时禁用一个服务:systemctl disable firewalld.service查看服务是否开机启动:systemctl is-enabled firewalld.service查看已启动的服务列表:systemctl list-unit-files|grep enabled查看启动失败的服务列表:systemctl –failed 配置firewalld-cmd查看版本: firewall-cmd –version查看帮助: firewall-cmd –help显示状态: firewall-cmd –state查看所有打开的端口: firewall-cmd –zone=public –list-ports更新防火墙规则: firewall-cmd –reload查看区域信息: firewall-cmd –get-active-zones查看指定接口所属区域: firewall-cmd –get-zone-of-interface=eth0拒绝所有包:firewall-cmd –panic-on取消拒绝状态: firewall-cmd –panic-off查看是否拒绝: firewall-cmd –query-panic##SUSE SUSE防火墙查看命令123linux:~ # chkconfig -list|grep -i fireSuSEfirewall2_init 0:off 1:off 2:off 3:off 4:off 5:off 6:offSuSEfirewall2_setup 0:off 1:off 2:off 3:off 4:off 5:off 6:off SUSE防火墙立即停止命令1234linux:~ # SuSEfirewall2 stopSuSEfirewall2: Warning: ip6tables does not support state matching. Extended IPv6 support disabled.SuSEfirewall2: batch committing...SuSEfirewall2: Firewall rules unloaded. SUSE默认的防火墙设置为禁止所有外来联结。如果你想开放某个端口的话,就得修改防火墙设置开放这个端口。本文介绍了怎么修改SUSE的防火墙设置以开放某指定端口。手动修改: #vi /etc/sysconfig/SUSEfirewall2 #TCP端口的情况:FW_SERVICES_EXT_TCP = “6000” #UDP端口的情况:FW_SERVICES_EXT_UDP = “177”防火墙设置的生效: #rcSUSEfirewall2 restart]]></content>
<categories>
<category>Linux</category>
</categories>
<tags>
<tag>Linux firewalld</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Markdown]]></title>
<url>%2F2017%2F11%2F05%2FMarkdown%2F</url>
<content type="text"><![CDATA[  Markdown 是一种文本格式。你可以用它来控制文档的显示。使用 markdown,你可以创建粗体的文字,斜体的文字,添加图片,并且创建列表 等等。基本上来讲,Markdown 就是普通的文字加上 # 或者 * 等符号。 markdown Markdown语法标题123456# 这是 \<h1> 一级标题## 这是 \<h2> 二级标题### 这是 \<h3> 三级标题#### 这是 \<h4> 四级标题##### 这是 \<h5> 五级标题###### 这是 \<h6> 六级标题 强调这会是 斜体 的文字这会是 斜体 的文字 这会是 粗体 的文字这会是 粗体 的文字 你也 **组合** 这些符号 这个文字将会被横线删除123456789*这会是 斜体 的文字*_这会是 斜体 的文字_**这会是 粗体 的文字**__这会是 粗体 的文字___你也 \*\*组合** 这些符号_~~这个文字将会被横线删除~~ 列表无序列表 Item 1 Item 2 Item 2a Item 2b1234* Item 1* Item 2 * Item 2a * Item 2b 有序列表 Item 1 Item 2 Item 3 Item 3a Item 3b123456781. Item 11. Item 21. Item 3 1. Item 3a 1. Item 3b## 添加图片![GitHub Logo](/images/logo.png)Format: ![Alt Text](url) Format: 123## 链接http://github.com - 自动生成![GitHub](http://github.com) http://github.com - 自动生成!GitHub 引用正如 Kanye West 所说: We’re living the future sothe present is our past.123正如 Kanye West 所说:> We're living the future so> the present is our past. 分割线如下,三个或者更多的 连字符 星号 下划线123456789101112---连字符***星号___下划线 行内代码我觉得你应该在这里使用<addr> 才对。12我觉得你应该在这里使用`<addr>` 才对。 代码块你可以在你的代码上面和下面添加 来表示代码块。12```你可以在你的代码上面和下面添加 ``` 来表示代码块。 语法高亮你可以给你的代码块添加任何一种语言的语法高亮 例如,给 ruby 代码添加语法高亮: 123require 'redcarpet'markdown = Redcarpet.new("Hello World!")puts markdown.to_html markdown表示:1234```rubyrequire 'redcarpet'markdown = Redcarpet.new("Hello World!")puts markdown.to_html 代码块 class(MPE 扩展的特性)你可以给你的代码块设置 class。 例如,添加 class1 class2 到一个 代码块: {.class1 .class}123function add(x, y) { return x + y} markdownb表示12345678你可以给你的代码块设置 class。例如,添加 class1 class2 到一个 代码块:```javascript {.class1 .class}function add(x, y) { return x + y} 代码行数如果你想要你的代码块显示代码行数,只要添加 line-numbers class 就可以了。 例如: {.line-numbers}123function add(x, y) { return x + y} markdown表示1234```javascript {.line-numbers}function add(x, y) { return x + y}]]></content>
<categories>
<category>markdown</category>
</categories>
<tags>
<tag>markdown hexo</tag>
</tags>
</entry>
</search>