TCP服务器端
1 | #!/usr/bin/env python |
对handle进行了重写,原本为
1 | def handle(self):pass |
TCP客户端
1 | #!/usr/bin/env python |
在这个例子中,连接了服务器两次
1 | #!/usr/bin/env python |
对handle进行了重写,原本为
1 | def handle(self):pass |
1 | #!/usr/bin/env python |
在这个例子中,连接了服务器两次
在python3中,进行发送的数据都进行encode操作,转化为字符,而输出的部分都进行decode转化为string。
1 | #!/usr/bin/env python |
1 | #!/usr/bin/env python |
1 | #!/usr/bin/env python |
1 | #!/usr/bin/env python |
冒泡学习笔记,原帖地址:https://github.com/damonare/Sorts
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
1 | /** |
1 | /** |
还有一种改进:
1 | /** |
写了一个Python抓取新浪财经的脚本
1 | #!/usr/bin/python |
脚本的运行效率不高,循环99999次用了2000s。
这里记录下写时遇到的几个坑:
Python zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。
语法:
1 | str.zfill(width) |
这个方法的返回值为str,我以前一直以为为list
中文字符乱码
这个问题是看这篇博文解决的,这里直接抄原画:
通过chardet库,嗅探编码,如果你安装了这个库。
总的来说:
如果是网页标称为GB2312,但是部分字符用到了GBK的了,那么解决办法就是在调用BeautifulSoup,传递参数fromEncoding=”GBK”,即:
1 | page = urllib2.build_opener().open(req).read() |
如果是网页标称为GBK,但是部分字符用到了GB18030的了,那么解决办法就是在调用BeautifulSoup,传递参数fromEncoding=”GB18030″,即:
1 | page = urllib2.build_opener().open(req).read() |
实际上由于GB18030从字符数上都涵盖了GB2312和GBK,所以如果是上述两种任意情况,即只要是中文字符出现乱码,不管是标称GB2312中用到了GBK,还是标称GBK中用到了GB18030,那么都直接传递GB18030,也是可以的,即:
1 | soup = BeautifulSoup(page, fromEncoding=”GB18030“) |
哦,对了,接下来会学习下多线程处理(笑)
这两天学了阮一峰的Firebug控制台详解,记录下。
1 | <!DOCTYPE html> |
console上述的集中度支持printf的占位符格式,支持的占位符有:字符(%s)、整数(%d或%i)、浮点数(%f)和对象(%o)
1 | console.log("%d年%d月%d日",2011,3,26); |
如果信息太多,可以分组显示,用到的方法是console.group()和console.groupEnd()。
1 | <!DOCTYPE html> |
console.dir()可以显示一个对象所有的属性和方法。
1 | <!DOCTYPE html> |
console.dirxml()用来显示网页的某个节点(node)所包含的html/xml代码。
1 | <!DOCTYPE html> |
console.assert()用来判断一个表达式或变量是否为真。如果结果为否,则在控制台输出一条相应信息,并且抛出一个异常。
1 | <!DOCTYPE html> |
console.trace()用来追踪函数的调用轨迹
1 | <!DOCTYPE html> |
console.time()和console.timeEnd(),用来显示代码的运行时间
1 | <!DOCTYPE html> |
下面是一个简单的爬虫示例,主要运用了两个库
urllib
和BeautifulSoup
1 | from urllib.request import urlopen |
在这个例子中,使用了两个try
保障了这个域名不为空,且包含h1
这个元素
举个例子:
1 | # BeautifulSoup的.get_text()会把超链接,段落和标签都清楚掉,只剩下一串不带标签的文字 |
这个例子截取的网页中有一段小说的章节,其中人物名称部分的属性为class = "green"
使用bs的findall将所有带class = "green"
的元素找出来,再用.get_text()将人名过滤出来。
Beautifulsoup
上面例子中的bsObj
标签tag对象
Beautifulsoup对象通过findall()
和find()
,或者直接用bsObj.div.h1
来获取一列对象或者一个对象
NavigableString
用来表示标签的文字
Comment
用来查找HTML文档的注释标签,like this <!-- 123 -->
导航树(Navigating tree)通过标签在闻到中的位置来查找标签。(感觉上就是DOM的树结构了)
在BeautifulSoup库中,孩子(child)和后代(descendant)有显著的不同:子标签就是一个夫标签的下一级,而后代标签是一个夫标签下面所有级别的标签。因此可以说,所有子标签都是后代标签,但不是所有的后代标签都是子标签。
一般情况下BeautifulSoup函数总是处理当前标签的后代标签。例如,bsObj.body.h1
选择了body
标签后代里的第一个h1
标签,而不会去找body
外面的标签。
于此类似,bsObj.div.findAll("img")
会找出文档中第一个div
标签,然后获取这个div
后代里的所有img
标签列表。
今天完成了一个小爬虫练习,将一个overwatch的壁纸分享上的图片爬了下来并保存在本地
代码如下:
1 | # 抓取网页中的图片到本地 |
在写的过程中遇到几个坑,记录一下:
decode('UTF-8')
wb
方式,二进制方式写数据接下来会系统学习下网络爬虫,基于python3(笑)
Python的正则表达式依赖于re模块:1
import re
基本结构为:
string –> Pattern –> Match –>result
简单示例:
1 | import re |
另一个基本示例:
1 | import re |
正则表达式语法(匹配单个字符):
字符 | 匹配 | 示例 |
---|---|---|
. | 匹配任意字符(除\n外) | re.match(r’.’,’d’) |
[…] | 匹配字符集 | re.match(r’[a-zA-Z0-9]’,’d’) |
\d / \D | 匹配数字 / 非数字 | re.match(r’\d’, ‘0’) |
\s / \S | 匹配空白 / 非空白字符 | re.match(r’\s’, ‘ ‘) |
\w / \W | 匹配单词字符[a-zA-Z0-9] / 非单词字符 | re.match(r’\w’, ‘d’) |
正则表达式语法(匹配多个字符):
字符 | 匹配 | 示例 |
---|---|---|
* | 匹配前一个字符0到无限次 | re.match(r’[A-Z][a-z]*’, ‘Dlala123’) |
+ | 匹配前一个字符1到无限次 | ma = re.match(r’[_a-zA-Z]+[\w]*’, ‘_Dlala123’) |
? | 匹配前一个字符0次或1次 | ma = re.match(r’[1-9]?[0-9]*’,’76’) |
{m} / {m,n} | 匹配一个字符m次 / m到n次 | ma = re.match(r’[0-9A-Za-z]{6,9}@mail.com’, ‘dwk715@mail.com’) |
*? / +? / ?? | 匹配模式变为非贪婪(尽可能减少匹配字符) | 0次,1次,0次 |
re模块有很多个方法,下面介绍一下:
search(pattern, string, flags=0)
在一个字符串中查找匹配
类似于字符串的find
1 | import re |
findall(pattern, string, flags=0)
找到匹配,返回所有匹配部分的列表
1 | import re |
1 | sub(pattern, repl. string, count=0, flags=0) |
将字符串中匹配正则表达式的部分替换为其他值
1 | import re |
1 | import re |
1 | split(pattern, string, maxsplit=0, flags=0) |
1 | import re |
老样子,在Mac OS还是改下awk的版本为gnu awk
1 | brew install coreutils |
if downloading a installed package, “yumdownloader” is useful.
1. Install the yum-utils package:
1 | # yum install yum-utils |
2. Run the command followed by the desired package:
1 | # yumdownloader <package> |
1 | #rpm -ivh <package> |