大西洋暖流

一切都在不完美中前行


  • 首页

  • 关于

  • 标签

  • 归档

  • 搜索

Redis初体验

发表于 2018-03-27 | 分类于 编程 | 阅读次数:
字数统计: 789 | 阅读时长 ≈ 4

前两天整理使用Python爬虫下载电子书一文时,提过要给爬虫程序增加缓存处理。后面花了2天时间把Redis用法摸熟,然后在Mac上配置好了Redis环境。搭好环境后,发现那个爬虫程序其实非常简单,使出Redis有点大材小用,于是把Redis用在缓存股票数据上面,结果效果非常好。

关于Redis的缓存处理,我参考了陈皓老师缓存更新的套路文中提到的“Cache Aside Pattern”模式,来进行缓存设计,下面直接引用他博客里面的内容,非常受启发。

  • 失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
  • 命中:应用程序从cache中取数据,取到后返回。
  • 更新:先把数据存到数据库中,成功后,再让缓存失效。

Fetch data from Redis

Update data in db

阅读全文 »

清除GitHub提交历史记录

发表于 2018-03-23 | 分类于 编程 | 阅读次数:
字数统计: 636 | 阅读时长 ≈ 3

clean air

(Photo by Alex Vasey on Unsplash)

昨天提交代码到GitHub仓库时,不小心把敏感信息(登陆账号和登陆密码)提交了上去。发现后立马在GitHub上修改源代码,将里面的敏感信息删除,删除后查看这个文件的历史操作记录,包含敏感信息的历史版本仍然存在。

以为删除文件可以解决这个问题,然而并非如此,把整个文件删除后,历史记录并没有被清空,反而增多一条删除文件的操作,前面两步操作的记录仍然存在。

网上搜了一大圈解决办法,最终找到的解决办法如下。

阅读全文 »

使用Python爬虫下载电子书

发表于 2018-03-21 | 分类于 编程 | 阅读次数:
字数统计: 2,329 | 阅读时长 ≈ 11

spider(Photo by Aaron Burden on Unsplash)

这两天将半年前写的爬虫代码重构了一下,本来以为要不了多久,结果前前后后花了我将近4个小时的时间。

无力吐槽!:sob:

半年前的代码是一个面向过程的处理,几个函数顺序执行,最终慢悠悠地把PDF生成出来,功能都齐全,但是可读性和拓展性极差。现在全部改为面向对象处理,将requests.Session操作剥离出来作为Crawler类,将解析网页的操作剥离出来作为Parse类,结构清楚了很多,耦合度(较之前)大大降低,基本达到我的要求。

整体功能实现后,我写了一个cache函数,将Session操作缓存起来方便后续复用,本地调试成功,但最终没有采用。我的设想是在一定期限内将Session操作常驻内存,每次执行前检查缓存中有没有,有的话就直接用,没有才新建。但我这个cache函数在程序执行完后,缓存的内容直接被释放,每次执行都需要新建Session连接。这几天在学习Redis,估计我想要的效果得用redis才能实现。

在将网页生成HTML文件到本地后,使用pdfkit工具将HTML文件转换为PDF很耗费时间,这一点请大家注意。

环境准备

macOS 10.11.6 + Anaconda Navigator 1.7.0+ Python 2.7.12 + Sublime 3.0

技术要点

  • Requests会话处理
  • BeautifulSoup网页解析
  • pdfkit工具(注意,一定要先安装wkhtmltopdf这个工具包)
  • decorator装饰器
阅读全文 »

Python数据分析之泰坦尼克沉船统计

发表于 2018-03-15 | 分类于 编程 | 阅读次数:
字数统计: 304 | 阅读时长 ≈ 1

Ship

(Photo by Anthony Metcalfe on Unsplash)

前段时间看到jmportilla这篇Kaggle Titanic Challenge文章时,我把它实现了出来。

目前处于学习阶段,只能通过大量动手实践,才能提升水平,免不了模仿别人。看着人家做出来的东西感觉很轻松,自己亲自动手做一遍才知道其实不容易。原文中注释都使用英文来写,很多地方不大好理解,本文添加了很多翻译,可能更容易理解一些。亲自动手做一遍,能够体会到Python数据分析的乐趣,也是促使你继续学习下去的动力。

数据准备

需要到Kaggle官网下载泰坦尼克沉船数据。(需翻墙)

环境准备

macOS 10.11.6 + Anaconda Navigator 1.2.1 + Python 2.7.12
主要用到的是Python数据分析那一套包,只要安装Anaconda,那些包就自动全部包括在内。其次是安装Seaborn进行图形输出处理。

执行结果

用Anaconda里面Jupyter Notebook一步步写完整个过程后,将得到的Titanic.ipynb文件使用Jupyter NBViewer进行转换,得到泰坦尼克沉船数据这个链接,观看更加直观。

Python元类的一个疑惑

发表于 2018-03-14 | 分类于 编程 | 阅读次数:
字数统计: 567 | 阅读时长 ≈ 2

Magic place

(Photo by Cosmic Timetraveler on Unsplash)

Python高级语法里面的元类,之前一直没有看懂,今天重新看讲解元类的文章。这篇深刻理解Python中的元类(metaclass)翻译Stack Overflow上面大神e-satis对元类的讲解,讲解得十分清楚,看完后我对元类的理解豁然开朗。

下面是结合代码(基于Python 2.7环境)进行实操。

1
2
3
4
5
6
7
8
9
10
11
12
13
class SayMetaClass(type):
'''
元类作用主要是创建类时动态修改类的属性,这里我们在SayMetaClass里重写__new__函数,当创建这个类的
实例时候,会将"say_XXX"这种形式的属性定义为方法
'''
def __new__(cls, name, bases, attrs):
attrs['say_' + name] = lambda self,value,saying=name: (saying+','+value+'!')
return type.__new__(cls, name, bases, attrs)
class Hello(object):
# 指示使用SayMetaClass来定制类,有了这一句后元类魔法就会生效
__metaclass__ = SayMetaClass
pass

编译后,查看Hello这个类的__dict__属性,可以看到有say_Hello方法,它是一个function,解释器幕后创建完Hello类之后,就生成了say_Hello方法。

1
2
3
4
5
6
7
8
In [74]: Hello.__dict__
Out[74]:
dict_proxy({'__dict__': <attribute '__dict__' of 'Hello' objects>,
'__doc__': None,
'__metaclass__': __main__.SayMetaClass,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'Hello' objects>,
'say_Hello': <function __main__.<lambda>>})

接下来,我们new一个实例对象hello,然后调用say_Hello方法(注意:一定要是say_Hello,使用say_hello或别的格式都会报错,因为和SayMetaClass里面__new__函数定义的格式不匹配),传入参数’jackson’,成功打印预期结果。

1
2
3
In [64]: hello = Hello()
In [65]: hello.say_Hello('jackson')
Out[65]: 'Hello,jackson!'

既然这样,我使用type元类来新建一个Bye类,创建实例bye,然后执行bye.say_Bye(‘andrew’)方法应该也是可以成功的。查看Bye.__dict__,结果发现Bye类没有这个say_Bye这个方法。

1
2
3
4
5
6
7
8
9
10
11
12
In [76]: Bye = type('Bye',(object,),{'__metaclass__':SayMetaClass})
In [77]: print Bye
<class '__main__.Bye'>
In [78]: Bye.__dict__
Out[78]:
dict_proxy({'__dict__': <attribute '__dict__' of 'Bye' objects>,
'__doc__': None,
'__metaclass__': __main__.SayMetaClass,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'Bye' objects>})

我们new一个实例对象bye,调用say_Bye方法,提示没有这个属性。

1
2
3
4
5
6
7
8
9
In [79]: bye = Bye()
In [80]: bye.say_Bye('andrew')
Traceback (most recent call last):
File "<ipython-input-80-07a0df2d8098>", line 1, in <module>
bye.say_Bye('andrew')
AttributeError: 'Bye' object has no attribute 'say_Bye'

我没想明白这里面的原因。谁知道答案?请指点一下。

参考资料:

  • 深刻理解Python中的元类(metaclass)

  • What are metaclasses in Python?

  • 使用元类

1…101112…15
大西洋暖流

大西洋暖流

74 日志
7 分类
150 标签
常用链接
  • 廖雪峰
  • 阮一峰
  • 王垠
  • 酷壳
  • Python之禅
  • Python入坑指南
  • Echo李金
  • Flask资源
  • Python面试题
  • HelloGitHub
© 2016 — 2021 大西洋暖流 | Site words total count: 97.2k

粤公网安备 44030602003362号