大西洋暖流

一切都在不完美中前行


  • 首页

  • 关于

  • 标签

  • 归档

  • 搜索

使用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?

  • 使用元类

部署Python Flasky项目到Heroku

发表于 2018-03-09 | 分类于 编程 | 阅读次数:
字数统计: 3,383 | 阅读时长 ≈ 16

Heroku Interface

(题图来自Heroku官网截图,注册Heroku需要翻墙)

学习完《FlaskWeb开发:基于Python的Web应用开发实战》(第一版)后,我参照本书及网络上的方法将Flasky项目第一版成功部署到Heroku,这里是README.md说明纪录。部署上线网址:https://mgflask.herokuapp.com

部署项目上线对我来说并不是一件容易的事,Flaskapp项目代码全部来自于flasky-first-edition,不过结合实际业务测试和功能测试,对很多地方进行了修改,部署分为两个部分,Part1是提取正确的git版本,Part2是push代码到Heroku。

阅读全文 »

Flask学习笔记

发表于 2018-02-27 | 分类于 编程 | 阅读次数:
字数统计: 4,590 | 阅读时长 ≈ 18

Flask Logo

学习一门语言,除了熟悉语法知识之外,还需要懂一个框架,这样才具备生产力。Python生态强大在于它有众多各式各样的第三方包,有时光会Python语法解决不了问题,必须结合第三方框架协同来完成任务。

这里是我学习Flask Web开发过程中整理的笔记,我使用的资料是大名鼎鼎的“狗书”第一版和Flask官网手册。学习方法是照着“狗书”里面的内容依葫芦画瓢一步一步地边写边测。书作者Miguel Grinberg的网站上有最新版的内容,想获取第二版或视频教程可以移步观看。

cover of flask web development

这篇博文纪录学习过程中遇到的重点和难点,前后没有相关性,属于看到哪儿写到哪儿那种,大部分是摘抄,有个人思考的部分是“同步发送邮件?异步发送邮件?” 、“数据库多对多关联关系” 、“部署Python Flasky程序到Heroku”这几节。

如果读者朋友发现哪里有写得不对的地方,欢迎指正。

Flask网址重定向问题

1
2
3
4
5
6
7
8
9
10
11
12
13
from flask import Flask
app = Flask(__name__)
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
if __name__ == '__main__':
app.run(debug=True)
阅读全文 »
1…111213…16
大西洋暖流

大西洋暖流

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

粤ICP备2020075576号