理解 unicode,utf-8,ascii,gbk

󰃭 2017-03-06

原创作品:首发u3v3, 转载请保留 地址:https://www.u3v3.com/ar/1276 作者ID:Yi_Zhi_Yu 首发日期:2017.3.7 Python学习群:278529278 (欢迎交流) 前言 虽然我们一直在编程, 但很多时候遇到编码和字符集相关的内容就一脸懵逼, utf-8, gbk, ascii, unicode, 用的时候也是。 今天我们就来撸一撸这个所谓的编码到底是个什么鬼 以下源于个人对字符集合编码相关的理解, 如有错误, 还请指出 背景 我们知道在计算机中, 数据无论什么内容, 最终存储的格式都是二进制的, 但是, 人是不能直接阅读二进制的, 必须将其转换为人类看的懂得字符, 我们才能理解 那计算机是怎么将二进制与人类可读的字符进行转换的呢? 我的答案是: 依照字符集, 按照某种编码规范对二进制进行编码/解码 这里就引入了几个概念 字符集 字符集在我的理解看来, 就相当于一本词典, 这本词典包含了二进制编码和对应的字符之间的映射关系, 比如 ascii 码表中, 1000001(十六进制41或者十进制65)表示字符A, 这个 ascii 码表 就是一个字符集 比如 unicode 字符集中, 100111101100000(十六进制4f60)表示中文字符你, unicode也是一个字符集 编码/解码 按照码表, 按照某种规范对二进制进行字符转换的过程,就是解码,将字符转换为计算机可识别的二进制的过程, 就是编码, 编码规范 二进制存储数据是以字节为单位的, 在数据传输或者其他的转换处理时, 计算机将二进制按照字节进行切分. 而对应几个字节表示什么字符, 这个就没有统一的规范了, 比如单字节表示哪个字符, 或者两个字节表示哪个字符,甚至三字节更多等等, 定义按照某种字符集如何切分的字节并将字节转换字符的规范就是编码规范了 比如将 \c41 转换为A(二进制的65) 的过程就是一个解码的过程,其遵照ascii的编码规范, 而依赖这个规范, 我们又能将 A 编码成计算机可读的 \c41(二进制的65)

Continue reading 


利用Python实现简单HTTP代理验证

󰃭 2017-03-05

原创作品:首发u3v3, 转载请保留 地址:https://www.u3v3.com/ar/1274 作者ID:noomrevils 首发日期:2017.3.5 Python学习群:278529278 (欢迎交流) 前言 需求 相信用python写过爬虫的人都有听说或使用过代理的经历,网络上提供了很多免费的代理,也有很多收费代理提取接口,但是实际在使用这些代理的时候,往往会有速度慢,无法连接,非高匿,插入广告或统计代码等种种问题,本文的初衷就是提供一个验证代理的思路和简版的代码实现,通过定时的任务可以验证代理的有效性,维护一个可用的代理池。 思路 为了实现验证的功能,需要有一个页面能够展示通过代理的请求信息,比如说,ip地址,请求头。 这些信息可以帮助判断代理是否高匿,同时检查这个页面返回html, 可以知道,代理是否向其中添加了额外的信息(广告,统计) 然后在client端,我们通过代理请求这个页面,解析返回的页面内容,完成代理可用性的验证 验证接口&页面实现 处理请求函数 Python的Web框架选用的是Bottle, 简单但能够说明问题。 from bottle import request, route, run, template @route('/') def index(): headers = {} for key in request.headers.keys(): headers[key] = request.headers.get(key) ip = request.environ.get('HTTP_X_FORWARDED_FOR') \ or request.environ.get('REMOTE_ADDR') return template('proxy', headers=headers, ip=ip) run(host='0.0.0.0', port=8000) Bottle中requests.headers是类似字典的class,为了能够在模板中使用请求头信息,把它拿到读取到python字典对象中,作为传入模板的参数,然后通过request.environ,可以拿到真实请求的ip 请求信息页面 <html> <head> <title>proxy</title> <style type="text/css"> body {font-family:arial, sans-serif;} table {border-width: 1px; border-color: black; border-style: solid;} .head {background-color:#6666ff; color:#ffffff;font-size:12pt;} .

Continue reading 


python datetime的使用

󰃭 2017-03-04

原创作品: 首发u3v3, 转载请保留 地址: https://www.u3v3.com/ar/1273 作者ID: Yi_Zhi_Yu 首发日期: 2017.3.4 乱七八糟的datetime 在PHP中, 时间转换非常简单, strtotime 和 date 两个函数就完事了, 但是在python 中,时间相关的包有好几个, 我常用的是datetime. 但这个包我至今还是对datetime 这个包的使用非常疑惑, 每次都要再专门查一下, 今天就来初步撸撸这个包 datetime 模块 datetime 是一个比较大的包, 这个包下面又有几个小模块, 以下分别介绍 datetime.date 模块 这个模块通过名字可以看出, 是对精确到天的日期的处理, 构造一个 date 的对象如下: d = datetime.date(year=2016, month=9, day=3) 这就是一个日期格式的对象 还有是通过获取的方式构造的日期格式 d = datetime.date.today() # 获取当天日期 d = datetime.date.fromtimestamp(1499998880) # 通过 时间戳 获取日期 这里没有直接通过字符串生成日期对象的方式, 也没有日期对象直接转换时间戳的方式 常用属性方法 既然我们已经得到了一个 date 的对象, 我们需要的属性该怎么使用呢, 以下是常用的日期对象属性总结 d.year # 2016 日期所在年份 d.month # 9 日期所在月份 d.

Continue reading 


Python logging 模块实践

󰃭 2017-03-02

原创作品:首发u3v3, 转载请保留 地址:https://www.u3v3.com/ar/1271 作者ID:noomrevils 首发日期:2017.3.2 简介 log的目的 审计, 业务流水, 流程管控 记录异常和错误,方便调试和定位错误 logging vs print 相信大多数人在写代码的时候都有加入很多print语句的习惯,诚然对于简单的脚本,或实现调试阶段, print简单直接。但是对于结构层次复杂,流程冗长的项目来说,print输出缺乏对信息层级的控制,而且难以维护。 logging虽然使用起来相对较重,但是也有对应功能上带来的好处 通过控制logging的层级来过滤重要的信息 定义一致的输出结构,方便解析,抽取信息 指定输出的位置和归档的方式 log的等级 debug: 记录的数据非常详细, 频率很高 (比如算法中时间复杂度的统计) info: 运行状态变化,业务逻辑流程, 比如用户请求,服务器运行状态 warning: 警告值得重视的信息, 比如尝试破解密码等 error: 程序发生异常, 比如IO操作发生失败,数据无法连接 critial: 致命的问题可能导致宕机, 比如内存泄漏,磁盘空间不足 使用场景 基本场景 import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) logger.info('use logger to log') # output INFO:__main__: use logger to log import logging import sys logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) logger.info('use root logger to log') # ouput INFO:root: use root logger to log 上面两个是最简单的场景,但是仔细观察发现其中一些差异: 在第一个代码片段中,通过getLogger函数拿到了一个名字为__name__(__main__)的logger实例。

Continue reading 


Numpy 科学计算库介绍

󰃭 2017-03-02

安装 Numpy pip install numpy 基本概念 NumPy提供了两种基本的对象:ndarray, ufunc ndarray 是存储单一数据类型的多维数组 ufunc 是对数组进行处理的函数 基本使用 创建数组 多维 数组可以每个轴有一个索引。这些索引由一个逗号分割的元组给出 # 通过给array函数传递 Python 序列对象创建数组 # 如果传递的是多层嵌套的序列,将创建多维数组 >>> a = np.array([1,2,3,4,5,6]) >>> b = np.array([7,8,9,10]) >>> c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]]) >>> c.dtype dtype('int64') # 数组元素的个数 >>> c.size 12 # 数组类型可以在创建时显示指定 >>> d = np.array( [ [1,2], [3,4] ], dtype=np.int) # 使用索引访问数据 >>> d[0,0] 1 数组的纬度大小可以通过其shape属性获得 >>> a.

Continue reading 


python 自动生成 sitemap文件

󰃭 2017-03-02

什么是sitemap 很多时候, 我们新建的网站, 希望能被搜索引擎更好,更快的收录, 但搜索引擎并不知道我们网站的结构和内容, 对我们的网站的抓取并不是那么的快速和完善,导致网站的很多部分不能被及时收录 sitemap 就是这么一个东西, 他能引导搜索引擎收录我们网站中的页面链接, 就像sitemap的名字一样, 网站地图, 搜索引擎通过这个地图就能更好的收录网站内容了 那么, 我们如何完整的理解sitemap呢, 大家可以参考 https://www.sitemaps.org/zh_cn/index.html, 其中协议页面的简体中文有可能乱码, 大家可以切换到繁体版本查看 sitemap 的格式 sitemap一般有三种格式:txt,xml和Sitemap索引格式, 比如百度支持的sitemap格式说明文档: http://zhanzhang.baidu.com/college/courseinfo?id=267&page=2#h2_article_title0 我这里也简单说明下 txt格式 这种格式的文件中, 每个url一行, http://www.example.com/repaste/101562698_5230191316.html http://www.example.com/repaste/101586283_5230215075.html http://www.example.com/repaste/101639435_5230310576.html xml格式 这种格式稍微复杂些, 但内容也不多 <?xml version="1.0" encoding="utf-8"?> <!-- XML文件需以utf-8编码--> <urlset> <!--必填标签--> <url> <!--必填标签,这是具体某一个链接的定义入口,每一条数据都要用<url>和</url>包含在里面,这是必须的 --> <loc>http://www.yoursite.com/yoursite.html</loc> <!--必填,URL链接地址,长度不得超过256字节--> <lastmod>2009-12-14</lastmod> <!--可以不提交该标签,用来指定该链接的最后更新时间--> <changefreq>daily</changefreq> <!--可以不提交该标签,用这个标签告诉此链接可能会出现的更新频率 --> <priority>0.8</priority> <!--可以不提交该标签,用来指定此链接相对于其他链接的优先权比值,此值定于0.0-1.0之间--> </url> <url> <loc>http://www.yoursite.com/yoursite2.html</loc> <lastmod>2010-05-01</lastmod> <changefreq>daily</changefreq> <priority>0.8</priority> </url> </urlset> 各个标签对应的注释也说明了标签含义, 这种格式比txt格式表达的内容更丰富了 索引文件格式 这种严格来说只是一个索引多个sitemap文件的xml格式文件, 用于引导搜索引擎去多个sitemap文件中收录url。 一般来说, 只有当网站内容比较多的时候, 才会使用这种格式: 单个sitemap文件中允许包含的url数量是有限的(百度是5万个), 且单个sitemap文件大小也有限制(百度是10M)

Continue reading 


为移动端 Web 构建全屏体验

󰃭 2017-03-01

为移动端 Web 构建全屏体验 原文地址 我们能够很容易地制作具有带入感的全屏体验的网站或者应用程序,正如和 Web 相关的一切事物,我们有好几种途径来实现。 特别是现在越来越多的浏览器支持 “已安装的 Web” 以全屏的方式启动。 1. 将你的 App 全屏显示 有几种方式可以让用户或者开发者可以做到: 通过用户操作来请求浏览器进入全屏模式 安装这个 App 到主屏幕 伪装:隐藏地址栏 1.1 通过用户操作来请求浏览器进入全屏模式 并不是所有浏览器都一样。 iOS Safari 不提供全屏 API,但是 Android 上的 Chrome Firefox,IE11+ 提供。绝大多数 Web 应用会结合使用全屏规范提供的 JS API 和 CSS 选择器。 当你在构建一个全屏应用的时候,主要的关心的 JS API: element.requestFullscreen() (currently prefixed in Chrome, Firefox, and IE) displays the element in fullscreen mode. document.exitFullscreen() (currently prefixed in Chrome, Firefox and IE. Firefox uses cancelFullScreen() instead) cancels fullscreen mode.

Continue reading 


Ansible 学习(PlayBook)

󰃭 2017-02-28

原创作品:首发u3v3, 转载请保留 地址:https://www.u3v3.com/ar/1267 作者ID:noomrevils 首发日期:2017.2.28 引言 上篇文章Ansible 学习(初探) 介绍了Ansible的特性和概念, 并描述了在两台vps构建的一个私有网络上实践了环境搭建,使用一些基本模块。 实际的工作的场景不可能只靠简单条命令来解决复杂的问题,这里就需要引出本篇的主角playbook playbook 是一系列ansible基础命令的组合和拓展,采用yaml语法,不同于ad-hoc命令一次只能执行一个模块, playbook可以将变量配置和任务执行流程灵活的组织起来,从而能够完成一些复杂的部署任务。 playbook的优势 采用yaml描述任务和配置,独立于编程语言,易于学习和维护。 模块化的结构鼓励片段复用,官方提供了Ansible Galaxy,社区的力量促进学习,分享和重用高质量的playbook。 支持jinja2模板语法,指令状态捕获和传递,条件和循环分支,顺序/异步执行方式,这些特征使playbook有着很强的表达能力 PlayBook的组成 下面列出的nginx.yml文件是一个playbook中的一个play,它所完成的流程是在被控节点上安装并启动nginx。一个playbook可以包含多个这样针对不同节点清单的play。接下来简单介绍下组成这个play的元素 - hosts: web vars: - worker_processes: 4 remote_user: deploy become: true become_method: sudo tasks: - name: install nginx yum: name=nginx state=installed update_cache=true - name: update nginx config template: src: /home/deploy/ansible-playbook/nginx.conf dest: /etc/nginx/nginx.conf notify: - reload nginx - name: ensure nginx is running service: name=nginx state=started handlers: - name: reload nginx service: name=nginx state=reloaded 主机和用户 - hosts: web vars: - worker_processes: 4 remote_user: deploy become: true become_method: sudo .

Continue reading 


学习 Python 的利器,IPython shell 功能介绍

󰃭 2017-02-26

安装 IPython 环境 # 安装 ipython pip install ipython # 安装 numpy 科学计算库,例子中有使用 pip install numpy 启动 ipython 可以在 ipython shell 下面写 python 代码,回车执行 # 启动 ipython shell $ ipython (py3env) servadmin@debian:~/test # ipython Python 3.4.2 (default, Oct 8 2014, 10:45:20) Type "copyright", "credits" or "license" for more information. IPython 4.1.2 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system.

Continue reading 


Mac下安装sphinx & 使用Python实现简单查询

󰃭 2017-02-26

场景 在我过去的博客中, 我写过一个sphinx 的安装使用以及配置的系列, 欢迎各位在我的空间中查找。 现在, 我的开发环境切换到了mac上, 使用的系统是mac 下的osx, 需要重新安装环境,所以这里记录下我在mac上安装sphinx的流程以及如何使用Python 连接sphinx 服务实现简单关键字搜索查询 安装 mac 下使用 brew即可完成安装 brew 安装 brew 中已经包含了sphinx, 我们可以直接使用brew执行安装 brew install sphinx --with-mysql --with-re2 执行完成后就安装好了sphinx 注意, 这里我带了两个参数 –with-mysql 和 –with-re2 --with-mysql: 带这个参数是为了让sphinx 能支持mysql协议, 让我们能以mysql的操作方式操作sphinx --with-re2: 带这个参数是为了将sphinx默认的正则引擎改为re2, 性能更高 创建索引和启动服务 这个可以参考我以前写的部分: sphinx 索引的创建(一) https://www.u3v3.com/ar/1079 sphinx 索引的创建(二) https://www.u3v3.com/ar/1080 sphinx 索引服务的启动和测试 https://www.u3v3.com/ar/1091 sphinx 增量索引更新 https://www.u3v3.com/ar/1118 Python处理搜索 这里使用的是python3.4 基于我们已经创建的索引和启动的搜索服务, 我们的应用进程需要连接该服务, 并提供关键词搜索结果 sphinx 提供了对 mysql 协议的支持, 所以,我们在可以通过pymysql 直连 sphinx 的搜索服务 连接搜索服务 在sphinx 索引的创建(二) 中我们可以看到 searhd 的相关配置

Continue reading 


Mac下安装指定Python版本

󰃭 2017-02-26

场景 Mac下自带Python2.7, 但我的项目中要求使用python3.4, 所以需要在我的mac上安装一个这个版本的python, 尝试 我首先尝试了使用brew 直接安装python3, 然后安装完成后, 才发现安装的是python3.6, 查遍了各种资料, 都没有啥简单的安装方式 这里说一下,我的brew 默认的源安装特别慢, 在这里我将源切换到中科大的, 装起来就嗖嗖的了 替换brew.git: cd "$(brew --repo)" git remote set-url origin https://mirrors.ustc.edu.cn/brew.git 替换homebrew-core.git: cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core" git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git 替换Homebrew Bottles源(zsh配置) echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrc source ~/.zshrc 再试 先把brew安装好的python3.6卸载掉 brew remove python3 这次从官网下载对应版本的包, 下载链接: https://www.python.org/ftp/python/3.4.4/python-3.4.4-macosx10.6.pkg 下载完成后, 双击安装即可完成安装 现在, 我们执行版本查看 python3 --version Python 3.4.4 输出的确实是我想要的python3.4 ipython安装 这里我安装的ipython是针对系统默认的py2.7安装的, 使用的是pip的安装的方式 pip install ipython 然而这样安装会报一些权限问题, 即便使用sudo, 也会有权限的问题。 OSError: [Errno 1] Operation not permitted: '/tmp/pip-nR43q7-uninstall/System/Library/Frameworks/Python.

Continue reading 


Mac 系统安装使用virtualbox

󰃭 2017-02-25

Mac 安装Virtualbox 流程 1. 下载virtualbox 在官网 https://www.virtualbox.org/wiki/Downloads 下载mac版本的virtualbox, 这里我下载的版本是最新的5.1.14 版本 2. 安装 双击下载的安装文件, 点击下一步一直到安装结束 virtualbox 就安装好了, 然而我们需要的虚拟系统还没安装, 继续下去 创建虚拟机 点击新建 这里我创建的虚拟系统是win7 分配内存 这里我为虚拟机分配了4G内存, 这个以后还可以调整 创建虚拟硬盘 点击创建, 然后会要求你选择动态还是固定方式创建多大的硬盘, 这里我选择固态方式的30G硬盘, 因为固态方式创建的硬盘运行速度较快 点击床架 到这里, 虚拟机就创建好了, 下面, 我们还要创建这个虚拟机要运行的win7系统 安装系统 启动虚拟机 添加系统镜像文件 在第一次启动虚拟机的时候, 其实会有向导安装, 但我这里并没有在第一次出现向导的时候进行系统安装而关闭了虚拟机, 后续启动的时候就没有向导了, 所以我这里并不是使用向导的安装 选择你下载的系统镜像文件 重启虚拟机, 即可进入系统安装流程 是不是很熟悉的画面, 哈哈 后面的win7系统安装流程我就不再说明了 最后, 其他系统虚拟机的安装流程也可以参考这里, 祝大家顺利安装了

Continue reading 


Ansible 学习(初探)

󰃭 2017-02-23

原创作品:首发u3v3, 转载请保留 地址:https://www.u3v3.com/ar/1260 作者ID:noomrevils 首发日期:2017.2.24 简介 Ansible 是一个基于Python语言开发的配置管理和应用部署工具。相比业界前辈 Chef,Puppet,Saltstack。Ansible轻量,模块化等特点让他具有很强的扩展和二次开发的能力,成为devops领域一颗冉冉升起的新星。 特性 轻量: 默认基于ssh协议,不需要在被控节点上安装任何客户端, 管理节点不以daemons方式来启动和守护,没有额外的数据库配置,直接命令行操作 强大的内置模块, apt/yum, service, cron, 协助完成日常运维场景的工作,并可以定制开发拓展 采用yaml来描述和管理流程,并有基于yaml的playbook来重用和组织任务, playbook有强大的社区支持 框架结构 工作流程 基于上面的动图描述一个使用场景: (使用ansible部署web服务) 前提条件: 管理节点安装ansible,并和被控节点建立基于公钥的ssh信任 主机清单(Invetory) 定义了被控节点的域名,端口,ip等信息 playbook中描述了任务执行的流程和对应操作处理 流程: ansibe查看playbook中定义的参数,渲染playbook模板 读取主机清单, 和对应的被控节点建立ssh连接 按照playbook中定义的流程(安装依赖软件包,git拉取最新代码,更新配置文件,启动web服务) 全部被控节点执行后,返回执行状态报告 安装 官方文档有上有详细针对不同linux发行版本的安装教程 这里只列出在Debian上使用apt-get的安装步骤 将ansible的官方源加入到debian可信源列表中 deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main 执行下面的命令 $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367 $ sudo apt-get update $ sudo apt-get install ansible $ which ansible # 确认安装成功 /usr/bin/ansible $ ansible --version # 查看安装的版本, 和配置文件&模块加载路径 ansible 2.

Continue reading 


celery 开源分布式任务队列使用入门

󰃭 2017-02-23

什么是分布式任务队列 分布式任务队列可以分发任务到多线程,多进程,多机器上执行,例如: 例如数据库中有100万条 tag 数据记录,按照时间排序,要统计每小时重复的 tag 数量, 可以按照每天24小时,分解为24个任务,推入分布式任务队列,由24个 work 进程并行计算 大量的图片资源需要压缩,可以通过分布式任务队列在集群的多台机器上分发调度任务,提高效率 Celery 特点 分布式并发能力,可以运行在单台机器,多台机器机,或者跨数据中心的服务器上 高可用性,在连接出错的时候 worker 和 client 会自动重试,broker 支持高可用(RabbitMP) 速度快,官方公布,单一 celery 进程,每分钟可以处理百万级别的任务 低延迟,使用 RabbitMQ 毫秒级别的延迟 可扩展,Celery 中几乎每一个组件都可以水平扩展,定制性强 架构组成 客户端,提交任务到消息队列 消息队列(消息中间件 broker), 存储/分发任务给工作进程 任务执行单元(worker 进程),执行分派的任务,并返回结果 结果存储,保存在 RabbitMQ,Redis 等存储中 客户端 有多种语言客户端,也有与框架集成方案 node-celery php client 消息队列 RabbitMQ 消息中间件,不同应用程序之间通过消息来集成 Redis 缓存,队列,发生故障时可能会丢失数据(低) 序列化方式 pickle, json, yaml, msgpack zlib, bzip2 compression 安装 以下例子基于 Python3 安装 RabbitMQ, Redis # Centos yum install -y rabbitmq-server yum install -y redis-server # debian, ubuntu apt-get install rabbitmq-server apt-get install redis-server 安装 Celery 用标准的 Python 包管理工具 pip 安装

Continue reading 


Python多版本管理和虚拟环境维护(pyenv, pyenv-virtualenv)

󰃭 2017-02-19

前言 需求 在日常开发的过程中经常会遇到以下场景: 系统预装Python是2.6,项目需要Python2.7中的新特性 由于python的版本割裂, Python3 和 Python2想要共存 不通项目对于同一个依赖包的版本要求不同,希望基于项目的环境独立 virtualenv, virtualenvwrapper等工具解决了上述问题中一的部分,也有着自身局限和不够优雅的地方,例如,将不同的 $PATH 植入不同的shell这种高耦合的工作方式。 本篇的主题pyenv可以帮助你以更pythonic的方式管理多个版本python,创建和维护不同的虚拟环境, 并提供方便的切换方法。 pyenv受启发于ruby环境管理工具rbenv 原理 pyenv在$PATH的最前面插入了一个垫片路径(shims):~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin。所有对 Python 可执行文件的查找都会首先被这个 shims 路径截获,从而架空了后面的系统路径。 安装 安装包依赖(编译python) Debian/Ubuntu apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils macOS brew install openssl readline xz CentOS/Fedora yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel 安装pyenv 1. 获取源文件 安装工具(推荐) macOS brew update && brew install pyenv Linux curl -L https://raw.

Continue reading 


Python编程规范

󰃭 2017-02-19

Python编程规范 1. 行长与换行 为了增强可读性,建议代码每行长度不超过80个字符,import和comment除外; 虽然反斜杠\可以把不同的行内容连接起来,但是仍然不建议使用。实际上,Python中规定圆括号、方括号和花括号可以跨越多个自然行,我们可以利用这个规则规避反斜杠; Expressions in parentheses, square brackets or curly braces can be split over more than one physical line without using backslashes. # Example 1 content = ('I want say something directly.' 'But it is too long!') print (content) def IsTime(year = 1900, month = 1, day = 1, hour = 0, minute = 0, second = 0): if (1900 < year < 2100 and 1 <= month <= 12 and 1 <= day <= 31 and 0 <= hour < 24 and 0 <= minute < 60 and 0 <= second < 60): return 1 2.

Continue reading 


Python 系统模块 sys, os 使用

󰃭 2017-02-19

模块功能 sys 模块包括了Python运行时配置, 进程参数,模块搜索路径,加载的模块列表等,可以与前当程序运行的系统环境交互 os 模块包括程序经常用的操作系统调用,目录、进程、shell环境等 sys 模块 # sys.modules 是一个字典,python程序所导入的每一个模块在其中都有一项 In [19]: sys.modules['os'] Out[19]: <module 'os' from '/data/py3env/lib/python3.4/os.py'> # sys.path 模块搜索路径列表,导入模块的时候,python解释器在列表的每个目录下搜索模块文件 # 可以通过修改这个路径添加查找模块的位置 In [22]: sys.path Out[22]: ['', '/data/py3env/bin', '/data/py3env/lib/python3.4', '/data/py3env/lib/python3.4/plat-x86_64-linux-gnu', '/data/py3env/lib/python3.4/lib-dynload', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/data/py3env/lib/python3.4/site-packages', '/data/py3env/lib/python3.4/site-packages/IPython/extensions', '/home/servadmin/.ipython'] sys.stdin 标准输入, sys.stdout 标准输出, sys.stderr 标准出错 sys.exit 退出进程 sys.argv 程序的命令行参数列表 sys.version python 版本 os 模块 os.environ 环境变量 os.system, os.popen, os.execv, os.spawnv 运行外部程序 os.fork, os.kill 创建子进程,结束进程 os.open, os.read. os.write 更底层的打开,读写文件方法 os.remove, os.rename, os.mkdir, os.

Continue reading 


使用Scrapy构建一个网络爬虫

󰃭 2017-02-19

转自: 思诚之道(http://www.bjhee.com/scrapy.html) 记得n年前项目需要一个灵活的爬虫工具,就组织了一个小团队用Java实现了一个爬虫框架,可以根据目标网站的结构、地址和需要的内容,做简单的配置开发,即可实现特定网站的爬虫功能。因为要考虑到各种特殊情形,开发还耗了不少人力。后来发现了Python下有这个Scrapy工具,瞬间觉得之前做的事情都白费了。对于一个普通的网络爬虫功能,Scrapy完全胜任,并把很多复杂的编程都包装好了。本文会介绍如何Scrapy构建一个简单的网络爬虫。 一个基本的爬虫工具,它应该具备以下几个功能: 通过HTTP(S)请求,下载网页信息 解析网页,抓取需要的内容 保存内容 从现有页面中找到有效链接,从而继续抓取下一个网页 我们来看下Scrapy怎么做到这些功能的。首先准备Scrapy环境,你需要安装Python(本文使用v2.7)和pip,然后用pip来安装lxml和scrapy。个人强烈建议使用virtualenv来安装环境,这样不同的项目之间不会冲突。详细步骤这里就不赘述了。对于Mac用户要注意,当使用pip安装lxml时,会出现类似于的下面错误: Error: #include “xml/xmlversion.h” not found 解决这个问题,你需要先安装Xcode的command line tools,具体的方法是在命令行执行下面的命令即可。 $ xcode-select --install 环境安装好之后,我们来用Scrapy实现一个简单的爬虫,抓取本博客网站的文章标题,地址和摘要。 创建工程 $ scrapy startproject my_crawler 该命令会在当前目录下创建一个名为”my_crawler”的工程,工程的目录结构如下 my_crawler |- my_crawler | |- spiders | | |- __init__.py | |- items.py | |- pipelines.py | |- setting.py |- scrapy.cfg 设置待抓取内容的字段,本例中就是文章的标题,地址和摘要 修改”items.py”文件,在”MyCrawlerItem”类中加上如下代码: # -*- coding: utf-8 -*- import scrapy class MyCrawlerItem(scrapy.Item): title = scrapy.Field() # 文章标题 url = scrapy.Field() # 文章地址 summary = scrapy.

Continue reading 