几个Python编程小技巧
本文,猴哥分享几个 Python 编程的小技巧。
1.编码问题我们在爬取网站是,会经常抓取网页文本,但是打印文本会出现是一堆乱码。
这是为什么呢?原因是 Python 中字符对象分为两种,一种是 Unicode 对象,另一种是 str 对象。
字符在 Python 中又以 Unicode 对象为基础,所以我们定义的字符串在内存中以 Unicode 编码的形式存储。
另外,str 对象又可以有多种编码形式,如 UTF-8、GBK-2312 等。虽然不同编码的 str 对象能被解码成 unicode 对象,但是不同编码的 str 对象直接不能直接转换。
因此,如果字符串编码是 GB2312,将其存储到 list 中,再打印出来看到乱码是 Unicode 编码。
解决这个问题其实很简单,Unicode 作为中间编码。我们只要将一种字符编码(如 GB2312)的字符串解码为 Unicode 编码,再编码为另外一种字符编码(如 UTF-8)。
1234# 数据库以 UTF-8 形式保存字符串,而获取到的字符串是 GB2312str = getFromNetWork() # 获取网络字 ...
Python 中各种时间类型的转换
我们编码过程中经常需要获取当前时间。当然, 这也离不开对时间类型进行转换运算。
本文主要讲解 Python 各种时间类型之间的转换。
1.处理时间的库Python 标准库中有两个处理时间的库。其中一个名为 datetime,另一个是time。
在 Python 官网文档中,datetime 是被定义为数据类型(Data Types)。
由此可见,datetime 是主要提供处理日期和时间的数据类型的模块。
它其中有几个常用的类型,例如:datetime.datetime、datetime.time、datetime.date 等,其中最主要的类是datetime.datetime。
因为它携带了 datetime.time 和 datetime.date 这两个所带的信息,能够比较齐全地输出,即能一次性就输出年、月、日、时、分、秒等日期和时间信息。
time 模块是归属于通用操作系统服务(Generic Operating System Services)类目中。time 模块主要提供各种时间转换的函数。
它服务于系统层次,Python 又是跨平台的,所以有些 API 只能在某些操 ...
pustil-获取系统信息库
运维工程师经常使用 Python 编写脚本程序来做监控系统运行的状态。
如果自己手动使用 Python 的标准库执行系统命令来获取信息,会显得非常麻烦。既要兼容不同操作系统,又要自己处理解析信息。
为了解决的痛点问题,psutil 就横空出世。
它的出现无疑是运维工程师的福音。
运维小伙伴通过它执行一两行代码即可实现系统监控。
1.简介psutil全称是process and system utilities。
psutil 是一个跨平台的应用于系统监控、分析、以及对系统进程进行一定管理的 Python 第三方库。
它不仅能够轻松获取系统中正常运行的进程和系统利用率(例如 CPU、内存、磁盘、网络等)信息,还实现了跟 UNIX 系统命令行工具类似的功能。
可以说是运维工作的“必备品”。
它功能强大,操作简单。这也促使很多开源项目都集成它到自己项目中,不妨有谷歌的 GRR 项目、脸书的 osquery 项目等。
github 地址
2.安装安装 psutil 是有多种办法:通过 pip 安装,通过源码方式安装,通过下载 tar 压缩包来安装。其中通过 pip 的方式是最简单的。
1 ...
回顾 2017,展望 2018
望着桌上的日历,我发现只剩下几张纸。
自己蓦然意识到 2017 年已经即将离去,2018 年即将到来。
已经到了年底,我们需要总结和回顾今年的历程。
让我们盘点 2017 年涉及 Python 重要事件。
1.2017 年最热门的话题莫过于人工智能。人工智能是一块崭新的研究领域,所以很多公司都很注重人工智能的研究。
走在前沿的,当属谷歌。
谷歌不仅完善用于开源人工智能项目 TensorFlow 文档,建立相关社区,而且还在中国成立 AI 中国中心。
虽然 TensorFlow 虽然是用 C++ 编写的,但是提供了一套 Python 的接口。
另外,吴恩达教授又开设人工智能课程。这种种让 Python 的人气一路高涨, 成为今年世界上最流行的编程语言。
TensorFlow
2.Python 社区在几年前就一直在讨论是否迁移到 GitHub 以改进开发流程。
就在今年 2 月份,Brett Cannon 在 Python 官方邮件组发消息,确定迁移到 GitHub 的日期。
这让 Python 正式迁移到源码托管平台 GitHub,拥抱了 Git 版本控制系统。
cpython
...
Scrapy 框架插件之IP代理池
现在很多网站都是对单个 IP 地址有访问次数限制,如果你在短时间内访问过于频繁。该网站会封掉你 IP,让你在一段时间内无法正常该网站。
突破反爬虫机制的一个重要举措就是代理 IP。
拥有庞大稳定的 IP 代理,在爬虫工作中将起到重要的作用,但是从成本的角度来说,一般稳定的 IP 池都很贵。
因此,我为 Scrapy 爬虫编写个免费 IP 代理池插件。
1.特点该插件适用的程序是基于 Scrapy 框架编写的爬虫程序。插件通过爬取免费代理地址,然后过滤掉无效 IP 代理后存放到 Mysql 数据库。另外,它会每 10 分钟轮询数据库中的 IP 代理数量。如果代理地址因为连接失败次数超过 3 次被删除,从而导致代理不够,它会后台重新爬取新的 IP 代理。
2.收集的代理网站
无忧代理(data5u)
ip181 代理
快代理
西刺代理
3.项目说明
startrun.py项目的主入口。它负责启动 Scrapy 爬虫和代理池。
your_scrapy_project该目录下主要存放两个文件:config.py 和 settings.py。config.py 是代理池的项目配置信息。而 ...
Python 实现识别弱图片验证码
目前,很多网站为了防止爬虫肆意模拟浏览器登录,采用增加验证码的方式来拦截爬虫。
验证码的形式有多种,最常见的就是图片验证码。其他验证码的形式有音频验证码,滑动验证码等。图片验证码越来越高级,识别难度也大幅提高,就算人为输入也经常会输错。
本文主要讲解识别弱图片验证码。
1.图片验证码强度图片验证码主要采用加干扰线、字符粘连、字符扭曲方式来增强识别难度。
加干扰线加干扰线也分为两种,一种是线条跟字符同等颜色,另一种则线条的颜色是五颜六色。
字符粘连各个字符之间的间隔比较小,互相依靠,能以分割。
字符扭曲字符显示的位置相对标准旋转一定角度。
其中最弱的验证码为不具备以上的特征,干扰因素比较小。如下:
2.识别思路首先对图片做二值化来降噪处理,去掉图片中的噪点,干扰线等。然后将图片中的单个字符切分出来。最后识别每个字符。
图片的处理,我采用 Python 标准图像处理库 PIL。图片分割,我暂时采用谷歌开源库 Tesseract-OCR。字符识别则使用 pytesseract 库。
3.安装
Pillow
我使用的 Python 版本是 3.6, 而标准库 PIL 不支持 3. ...
Python 定时任务(下)
上篇文章,我们了解到有三种办法能实现定时任务,但是都无法做到循环执行定时任务。
因此,需要一个能够担当此重任的库。它就是APScheduler。
1.简介APScheduler的全称是Advanced Python Scheduler。
它是一个轻量级的 Python 定时任务调度框架。
APScheduler 支持三种调度任务:固定时间间隔,固定时间点(日期),Linux 下的 Crontab 命令。同时,它还支持异步执行、后台执行调度任务。
2.安装使用 pip 包管理工具安装 APScheduler 是最方便快捷的。
123pip install APScheduler# 如果出现因下载失败导致安装不上的情况,建议使用代理pip --proxy http://代理ip:端口 install APScheduler
3.使用步骤APScheduler 使用起来还算是比较简单。运行一个调度任务只需要以下三部曲。
新建一个 schedulers (调度器) 。
添加一个调度任务(job stores)。
运行调度任务。
下面是执行每 2 秒报时的简单示例代码:
12345678 ...
Python 定时任务(上)
在项目中,我们可能遇到有定时任务的需求。其一:定时执行任务。例如每天早上 8 点定时推送早报。其二:每隔一个时间段就执行任务。比如:每隔一个小时提醒自己起来走动走动,避免长时间坐着。
今天,我跟大家分享下 Python 定时任务的实现方法。
1.第一种办法是最简单又最暴力。那就是在一个死循环中,使用线程睡眠函数 sleep()。
12345678910111213from datetime import datetimeimport time'''每个 10 秒打印当前时间。'''def timedTask(): while True: print(datetime.now().strftime("%Y-%m-%d %H:%M:%S")) time.sleep(10)if __name__ == '__main__': timedTask()
这种方法能够执行固定间隔时间的任务。如果timedTask()函数之后还有些操作,我们还使用死循环 ...
Python 绘图,我只用 Matplotlib(三)
上篇文章,我已经讲解绘制图像大致步骤,接下来的系列文章将分别对各种图形做讲解。其实就是了解各个图种的绘图 API。文章就讲解第一种图形,柱状图。
1.基础绘制柱状图,我们主要用到bar()函数。只要将该函数理解透彻,我们就能绘制各种类型的柱状图。
我们先看下bar()的构造函数:bar(x,height, width,*,align='center',**kwargs)
x包含所有柱子的下标的列表
height包含所有柱子的高度值的列表
width每个柱子的宽度。可以指定一个固定值,那么所有的柱子都是一样的宽。或者设置一个列表,这样可以分别对每个柱子设定不同的宽度。
align柱子对齐方式,有两个可选值:center和edge。center表示每根柱子是根据下标来对齐, edge则表示每根柱子全部以下标为起点,然后显示到下标的右边。如果不指定该参数,默认值是center。
其他可选参数有:
color每根柱子呈现的颜色。同样可指定一个颜色值,让所有柱子呈现同样颜色;或者指定带有不同颜色的列表,让不同柱子显示不同颜色。
edgecolor每根柱子边框的颜 ...
彻底理解 Iterable、Iterator、generator
本文介绍猴哥对于Python中的Iterable、Iterator、generator的理解。
1.Iterable我们一般称Iterable为可迭代对象。
Python 中任意的对象,只要它定义了可以返回一个迭代器的__iter__方法,或者定义了可以支持下标索引的__getitem__方法,那么它就是一个可迭代对象。
我们常用到的集合数据类型都是 Iterable。
例如列表(list)、元组(tuple)、字典(dict)、集合(set)、字符串(str)等。
我定义了一个列表 numlist,打印出该列表的方法。
1234numlist = [1, 2, 3]print(numlist)print(numlist.__iter__) # 调用__iter__方法print(numlist.__getitem__) # 调用__getitem__方法
运行结果如下:
根据运行结果,我们可知列表就是个可迭代对象。
Python 的collections 库有个isinstance()函数。可以用来判断一个对象是否是 Iterable 对象。
12345from co ...