上一次推文写了JupyterLab:程序员的笔记本神器,介绍的是如何在web端打造一个便捷的开发环境,发出后反响还不错 因此我决定再写几篇能提升程序员工作以及学习效率的文章,如果能形成一个系列那是最好~如果你有自己的效率工具以及方案,欢迎留言讨论 什么是oh-my-zsh 诸位大佬都知道,Linux下shell默认是bash,但还有一种shell,叫做zsh它比bash更加强大,功能也更加完善,zsh虽说功能强大,但是配置比较复杂导致流行度不是很高 但是好东西终究是好东西,开源界的大佬们是不会让明珠蒙尘,我等伸手党也是可以直接搭顺风车的,感谢robbyrussell大佬的开源项目 oh-my-zsh 吧,从此使用zsh也就几行命令的事情 oh-my-zsh项目目前有80k+star,贡献者超过1300,并且提供了200多个可选插件(rails,git,OSX,hub,capistrano,brew,ant,php,python等),以及超过140个主题供你选择,安装后你将享受以下特性: 首先兼容bash 自动cd:只需输入目录的名称即可 命令选项补齐,比如输入git,然后按Tab,即可显示出git都有哪些命令 目录一次性补全:比如输入Doc/doc按Tab键会自动变成Documents/document/ 插件和主题支持(插件能进一步提升效率) 安装oh-my-zsh 在安装oh-my-zsh之前,首先需要安装好zsh: yum install -y zsh 切换shell为zsh: chsh -s /bin/zsh 重启终端: # 查看当前shell echo $SHELL 输出/bin/zsh表示成功 oh-my-zsh的安装非常简单,参考官网,执行如下命令即可: # curl sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" # wegt sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)" 输出如下表示成功: 配置oh-my-zsh 和bash不同,zsh的配置文件是~/.zshrc,实际上oh-my-zsh的默认配置也够我们使用了,但是这样其真正的强大之处并不能得到很好的体现,因此我们可以继续看看对应的插件和主题功能 关于主题 oh-my-zsh的主题非常丰富,可以用如下命令查看已有主题: ls .oh-my-zsh/themes 个人比较喜欢简单的,因此用了wedisagree主题,进入.zshrc配置文件进行修改 vim ~/.zshrc 将第11行改为ZSH_THEME="wedisagree",然后:wq保存退出,主题就自动生效 关于插件 oh-my-zsh的插件生态非常丰富,下面列出来的是我个人比较常用的插件,如果你有兴趣,可以取发掘能提高自身效率的插件~ 注意:如果操作过程中出现_arguments:448: _vim_files: function definition file not found错误,请执行:rm -f ~/.

JupyterLab对于Jupyter Notebook有着完全的支持 JupyterLab是一个交互式的开发环境,是jupyter notebook的下一代产品,集成了更多的功能,等其正式版发布,相信那时就是jupyter notebook被取代的时候 通过使用JupyterLab,能够以灵活,集成和可扩展的方式处理文档和活动: 可以开启终端,用于交互式运行代码,完全支持丰富的输出 支持Markdown,Python,R,LaTeX等任何文本文件 增强notebook功能 更多插件支持 如果你在日常生活中,有以下需求,我觉得你可以安装一个JupyterLab 随时随地希望试验一些代码片段 多语言、多文档支持 有记笔记需求(文本+代码) 安装 接下来,我将以Python为默认语言来搭建JupyterLab,首先确认你安装好了Python基本环境: # 一行命令搞定 pip install jupyterlab # 安装ipython pip install ipython 如果在服务器使用的话,个人建议还是设置一下密码,配置过程如下: # 进入ipython交互环境 ipython 生成密码: from notebook.auth import passwd passwd() # 输入你自己设置登录JupyterLab界面的密码 然后会有一串输出,记得复制下来,等会配置需要使用 修改JupyterLab 配置文件: jupyter lab --generate-config 修改以下配置: c.NotebookApp.allow_root = True c.NotebookApp.open_browser = False c.NotebookApp.password = '刚才复制的一串数字粘贴到这里' 为了后续能够方便地安装插件,请先安装好node环境,假设你安装好,接下来演示一下怎么安装插件: # 以安装一个生成目录的插件为例 jupyter labextension install @jupyterlab/toc # 查看安装的插件 jupyter labextension list 安装完毕后,打开JupyterLab:

这篇文章的题目有点大,但这并不是说我自觉对Python爬虫这块有多大见解,我只不过是想将自己的一些经验付诸于笔,对于如何写一个爬虫框架,我想一步一步地结合具体代码来讲述如何从零开始编写一个自己的爬虫框架 2018年到如今,我花精力比较多的一个开源项目算是Ruia了,这是一个基于Python3.6+的异步爬虫框架,当时也获得一些推荐,比如Github Trending Python语言榜单第二,目前Ruia还在开发中,Star数目不过700+,如果各位有兴趣,欢迎一起开发,来波star我也不会拒绝哈~ 什么是爬虫框架 说这个之前,得先说说什么是框架: 是实现业界标准的组件规范:比如众所周知的MVC开发规范 提供规范所要求之基础功能的软件产品:比如Django框架就是MVC的开发框架,但它还提供了其他基础功能帮助我们快速开发,比如中间件、认证系统等 框架的关注点在于规范二字,好,我们要写的Python爬虫框架规范是什么? 很简单,爬虫框架就是对爬虫流程规范的实现,不清楚的朋友可以看上一篇文章谈谈对Python爬虫的理解,下面总结一下爬虫流程: 请求&响应 解析 持久化 这三个流程有没有可能以一种优雅的形式串联起来,Ruia目前是这样实现的,请看代码示例: 可以看到,Item & Field类结合一起实现了字段的解析提取,Spider类结合Request * Response类实现了对爬虫程序整体的控制,从而可以如同流水线一般编写爬虫,最后返回的item可以根据使用者自身的需求进行持久化,这几行代码,我们就实现了获取目标网页请求、字段解析提取、持久化这三个流程 实现了基本流程规范之后,我们继而就可以考虑一些基础功能,让使用者编写爬虫可以更加轻松,比如:中间件(Ruia里面的Middleware)、提供一些hook让用户编写爬虫更方便(比如ruia-motor) 这些想明白之后,接下来就可以愉快地编写自己心目中的爬虫框架了 如何踏出第一步 首先,我对Ruia爬虫框架的定位很清楚,基于asyncio & aiohttp的一个轻量的、异步爬虫框架,怎么实现呢,我觉得以下几点需要遵守: 轻量级,专注于抓取、解析和良好的API接口 插件化,各个模块耦合程度尽量低,目的是容易编写自定义插件 速度,异步无阻塞框架,需要对速度有一定追求 什么是爬虫框架如今我们已经很清楚了,现在急需要做的就是将流程规范利用Python语言实现出来,怎么实现,分为哪几个模块,可以看如下图示: 同时让我们结合上面一节的Ruia代码来从业务逻辑角度看看这几个模块到底是什么意思: Request:请求 Response:响应 Item & Field:解析提取 Spider:爬虫程序的控制中心,将请求、响应、解析、存储结合起来 这四个部分我们可以简单地使用五个类来实现,在开始讲解之前,请先克隆Ruia框架到本地: # 请确保本地Python环境是3.6+ git clone https://github.com/howie6879/ruia.git # 安装pipenv pip install pipenv # 安装依赖包 pipenv install --dev 然后用PyCharm打开Ruia项目: 选择刚刚pipenv配置好的python解释器: 此时可以完整地看到项目代码: 好,环境以及源码准备完毕,接下来将结合代码讲述一个爬虫框架的编写流程 Request & Response

爬虫也可以称为Python爬虫 不知从何时起,Python这门语言和爬虫就像一对恋人,二者如胶似漆 ,形影不离,你中有我、我中有你,一提起爬虫,就会想到Python,一说起Python,就会想到人工智能……和爬虫 所以,一般说爬虫的时候,大部分程序员潜意识里都会联想为Python爬虫,为什么会这样,我觉得有两个原因: Python生态极其丰富,诸如Request、Beautiful Soup、Scrapy、PySpider等第三方库实在强大 Python语法简洁易上手,分分钟就能写出一个爬虫(有人吐槽Python慢,但是爬虫的瓶颈和语言关系不大) 任何一个学习Python的程序员,应该都或多或少地见过甚至研究过爬虫,我当时写Python的目的就非常纯粹——为了写爬虫。所以本文的目的很简单,就是说说我个人对Python爬虫的理解与实践,作为一名程序员,我觉得了解一下爬虫的相关知识对你只有好处,所以读完这篇文章后,如果能对你有帮助,那便再好不过 什么是爬虫 爬虫是一个程序,这个程序的目的就是为了抓取万维网信息资源,比如你日常使用的谷歌等搜索引擎,搜索结果就全都依赖爬虫来定时获取 看上述搜索结果,除了wiki相关介绍外,爬虫有关的搜索结果全都带上了Python,前人说Python爬虫,现在看来果然诚不欺我~ 爬虫的目标对象也很丰富,不论是文字、图片、视频,任何结构化非结构化的数据爬虫都可以爬取,爬虫经过发展,也衍生出了各种爬虫类型: 通用网络爬虫:爬取对象从一些种子 URL 扩充到整个 Web,搜索引擎干的就是这些事 垂直网络爬虫:针对特定领域主题进行爬取,比如专门爬取小说目录以及章节的垂直爬虫 增量网络爬虫:对已经抓取的网页进行实时更新 深层网络爬虫:爬取一些需要用户提交关键词才能获得的 Web 页面 不想说这些大方向的概念,让我们以一个获取网页内容为例,从爬虫技术本身出发,来说说网页爬虫,步骤如下: 模拟请求网页资源 从HTML提取目标元素 数据持久化 什么是爬虫,这就是爬虫: """让我们根据上面说的步骤来完成一个简单的爬虫程序""" import requests from bs4 import BeautifulSoup target_url = 'http://www.baidu.com/s?wd=爬虫' # 第一步 发起一个GET请求 res = requests.get(target_url) # 第二步 提取HTML并解析想获取的数据 比如获取 title soup = BeautifulSoup(res.text, "lxml") # 输出 soup.title.text title = soup.title.text # 第三步 持久化 比如保存到本地 with open('title.

要想入门以及往下理解深度学习,其中一些概念可能是无法避免地需要你理解一番,比如,备份地址: 什么是感知器 什么是神经网络 张量以及运算 微分 梯度下降 带着问题出发 在开始之前希望你有一点机器学习方面的知识,解决问题的前提是提出问题,我们提出这样一个问题,对MNIST数据集进行分析,然后在解决问题的过程中一步一步地来捋清楚其中涉及到的概念 MNIST数据集是一份手写字训练集,出自MNIST,相信你对它不会陌生,它是机器学习领域的一个经典数据集,感觉任意一个教程都拿它来说事,不过这也侧面证明了这个数据集的经典,这里简单介绍一下: 拥有60,000个示例的训练集,以及10,000个示例的测试集 图片都由一个28 ×28 的矩阵表示,每张图片都由一个784 维的向量表示 图片分为10类, 分别对应从0~9,共10个阿拉伯数字 压缩包内容如下: train-images-idx3-ubyte.gz: training set images (9912422 bytes) train-labels-idx1-ubyte.gz: training set labels (28881 bytes) t10k-images-idx3-ubyte.gz: test set images (1648877 bytes) t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes) 上图: 图片生成代码如下: %matplotlib inline import matplotlib import matplotlib.pyplot as plt import numpy as np from keras.datasets import mnist (train_images, train_labels), (test_images, test_labels) = mnist.

原文地址:How to Write Beautiful Python Code With PEP 8 作者:Jasmine Finer 翻译:howie6879 PEP 8有时候读作PEP8或者PEP-8,是一份提供如何编写Python代码指南和最佳实践的文档,由Guido van Rossum, Barry Warsaw, Nick Coghlan在2001年完成。PEP 8主要注重于提高 Python 代码的可读性和一致性。 PEP全称为:Python Enhancement Proposal,一个PEP是一份文档,它描述了为Python提出的新特性以及为社区编写的Python方面的文档,比如设计和风格。 本教程概述了PEP 8中列出的关键指南,它的目标读者是初级到中级程序员,因此我没有涉及一些最高级的主题。不过你可以通过阅读完整的PEP 8 — Style Guide for Python Code | Python.org文档来学习高级主题。 在本教程结束时,你将能够: 编写遵从PEP 8规范的代码 理解PEP 8中列出的指导原则背后的原因 设置你的开发环境,以便开始编写符合PEP 8标准的Python代码 Why We Need PEP 8 可读性很重要 PEP 8规范存在的目的在于提高Python代码的可读性,但为什么可读性如此重要?为什么编写具有可读性的代码是Python语言的指导原则之一? 正如Guido van Rossum所说:”代码阅读的频率远远高于编写的频率“。你可能花费几分钟或一整天时间编写一段代码来处理用户身份验证,一旦你写完它,你就再也不会重写一次,但是你肯定会再读一次,这段代码可能仍然是你正在进行的项目的一部分。每次你回到那个代码文件,你必须要记住那部分代码是做什么的以及你为什么要写它,所以可读性很重要。 如果你是Python新手,在你编写代码之后的几天或几周内还要你记住代码片段的含义可能有点困难。如果你遵循PEP 8标准,你可以很确定你对你的变量命名得很好,你会知道你添加了足够的空格,因此更容易遵循代码中的逻辑步骤,你还可以对你的代码进行很好的注释,所有的这些都意味着你的代码具有更高的可读性,也更容易再次阅读。作为初学者,遵循PEP 8的规则可以使学习Python成为更愉快的任务。 如果你正在找工作,那么遵循PEP 8标准尤为重要,编写清晰可读性高的代码更会突出你的专业性,这将会侧面告诉你的老板,你了解怎么很好地构建你的代码。 如果你拥有很多编写Python代码的经验,然后你可能需要和其他人协作开发,编写可读性高的代码在这里至关重要,其他人可能此前从未看过你这样风格的代码,他必须重新阅读且理解你的代码风格,如果拥有你遵循和认可的指南将使其他人更容易阅读你的代码。 Naming Conventions 明了胜于晦涩