Pegasus' Blog
保持一颗好奇心

python web入门一年(附python web入坑指南)

Invest regularly in your knowledge portfolio. Make learning a habit.

从大四实习到现在,做python web相关的东西也一年左右了,从一个毫无web基础的菜鸟成为一个仅仅算是入门的python工程师。上周拿到了木瓜移动的offer,入职之前写一下自己的经历帮助希望想要入门python web的同学吧,同时也希望国内的python圈可以发展更好,有更多喜欢python的同学能加入到python程序员的世界里。


###why python?
都说牛逼的程序员是不能按照语言来分的,但是没办法,作为菜鸟的我有语言洁癖。自从我在大三暑假实习(做C++测试)的时候接触了python,就再也不想写别的语言了。写c++再写python,让我感觉就像学了汇编之后再学c,估计用了c之后再也不想写汇编了。于是买了一本《python核心编程》我的python学习之路就开始了。

python用requests+tor搭建轮换ip爬虫

一般防爬虫有很多办法,最基本的是判断header是不是浏览器,比如python有个robot-detection库可以判断,不过这个太好模拟了,没有用。然后可以通过分析日志限定用户ip一定时间段内访问次数,或者通过cookie、session限定特定用户的访问次数等。理论上说,凡可以看到的内容都是可以通过技术手段爬到的,只是难易的差别。
下面记录一下在ubuntu server上用tor搭建一个轮换IP的代理,如果爬虫一定时间段内没有得到内容,就可以换一个IP了。你可以先参考最后的几个链接大致了解下。系统用的vultr日本机房ubuntu server14.04。这是一种不用花钱的解决方案,也可以直接购买一些提供IP代理的服务,不需要自己折腾了。(注意:国内的服务器提供商使用的ISP可能限制了tor,如果你按照下边方法发现总是ttl超时,看下tor的log。推荐用国外的服务器跑爬虫)

python缓存模块的一些用法

Caches are bugs waiting to happen.- Rob Pike.

最近接触了几个关于python缓存模块的一些用法,记录一下。


###python3.2的@functools.lru_cache
functools 模块在python3.2以后新加入了这个装饰器,用来缓存一些耗时的IO请求结果或者周期调用的函数结果,如果缓存数据超出maxsize的值,就是用LRU(最近最少使用算法)清除一些缓存结果。
官方文档给出了几个示例:

tornado写博客碰到的一些问题

最近还是打算继续写个博客练手,不过为了增加一些难度,需要自己实现登录、注册、权限管理、后台管理等功能。tornado不像django那样什么都给了, 也不像flask那样丰富的插件支持,不过也有一些github项目可以作为参考。慢慢记录一下实现过程中碰到的一些小问题。博客采用tornado、mongodb(motorengine) redis(session模块)等实现,参考了http://codingpy.com 的代码,这个网站叫做编程派,用flask写的,我看源码里头用到了一些flask插件,不得不说 flask这种插件扩展真滴很强大,很方便。

Understanding The Python GIL

虽然面试被拒,不过每次与牛人的交流都是一次很好地学习。我发现很多东西还是模棱两可,要不就是知其然,不知其所以然。写代码的时候很多东西都是临时上网查查,然后拿来用,慢慢就成了api工程师,还是没法成为真正的程序员。
比如GIL这个东西,从来没有深究过,只是知道cpython的实现有个GIL,只知道python解释器为每个执行的线程上锁,导致每次只能够执行一个线程。但是为什么需要GIL?( This lock is necessary mainly because CPython’s memory management is not thread-safe.)
线程切换发生了什么?为什么python不移除这个软肋?这些从来没有仔细想过。网上搜集了一些资源,分享一下吧:

python用装饰器实现多线程

###Tomorrow.py
无意中发现github上这么个库tomorrow.py, Magic decorator syntax for asynchronous code in Python 2.7,使用装饰器就可以实现多线程,看起来很神奇。示例如下:

获取拉勾指定地区职位的小脚本

最近公司没啥事了,想跳槽了,不过处境比较尴尬,刚出来混几个月,技术又很一般,有点难找。
感觉拉勾网在互联网行业招聘方面做的不错,不过目测地区招聘没有具体筛选到哪个区域,比如只有北京市的,却没法精确到海淀区的。还是想在学校附近找个工作吧,就写了个脚本筛出来所有在海淀区的python岗位,思路比较简单,查询请求,然后遍历列表页面拿到所有的职位id号,再 请求所有这些id的职位页面,每个页面可以得到位置信息,抠出来地理位置符合要求就输出这个url。

还是先上以前写过的一个异步小爬虫,网页多的时候速度比较快。async_spider.py

Python如何用协程模拟线程,tornado爬虫示例

Python如何用协程模拟线程
之前贴过一个tornado改写的爬虫示例脚本之家全站文章爬虫,可能有些python初学者看得有点头晕。其实笔者学python也不久,协程一直没太能理解,从tornado示例改写成这个爬虫类的时候碰到了很多问题,最不能理解的就是为什么那个异步爬虫可以模拟出并发来。这次又重新回顾了一下,加深了理解。下边就解释一下。之所以使用异步爬虫而不是多线程爬虫,是因为线程开销比较大,开多了线程会导致切换变慢,而且一般线程占用资源也比较多,虽然多线程处理IO密集型任务还是可以提升很多效率的,但是处理网络请求的时候还是倾向于用异步机制。

搞了一个python内容聚合小站点"Python之家"

最近不忙,就搞了一个python的学习站点,包括文章、文档、书籍、新闻等资料。名字叫做python之家,域名是http://pyhome.org/,欢迎来访。博客系统直接使用的nodejs开发的ghost,文章书籍等来自网络和订阅号收集,还有自己写的一些文章。欢迎对python感兴趣的程序员一起维护和协作,您也可以直接投稿,文章均使用协议署名-非商业性使用-相同方式共享 3.0 中国大陆 (CC BY-NC-SA 3.0 CN)发布。

用python写一个命令行有道词典

平常都是用终端敲, 有时候不会的词语也懒得打开词典了,干脆搞了个简单的查词命令.思路也很简单,直接调用有道的api,解析下返回的json就ok了。只用到了python原生的库,支持python2和python3.