canonxu 2016-11-06T16:56:37+00:00 canonxu@yeah.net 一个简单的Python爬虫程序 2014-12-15T00:00:00+00:00 canonxu http://canonxu.com/2014/12/一个简单的Blog爬虫程序 利用Python自带的urllib模块,对我自己博客的一篇文章Pycon2014 @Shanghai进行爬取,得到blog_spider文件和博客中的插图,并将插图按顺序重命名。爬取到的内容如下,一个html文件和五幅图片。

源码如下,首先是读取并保存html文件,通过urllib.urlopen连接到页面,read()方法读取页面,保存html文件,然后提取出html中的图片链接,利用正则表达式和re模块中的re.findall()提取出图片链接默认保存为list, 最后,通过rl.retrieve()方法将图片直接下载,重命名。

import urllib
import re
import os

os.path.join(r'E:\learn-python', r'blog_spider')
os.mkdir(r'E:\learn-python\blog_spider')

def gethtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

def getimg(html):
    img_re = re.compile(r'src="(.+?\.jpg)"')
    imglist = re.findall(img_re,html)
    return imglist

blog_html = gethtml('http://canonxu.com/2014/11/Pycon2014@Shanghai/')
with open(r'E:\learn-python\blog_spider\blog_html.html', 'w') as f:
   f.write(blog_html)

blog_imglist = getimg(blog_html)
x = 0
for imgurl in blog_imglist:
    urllib.urlretrieve(imgurl,r'E:\learn-python\blog_spider\%s.jpg' % x)
    x+=1

这几乎是最简单的爬虫,我尝试利用这种最简单的机制对新浪微博等进行爬取,均告失败,说明还是有很多的内容等着我去学习的。 要实现更为复杂的爬虫,难点之一在于正则表达式,一般拿到正确的正则表达式就可以进行无障碍爬取,正则表达式是网络编程的重点和难点,值得花大功夫学习。难点之二在于一些常用高效的爬虫模块的学习,如urllib,urllib2,scrapy等,需要花时间看。然而,最大的难点在于许多网站有反爬虫机制,破解也需要具体问题具体分析,怎么做http伪装,分布式,ip池等都有很多的学问,多动脑筋才行。

学习爬虫是一件很有趣的事情 :)

]]>
Google技术开发之南:给大学生自学的建议 2014-11-24T00:00:00+00:00 canonxu http://canonxu.com/2014/11/Google技术开发指南:给大学生自学的建议 今天在微博上看到好几个老师分享这篇文章。我觉得写得很全面,很有指导意义,翻译过来供自己和大家经常看看。要学习的东西太多,时间宝贵,只争朝夕!

本文译自:Guide for Technical Development

想成为一个成功的软件工程师,扎实的计算机科学知识非常重要。这份指南为那些想要通过自学提高开发能力的大学生们提供一些建议,包括理论学习和非理论学习两部分。但是在你根据这份指南学习相关课程之前,请确保不要间断学习自己专业所需的课程,这关系到你能不能毕业。这份指南提供的在线学习资源并不是为了取代你所在学校开设的课程,而是让你补充学习相关知识或者告诉你一些导论性的知识。

使用这份指南时,请注意:

  • 批判性地使用这份指南,不要盲从
  • 或许有不在这份指南上但你想学习或想做的事情,尽管去做!
  • 学习完这份指南上罗列的所有知识,不保证你能得到Google的Offer
  • 这份指南将会有更新或修改,请及时关注

关注我们的Google for Students +Page,你可以获得更多指导和资源,并认识同样有志于软件开发的学生。

推荐之理论学习

  • CS课程介绍

说明:指导编程的CS课程简介

在线资源:Udacity - intro to CS course , Coursera - Computer Science 101

  • 学习至少一种面向对象语言: C++,Java,或者Python

在线资源(初学者):Coursera - Learn to Program: The Fundamentals , MIT Intro to Programming in Java , Google's Python Class , Coursera - Introduction to Python , Python Open Source E-Book

在线资源(进阶): Udacity's Design of Computer Programs , Coursera - Learn to Program: Crafting Quality Code , Coursera - Programming Languages , Brown University - Introduction to Programming Languages

  • 学习其他编程语言

说明:技多不压身,学习如下语言:Java Script, CSS, HTML, Ruby, PHP, C, Perl, Shell. Lisp, Scheme。

在线资源:: w3school.com - HTML Tutorial, CodeAcademy.com

  • 测试代码

说明:学习如何找到Bug,构建测试代码,破解自己的软件

在线资源:Udacity - Software Testing Methods, Udacity - Software Debugging

  • 学习逻辑推理和离散数学

在线资源: MIT Mathematics for Computer Science, Coursera - Introduction to Logic, Coursera - Linear and Discrete Optimization, Coursera - Probabilistic Graphical Models, Coursera - Game Theory

  • 深入理解算法和数据结构

说明:学习基础的数据类型(stack,queues和bags),排序算法((quicksort, mergesort, heapsort),和数据结构(binary search trees,red-black trees,hash tables),算法复杂度。

在线资源: MIT Introduction to Algorithms, Coursera Introduction to Algorithms Part 1 & Part 2, List of Algorithms, List of Data Structures, Book: The Algorithm Design Manual

  • 深入理解操作系统

在线资源: UC Berkeley Computer Science 162

  • 学习人工智能

斯坦福大学-Introduction to Robotics Natural Language ProcessingMachine Learning

  • 学习如何构建编译器

在线资源:Coursera - Compilers

在线资源:Coursera - Heterogeneous Parallel Programming

推荐之非理论学习

  • 做课程之外的项目

说明:创建并维护自己的网站,建立自己的服务器或者建立一个Robot

在线资源:Apache List of Projects, Google Summer of Code, Google Developer Group

  • 尝试做一个大型系统(代码库)的一小片,阅读并理解已有的代码,查阅文档,Debug

说明:使用Github是个不错的选择,你可以阅读别人的代码或者为别人的项目提供有用的代码。

在线资源: Github , Kiln

  • 和其他程序员合作做一个项目

说明:这将提高你团队协作的能力,并且你能从其他程序员那里学到一些对你有用的东西

  • 练习算法知识和编程技巧

说明: 通过参加编程竞赛如CodeJam或者ACM’s International Collegiate Programming Contest来练习算法知识。

在线资源:CodeJam, ACM ICPC

  • 尝试做助教

说明:在协助教其他学生的某方面知识的过程中,你自己这方面的知识也会得到提高。

  • 软件工程实习经历

说明:记得在实习期开始之前就申请好,在美国,实习期为夏天,5月-9月,而实习申请通常在这之前几个月就开放了。

在线资源:google.com/jobs

]]>
Pycon2014 @Shanghai 2014-11-16T00:00:00+00:00 canonxu http://canonxu.com/2014/11/Pycon2014@Shanghai 时间:2014年11月6日

地点:上海浦东新区博云路2号浦软大厦


学习Python也有一段时间了,大约一个月之前在微博上看到Pycon2014的消息,当时就很激动地报名。幸运的是,今年的Pycon对学生免费,那我更不能错过了。

今年的Pycon在张江的浦软大厦举行,从早上九点到下午六点结束,中间提供午餐和茶歇。

1.Python中的进程,线程,协程,同步,异步,回调

来自七牛云存储的许智翔讲师。这是一位大神,我完全是在听天书。他详细的内容在V2EX上已经有分享,点此链接

回来以后复习了一下廖雪峰老师Python入门讲的相关知识:要实现多任务,我们通常 会设计Master-Worker模式,其中Master负责分配任务,Worker负责执行任务,因此多任务环境下通常是一个Master多个Worker。常见的情况是:多进程实 现Master-Worker(主进程为Master,其他进程为Worke),多线程实现Master-Worker(主进程为Master,其他线程为Worker)。多进程的优点是稳定性好,但是创建进程的代价较大并且OS同时运行的进 程数是有限的且进程间的调度也颇有难度。多线程的优点是比多进程要快那么一点点,但是稳定 性差,一个线程挂掉就有可能导致整个线程挂掉,因为所有的线程共享进程的内存。如Microsoft的的IIS服务器采用多线程模式 ,稳定性不如采用多进程模式 的Apache。一般情况下,I/O密集型我们优先选用多进程,计算密集型我们有限选用多线程。而协 程,又称微线程。

然后,我又从网上看了几篇讲线程进程协程的,有了更加清晰的认识。

  • 进程。操作系统中最核心的概念是进程,分布式系统中最重要的问题是进程间通信。进程是程序执行的一个实例 ,担当分配 系统资源的实体。进程创建必须分配一个完整的独立地址空间,并在进程存活的时候不断进行调整,进程创建的时候会占有一部分 内存,进程结束的时候资源会释放出来,来让其他资源使用。进程切换只发生在内核态,两步:1.切换页全局目录以安装一个新的 地址空间 2.切换内核态堆栈和硬件上下文。
  • 线程。线程是进程的一个执行流,是轻量级的进程,是操作系统能够进行运算调度的最小单位。一个进程中可以执行多个 线程,多个线程共享进程内的资源。所以可以将线程可以看成是共享同一虚拟内存以及其他属性的进程 线程相对于进程的优势在于同一进程下的不同线程之间的数据共享更加容易。Python被诟病最多的大概就是解释器全局锁(GIL) 了,GIL 的存在是为了实现 Python 中对于共享资源访问的互斥。而且是非常霸道的解释器级别的互斥。在 GIL 的机制下,一个线程访问解释器之后,其他的线程就需要等待这个线程释放之后才可以访问。这种处 理方法在单处理器下面并没有什么问题,单处理器的本质是无法并行的。但是再多处理器下面,这种方法会导 致无法利用多核的优势。Python 的线程调度跟操作系统的进程调度类似,都属于抢占式的调度。一个进程执行了一定时间之 后,发出一个信号,操作系统响应这个时钟中断(信号),开始进程调度。而在 Python 中,则通过软件 模拟这种中断,来实现线程调度。

  • 协程。协程是用户态的轻量级的线程。协程与线程的区别在于:一旦创建完线程,你就无法决定他什么时候获得时间片,什么时候让 出时间片了,你把它交给了内核。而协程编写者可以有一是可控的切换时机,二是很小的切换代价。 在 Python 中,使用协程来做并发是对于系统资源消耗最小,可以最大化的做高并发,但是,需要我们自己来 做调度,操作系统不会主动调度任务。

2.为何Python适合初创公司?

来自叶剑烨讲师的分享。叶老师从“Python的简与雅”和“Python完整的生态圈”两方面讲了初创公司使用Python的优势。 事实上,真正在大规模使用Python做开发的大公司并不多,无论是FLAGT还是BAT,大家都是在一些方面用Python,用得 最多的还是Java、C++、PHP等,国内豆瓣和知乎算是使用Python的代表,也仅仅是轻量的公司。这次参加Pycon的一个 叫“七感数据”的公司,是在用Python做大数据处理方面的创业,我觉得还蛮吸引人的。从我接触到关于人工智能(包括 ML,DL,NLP,CV等)来看,Python在这方面算得上是出镜最频繁的语言,成为了人工智能领域的首选,所以将来若是有AI方面的 想法,Python应该是首选。

推荐Github:Awesome Python,里面包含各种Python类库,基本可以胜任绝大多数任务。

3.Django历程分享-10things

这是一个Python架站框架Gjango的分享。Python架站随着Ruby的Rails框架而兴起,以全能型的Gjango和轻量型的 Flask、web.py为代表,优势在于fast development,collaboration,maintainability,code reuse,劣势在于performance,realtime。 有收获总有牺牲,Python能够快速架站,代码简洁但是实时交互能力、响应性能要差一些。我们在学习Django等 Python的时候,应该首先从广度入手,了解HTML,CSS,Javascript,SQL等网站基础知识,然后去了解Django框架,根据需求 深入。

4.Python机器学习实践

来自七感数据分析的胡景超讲师,胡老师讲了机器学习的基本流程,以及使用Python进行ML的各种经验,是我最想听到 的最有收获的分享。

Machine Learning是Algorithm learn from data(包括图像、网络行为数据、生物学上的数据等各方面的数据)。 ML主要解决的问题包括“分类模型”,监督学习,需要训练库,如Andrew NG的识猫,“回归模型”,如房价预测,股票预测等,“聚类问题”,非 监督学习,如人人网上的“你可能认识的人”这个功能,等等。

最常见的ML流程图如下所示。这是一个监督学习,首先我们需要采集样本(raw data),预处理,对样本进行特征提取,设计出ML算法,并 通过这些样本(称之为训练库)不断地训练反馈(feedback)来优化算法,获得一个优质的模型。这个时候,我们就可以把新的需要 判别的数据输入训练好的模型中,我们就能得到好的判别结果。进行以预测阿里市值为例,采用ML的的决策树算法,几行代码就可以搞定。 当然,决策树是比较简单的算法,偏差不小,要想取得好的效果,不妨尝试随机森林(Random forests)算法,import RandomForest ,包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定(树之间是没有关联,当测试数据进入随机森林时,其实就是让每一颗决策树进行分类, 最后取所有决策树中分类结果最多的那类为最终的结果)。初步模型设计好以后,还需要进行模型调优。要想让模型更优质,应该尽可能的 去除无关噪声数据,增加样本(一般进行ML至少50个样本吧)等,这也是一个费劲的步骤。

ML算法选择指南。包括关联性规则算法,推荐系统算法(协同过滤等),神经网络算法(深度学习DL,多层感知器MLP)等。我前段时间看到 大家在分享一本《机器学习实战》的书,据说很好,并且代码使用Python写的,等我有空了应该买过来学习。

Python的ML生态圈。包括Python的优势,从业人员和第三方库,学习方法等。

Python在ML有绝对的优势:

  • 人多库多省事
  • 效率不错(比matlab和R效率高)
  • 产品线很全,数据处理-原型建模-可视化-产品化,用Python都很方便(产品线全这一点很重要!)

ML的从业人员可以分为三类:

  • 科学家:数学研究,建模
  • ML工程师:看Paper学习利用已有算法,解决实际问题
  • 数据工程师:清洗数据(其实ML的大数据处理,大部分时间都是在清洗数据),Python在清洗数据上有优势

ML常用的Python第三方Package:

  • numpy/scipy:最基础,常用
  • scikit-learn
  • pandas: 统计分析
  • cpython: 当非常需要效率时

特别推荐Github上的awesome—machinelearning这个repo,包含了很多ML的库

我们学生,可以先看Coursera上面Andrew的machine learning公开课,练习《机器学习实战》上面的例程。更重要的是, 要尝试自己练手,做出点东西出来。拿到数据后,从数据清理、原型建模到可视化,Python都是可以横行无阻的搞定。

5.Python实现数据处理

来自堆糖网的老轮子,主要分享了他们海量数据(图片)处理框架,map()-shuffle—reduce(),Spark的任务处理和 调度等。我没有怎么听明白。大数据处理框架的相关知识HFDS,Mapreduce,Hadoop,Spark,Scala等值得关注。

主办方各方面都考虑得很周到, 还提供了午餐。张江那一片的科技公司很多,环境也不错。

主办方工作人员很辛苦,感谢他们的付出。希望上海多一点技术分析,希望明年还有机会参加2015Pycon。

这一天很累,一早起床倒地铁,到天黑才回到闵大荒。但这更是愉快的的一天,收获很多,人生苦短,Python是岸,学好Python去摧城拔寨吧!

]]>
开源交大行 2014-11-08T00:00:00+00:00 canonxu http://canonxu.com/2014/11/开源交大行 时间:2014/11/6

地点:上海交通大学信息网络中心七楼


在交大同去网看到消息,刚好最近学习了Git和Github,满怀期待跑去参加,这是我第一次参加有关Opensource的活动。交大在技术交流、技术竞赛这方面活动还满活跃的,主要是由信息网络中心的副主任金耀辉老师负责,而金耀辉老师这学期给我们上《高性能信息网络》课程,屡次在课堂上提到,所以更多了一分关注。

1.Openstake-一个PHD的开源观

张博士分享了他在Openstake方面的理解。Openstake是一个自由软件和开源项目,由一系列软件组件组成,用来完成云平台的管理任务。
Openstake是基础设施即服务(IaaS)资源的通用前端。首先,我们要搞清楚IaaS(基础设施即服务)、PaaS(平台即服务) 、SaaS(软件即服务)这三者的区别。任何一个在互联网上提供其服务的公司都可以叫做云计算公司,但是云计算 也是分层的,基础设施在最下端,平台在中间,软件在顶端,其他‘更软’的服务如网页浏览等在更顶端。

  • IaaS公司会提供场外服务器,存储和网络硬件,我们可以租用而不需要自己购买设备安排场地。一些大的IaaS公司包括 Amazon, Microsoft, VMWare等,但是这些公司一般不仅仅局限在提供IaaS服务,他们还会将计算能力租给用户来Host 网站。
  • PaaS公司在网上提供各种开发和分发应用的解决方案,比如虚拟服务器和操作系统。某些时候PaaS也叫做中间件。用户所有的 开发都可以在这一层进行,节省了时间和资源,也让分散的工作室之间更容易协作开发。一些大的Paas公司包括Google App Engine, Microsoft Azure、Amazing的AWS、Alibaba的阿里云等。
  • SaaS公司在远程服务器上提供应用,用户可以通过网络来运行,大多通过网页浏览器来接入服务。用户通过如Google APP、 Dropbox 等进入服务,尽管这些网页服务是用作商务和娱乐或者两者都有,但这也算是云技术的一部分。

但是,不得不提的是,IaaS和PaaS现在的区别似乎越来越不明显,比如基于Iaas的AWS也提供Plaform服务,没有严格的界限。
Openstake旨在提供软件,帮助服务商和企业内部实现IaaS云端服务的架构和管理。它主要包括Nova(计算)、Swift(对象存储) 、Neutron(网络和地址管理)等若干个模块。

相比于其他的开源云平台项目(如OpenNebula),Openstake迎来了爆发式增长。现时已表示支持OpenStack项目的大型硬件厂商包括:AMD、Intel、HP、Dell、Cisco等。 事实上,这些厂商并没有一个占主导,而是由一个基金会来管理项目,谁想有话语权,就需要砸更多工程师提供更多代码贡献。

在参加本次讲座之前,我也是经常听到云计算和Openstake,没有深入了解,只是以为是传统的IaaS上面的修修补补,剑走偏锋,不是 未来IT技术的主流。但是听了这次分享,联想到最近看到的大量云计算创业公司(如Upyun、Speedycloud等)特别是有消息报道Microsoft 强力推进Azuer的发展力图使Azuer成为windows后的最主要成长方向,使得我不得不再次思考云计算的未来。未来大家 买终端还需要考虑终端有多大的内存多大的存储吗?不需要了,我们的计算和存储可以全部放到云端,一根网线即可使用, 我们只要付费买计算能力和存储就行了,并且这也极大地缓解了大数据给终端带来的压力。过去IBM卖小型机,现在不要买小型机了,既费钱又费地方,直接买云计算能力,很省事。 而促使Google、Amazing等巨头布局更重要的原因,是一旦拥有了领先的云平台就会带来大量的用户,控制住这些用户,可以从中获取更大的增值利益。

2.开源在台湾

来台湾的Richard Lin, Gitcafe市场总监做分享,展示了台湾的积极的开源氛围,以及组织得很好的开源Conference等。

3.通往百万年薪的程序员的征途

来自Leancloud的讲师,讲了他这些年程序员生涯的历程。我们应该从一门语言入手,学好了以后在学习其他语言就轻松很多 ,不妨多掌握几门语言。类C的C/C++/Java等,动态语言Python/Javascript等,Web的PHP,Ruby等。

4.Docker

来自马全一老师的分享。第一次听说Docker这个东西。Docker是一块应用程序执行容器(containers),容器内有执行该程序完善的配置,而不需要虚拟机。 这样的话,开发者可以打包应用以及依赖包到一个可移植的容器(docker)中,然后发布到任何流行的LINUX上。容器是完全使用沙箱机制,相互之间不会有任何接口,几乎 没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包括系统,所以一个程序的Docker下载下来后,不管我们用的我们用的什么 系统配置的什么环境都可以运行。比如我用的Ubuntu系统,下载一个Docker承载的Apple应用,依然可以在我的Ubuntu运行该应用。

5.重整工具箱:从开源软件到开放服务

来自七牛云存储的神级人物,全栈大神。

6.R语言数据分析

来自数学系的师兄,分析了R语言及在数据挖掘、数据分析中的应用。基于R强大的数据处理和可视化能力,我下载了R语言并尝试学习它,但是网上查了一下,这似乎不是一件容易且 划算(产出/投入时间)的事情。知乎有人说,R的大数据处理性能很差,Matlab甚至是优于R的选择,这真是一件遗憾的事情。 我觉得Python在数据处理和可视化是个更好的选择,以后有这方面的兴趣,不妨试一试Python。


真是一场知识的盛宴,各种技术各种思想的交流,这是一件美好的事情。更使得我看清了路子和差距,让我脚踏实地的去learn and practise。

]]>
My first blog 2014-11-07T00:00:00+00:00 canonxu http://canonxu.com/2014/11/My-first-blog It is my first blog. Frankly, i am extremely excited now.

I have spent almost 3 days to establish this blog because i know little about coding, let alone the process of releasing a blog project. Needless to say, i have been through a hard time which may be a great treasure for me Instead.

In a nutshell, word id cheap,show me your code!

]]>