文档章节

脚本转换小结——从js转为python

sskicgah
 sskicgah
发布于 2017/05/21 23:26
字数 1556
阅读 51
收藏 0
点赞 0
评论 0

背景

上一篇提到的用户脚本,其实就是用来做一个网页挂机游戏的挂机脚本,有开着电脑,就可以开着网页挂机,机制也比较简单,定时发请求,检查请求,对于一些事件做处理,比如到了什么时间点该触发什么操作。由于本机firefox游戏打不开了,chrome经常莫名其妙地崩溃,于是改为用python来挂机,差不多,用的系统资源还少一些,毕竟chrome内存怪兽不是白叫的。js是本人工作中比较边角的语言,用的不多,python只是自学后用来简单抓取网页的,用的也不多。昨天用来一天时间写代码+测试,也是花了很久,下面简单介绍一下遇到的坑与注意点。

正文

1.定时器的选择

可以使用timer,sched,我选择用apscheduler。用pip install apscheduler之后,自动安装3.3.1版本,和2.x的是不一样的,主要提供了几个类型的定时器,这里的场景可以选择BlockingScheduler或BackgroundScheduler,简单的使用场景,试了一下都行。由于这里代码在运行过程中,需要人工输入命令来执行某些操作,BlockingScheduler试了一下输入没反应,于是使用后台任务BackgroundScheduler。js中用的是setTimeout来做延迟,python中直接使用time.sleep()就可以了。

关于这里的输入命令执行某个操作的代码,在windows下用了msvcrt,样例如下代码:

# -*- coding: utf-8 -*-
import time,datetime,msvcrt
from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()

def opt():
    scheduler.add_job(opt1, 'interval', seconds=6)
    scheduler.add_job(opt2, 'interval', seconds=9)
    scheduler.start()

def opt1():
    print('opt 1')

def opt2():
    print('opt 2')

if __name__ == '__main__':
    opt()
    flag = True
    print(u'输入:b-操作1;c-清屏标记;d-操作2;q-退出')
    while flag:
        op = msvcrt.getch().decode(encoding='utf-8')
        print(op)
        if op == 'b':
            opt1()
        elif op == 'c':
            print()
            print(u'============== %s: 间隔清屏 ==============\r\n' % datetime.datetime.now())
        elif op == 'd':
            opt2()
        elif op == 'q':
            flag = False
        else:
            print('other ok!')
        time.sleep(1)

    scheduler.shutdown()

在使用定时任务的过程中,遇到了2种类型的错误,一个是maximum number of running instances reached (1),一个是apscheduler.executors.default:Run time of job "xxx" was missed by xxx。miss的这种错误,导致后面的程序不再执行了,进入一种假死状态,网上搜了一下,在官方说明中看到跟miss有关的配置,目前暂时没触发假死的状态,就是改了初始化,设置几个默认参数,比如misfire_grace_time,比如max_instances。对于misfire_grace_time,实际要设置什么值才有效还没探索出来。初始化的例子如下:

scheduler = BackgroundScheduler({
'apscheduler.executors.processpool': {'type': 'processpool','max_workers': '10'},
'apscheduler.job_defaults.coalesce': 'false','apscheduler.job_defaults.max_instances': '10',
'apscheduler.job_defaults.misfire_grace_time':20})

2.http请求的选择

可以用urllib,urllib2,httplib,我选择httplib2。js中直接封装一个ajax调用。

function ajax(options) {
    options = options || {};
    options.type = (options.type || "GET").toUpperCase();

    if (window.XMLHttpRequest) {
        var xhr = new XMLHttpRequest();
    } else { //IE6及其以下版本浏览器
        var xhr = new ActiveXObject('Microsoft.XMLHTTP');
    }

    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            var status = xhr.status;
            if (status >= 200 && status < 300) {
                options.success && options.success(xhr.responseText, xhr.responseXML);
            } else {
                options.fail && options.fail(status);
            }
        }
    }
    
    xhr.open(options.type, options.url, true);
    if (options.type == "GET") {
        xhr.send(null);
    } else if (options.type == "POST") {
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.send(options.params);
    }
}

function httpGetTest() {
    ajax({
        url: url,
        type: "GET",
        success: function (response, xml) {
        },
        fail: function (status) {
        }
    });
}

function httpPostTest() {
    ajax({
        url: url,
        type: "POST",
        params: 'a=1&b=2&c=3',
        success: function (response, xml) {
        },
        fail: function (status) {
        }
    });
}

python中这样使用

h = httplib2.Http()
#resp里面就是请求头的信息,content是具体内容,比如返回的是json字符串等,这里是字符类型,默认是get请求
(resp, content) = h.request(url)

#post请求,假装用的是chrome
(resp, content) = h.request(url, 'POST', 'a=1&b=2&c=3', headers={'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'})

3.其他遇到的问题

3.1字符、整型

js中字符拼接整型,直接用+拼接,python中需要转换类型,比如'str = ' + str(123)

3.2日期、时间戳

js中var d = new Date(timestamp) 和 d.getTime() 可以设置时间、获取长整形时间戳,python中d = time.localtime(timestamp) 和 round(time.time()) 可以设置时间、获取长整形时间戳

3.3判断非空问题

js判断一个object是否为空,function isEmpty(e) { for(var t in e) return !1;    return !0;} python中判断数组、元组、字典就是 if not obj 就可以了。js判断object中是否包含某个key,需要遍历整个结构,python中if key in obj  或者 if key not in obj就可以了。

3.4类方法

python中调用类定义的某个方法,需要self.fun1(),如果直接fun1()会提示全局没有这个函数。如果函数定义的时候没传self,外部调用也是会失败的。

class Test():
    def __init__(self):
        print('init')
    def func1(self, a):
        print(a)
    def func2(self, b):
        self.func1(b)
        print(b)

3.5json

js中json转换完可以直接obj.a,obj.b取值,python中,data = json.loads(str)   用data['a']获取值,其实就是字典。如果是json数组,就是data[i]['a']

3.6数组赋值

简单一点就是用循环赋值,也可以用另外一种方式

size = 10
#所有数组元素初始化为0
arr = [0] * size

#循环赋值
for i in range(size):
    arr[i] = i

#另外一种赋值
arr = [i for i in range(size)]

#从对象数组取值
objs = [{'a':1,'b':2},{'a':2,'b':3},{'a':3,'b':4}]
arrb = [objs[i]['a'] for i in len(objs)]

#另外一个相对较灵活的例子
arr = [13,13,14,15,15,16,16]
l = len(arr)
ts = [ arr[i * 2] if i < (l+1)/2.0 else arr[(l - i) * 2 - 1] for i in range(l) ]

3.7输出字典

用ppring。p = pprint.PrettyPrinter(indent=4)  p.pprint(obj)

用ppring的原因是不知道怎么输出print('obj = %r' % obj),后来知道了用%r,这个万能格式

3.8urlencode字符解码

python中没有urldecode,但是有unquote。只有在windows环境测过,不知道linux环境是什么样的输出。主要还是乱码问题比较麻烦,正常汉字都不会有问题,如果里面有其他特殊字符,print输出会报错。注释的是没其他字符的,正常输出,在有非汉字的其他字符时,try里面的print会报错,如果没有这个print,try模块后面的print会报错,也是说在执行print之前,编码出问题是没检查到的。

s = '%F0%9F%9A%80YaN'#'%E4%B8%AD%E6%96%87'
ss = ''
try:
    ss = unquote(str(s)).decode('utf8', 'ignore')
    print ss + '!!!!'
except:
    ss = unquote(str(s)).decode('gbk', 'ignore')
print ss

暂时就这些,完。

© 著作权归作者所有

共有 人打赏支持
sskicgah
粉丝 7
博文 43
码字总数 32720
作品 0
福州
程序员
不能写脚本的 Markdown 编辑器不是好 CHM 制作工具

Lunar Markdown Editor(LME,现在的名字是 Markdown To CHM)是个 Markdown 编辑器,用于制作 CHM 还是比较方便的。 注意:LME 本身不能制作 CHM 文档——它只是可以创建 CHM 工程文件。然后...

帆船 ⋅ 06/01 ⋅ 0

JavaScript 和服务器端方向推荐书单(附简评)

我一直以来读书是获取知识最好的方式,很长时间以来,我都在博客维护了一个 推荐书单,最近又做了一些整理,为每本书都添加了简评,希望能对大家有帮助,当然如果能用我的推广链接购书就再好...

eapxuo ⋅ 02/09 ⋅ 0

笨办法学 Python · 续 练习 35:解释器

练习 35:解释器 原文:Exercise 35: Interpreters 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 解析中的最后一个练习应该既具有挑战性又有趣。你终于可以看到,你的微型 Python 脚...

apachecn_飞龙 ⋅ 2017/08/13 ⋅ 0

前端开发指南:ES6的生成器和迭代器

     ES6为JavaScript语言带来了许多新特性。其中两个特性,生成器和迭代器,极大地改变了我们在更复杂的前端代码中编写特定函数的方式。   虽然他们之间的关系很好,但他们实际上做的...

webstack前端栈 ⋅ 04/19 ⋅ 0

不敢想!不敢想!我用Python自动玩转2048游戏

近来在折腾selenium自动化, 感觉配合爬虫很有意思, 大多数以前难以模拟登录的网站都可以爬了,折腾了这么久, 于是想自动玩个2048游戏!嘿嘿, 我是一个不擅长玩游戏的人, 以前玩2048就经常得了...

雁横 ⋅ 06/05 ⋅ 0

没有 Python,微软宣布 Excel 新增 JavaScript 支持

去年年底曾有外媒报道,由于社区用户的强烈要求,微软正考虑添加 Python 作为官方的一种 Excel 脚本语言。不过在昨天的 Build 2018 开发者大会上,微软没有透露有关 Python 支持的消息,而是...

王练 ⋅ 05/09 ⋅ 0

100+个程序员开发必备参考手册(在线及下载) [复制链接]

100+个程序员开发必备参考手册(在线及下载) [复制链接] 上一主题下一主题

thinkyoung ⋅ 2015/08/20 ⋅ 0

利用Ajax提升网页渲染速度——以Highcharts为例

先来看看速度优化对比 Django响应请求 在Django的视图模块中, 响应ajax请求, 处理完毕后发送回前端 参考资料 关于HighCharts的Ajax例子可以参考官方文档 点击查看 菜鸟教程 点击查看 还在修改...

謝增光_Feson ⋅ 05/24 ⋅ 0

手把手教你写网络爬虫(1):网易云音乐歌单

原文出处:拓海 大家好,《手把手教你写网络爬虫》连载开始了!在笔者的职业生涯中,几乎没有发现像网络爬虫这样的编程实践,可以同时吸引程序员和门外汉的注意。本文由浅入深的把爬虫技术和...

拓海 ⋅ 04/27 ⋅ 0

Python官方库SSH Decorator被曝后门:可窃取SSH凭证

在代码库中隐藏后门的最后一次尝试已经过去了一个星期,今天我们又有了一个新的案例。这一次,后门是在一个Python模块中找到的,而不是一个npm (JavaScript)包。 该模块的名称是SSH Decorat...

云技术之家 ⋅ 05/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Linux中的端口大全

1 被LANA定义的端口 端口 名称 描述 1 tcpmux TCP 端口服务多路复用 5 rje 远程作业入口 7 echo Echo 服务 9 discard 用于连接测试的空服务 11 systat 用于列举连接了的端口的系统状态 13 d...

寰宇01 ⋅ 21分钟前 ⋅ 0

Confluence 6 如何备份存储文件和页面信息

备份的 ZIP 文件包含有 entities.xml,这个 XML 文件包含有 Confluence 的所有页面内容和存储附件的目录。 备份 Zip 文件结构 页面的附件是存储在附件存储目录中的,通过页面和附件 ID 进行识...

honeymose ⋅ 23分钟前 ⋅ 0

【每天一个JQuery特效】根据状态确定是否滑入或滑出被选元素

主要效果: 本文主要采用slideToggle()方法实现以一行代码同时实现以展开或收缩的方式显示或隐藏被选元素。 主要代码如下: <!DOCTYPE html><html><head><meta charset="UTF-8">...

Rhymo-Wu ⋅ 27分钟前 ⋅ 0

度量.net framework 迁移到.net core的工作量

把现有的.net framework程序迁移到.net core上,是一个非常复杂的工作,特别是一些API在两个平台上还不能同时支持。两个类库的差异性,通过人工很难识别全。好在微软的工程师们考虑到了我们顾...

李朝强 ⋅ 33分钟前 ⋅ 0

请不要在“微服务”的狂热中迷失自我!

微服务在过去几年一直是一个非常热门的话题(附录1)。何为“微服务的疯狂”,举个例子: 众所周知,Netflix在DevOps上的表现非常棒。Netfix可以做微服务。因此:如果我做微服务,我也将非常...

harries ⋅ 34分钟前 ⋅ 0

oAuth2 升级Spring Cloud Finchley.RELEASE踩坑分享

背景 6.19号,spring团队发布了期待已久的 Spring Cloud Finchley.RELEASE 版本。 重要变化: 基于Spring Boot 2.0.X 不兼容 Spring Boot 1.5.X 期间踩过几个坑,分享出来给大伙,主要是关于...

冷冷gg ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 理发师小姐姐的魔法

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @冰冰棒- :分享田馥甄的单曲《My Love》 《My Love》- 田馥甄 手机党少年们想听歌,请使劲儿戳(这里) @Li-Wang :哎,头发又长了。。。又要...

小小编辑 ⋅ 今天 ⋅ 9

Kafka1.0.X_消费者API详解2

偏移量由消费者管理 kafka Consumer Api还提供了自己存储offset的功能,将offset和data做到原子性,可以让消费具有Exactly Once 的语义,比kafka默认的At-least Once更强大 消费者从指定分区...

特拉仔 ⋅ 今天 ⋅ 0

NEO智能合约之发布和升级(二)

接NEO智能合约之发布和升级(一),我们接下来说说智能合约的升级功能。 一 准备工作 合约的升级需要在合约内预先设置好升级接口,以方便在升级时调用。接下来我们对NEO智能合约之发布和升级...

红烧飞鱼 ⋅ 今天 ⋅ 0

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部