哈喽大家好,我是鹏哥。
今天想记录的学习主题是 —— 基于pythonista3 app开发自己的iphone应用程序。
~~~上课铃~~~
(由于今天被小伙伴推荐了这首歌,因此就应他的要求,作为此文的背景音乐吧!)
1
写在前面
之前看到翔哥发过一篇如何将安卓手机打造成Python开发环境,心生羡慕。可是由于不舍得那么多的英雄和皮肤,因此只能继续玩着iphone。
网上有很多人都说Appstore里也有 python的开发工具:Pythonista 3,售价68元。对这款app,大家的评价都被五毛党刷成:虽贵真香。抱着被骗的心态,我也花了68元大洋玩了。结果是:
真香!真香!
2
效果展示
本次开发的应用程序(其实就是个小程序,但是不做标题党,没人关注呀)是个查看杭州天气的功能。
桌面app:weather
运行结果:
点击桌面app图标或者通过siri “查看天气”:,都可以实现以下功能。
3
如何玩呢
下面我从零开始,一步步教大家如何开发属于自己的iphone应用。
(1)从Appstore下载pythonista 3
(2)安装pip依赖的环境脚本:stash库
python之所以简单易用,能通过Pip命令快速安装python库是其中重要的一个原因。因为如果在手机上开发python应用,自然也要安装各种依赖库。但是Pythonista 3本身并不支持pip命令,但是国外大神自己在GitHub上编写了程序,实现了iphone pip命令的调用。
有兴趣的同学,可以访问以下地址学习Pip具体实现的代码实现。
GitHub地址:https://github.com/ywangd/stash
那么我们如何在iphone上下载stash库呢?
很简单,在pythonista 3的console界面输入以下代码:
import requests as r;exec(r.get('https://bit.ly/get-stash').text)
Tips: 一直右划,就会划到console界面
(3)下载stash及调用launch_stach.py的坑:
如果你家网络不好,你就会遇到下面的报错了:HTTPSConnect连接超时。
这里有个办法可以规避,即用电脑直接从github网站上下载getstash.py,然后通过微信转给iphone。最后在iphone 执行getstash.py也可以成功下载stash库。
成功界面如下:
下载成功的stash库会在site-packagesX里(如下图,随机一个文件夹)
从这 里还可以看到Python2/3的标准库也被pythonista 3统一下载好了,太贴心!
然后你会发现,怎么没有启动Pip的脚本:launch_stach.py呢?因为launch_stach.py被自动放到了iphone的最外层文件夹。
然后你就可以像电脑上一样,通过pip命令下载库了:
Tips: 有些库还是无法下载的,如Pyqt5
(4)编写python代码
说实话,在iphone上写爬虫代码有点傻,因为手机打字还是不方便。因此我是在电脑上编码,然后通过微信传到手机上实现的。
(5)在桌面上添加应用程序图标
在Pythonista 工具按钮里,有个Home Screen图标,即可将代码添加至iphone桌面上,如下图(为什么是通话中?因为welcome to join the conference……,某些同学懂)
(6)添加快捷命令到siri
选择创建快捷指令,然后选择脚本--pythonista3 运行脚本。这些操作按界面提示来即可,没什么难度了。然后就可以通过“嗨 Siri”来帮你自动运行python脚本了。是不是很屌?
4
示例代码
查看杭州天气的代码,可以查看之前的博客:【Python成长之路】python 从零学爬虫 -- 获取杭州天气,
因此不再详细介绍代码了。
# coding=utf-8
# @Auther : "鹏哥贼优秀"
# @Date : 2019/7/28
# @Software : PyCharm
import random
from bs4 import BeautifulSoup
import requests
def getheaders():
user_list = [
"Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16",
"Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",
"Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14",
"Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02",
"Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",
"Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00",
"Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00",
"Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00",
"Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0",
"Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62",
"Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52",
"Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51",
"Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50",
"Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50",
"Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11",
"Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11",
"Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11",
"Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10",
"Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10",
"Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10",
"Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1",
"Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01",
"Opera/9.80 (X11; Linux i686; U; ja) Presto/2.7.62 Version/11.01",
"Opera/9.80 (X11; Linux i686; U; fr) Presto/2.7.62 Version/11.01",
"Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01",
"Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.7.62 Version/11.01",
"Opera/9.80 (Windows NT 6.1; U; sv) Presto/2.7.62 Version/11.01",
"Opera/9.80 (Windows NT 6.1; U; en-US) Presto/2.7.62 Version/11.01",
"Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.7.62 Version/11.01",
"Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.7.62 Version/11.01",
"Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.7.62 Version/11.01",
"Opera/9.80 (Windows NT 5.1; U;) Presto/2.7.62 Version/11.01",
"Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.7.62 Version/11.01",
"Mozilla/5.0 (Windows NT 6.1; U; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01",
"Mozilla/5.0 (Windows NT 6.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; de) Opera 11.01",
"Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00",
"Opera/9.80 (X11; Linux i686; U; it) Presto/2.7.62 Version/11.00",
"Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.37 Version/11.00",
"Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/11.00",
"Opera/9.80 (Windows NT 6.1; U; ko) Presto/2.7.62 Version/11.00",
"Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.7.62 Version/11.00",
"Opera/9.80 (Windows NT 6.1; U; en-GB) Presto/2.7.62 Version/11.00",
"Opera/9.80 (Windows NT 6.1 x64; U; en) Presto/2.7.62 Version/11.00",
"Opera/9.80 (Windows NT 6.0; U; en) Presto/2.7.39 Version/11.00"
]
user_agent = random.choice(user_list)
headers = {'User-Agent': user_agent}
return headers
def weather():
url = "http://www.weather.com.cn/weather/101210101.shtml"
headers = getheaders()
r = requests.get(url, headers=headers)
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, "lxml")
lines = soup.find('li', class_="sky skyid lv2 on")
date = lines.h1.get_text()
weather = lines.p.string
low_temp = lines.find('p', class_="tem").i.get_text()
if not lines.find('p', class_="tem").span:
high_temp = "未知"
else:
high_temp = lines.find('p', class_="tem").span.get_text()
temp = high_temp + '-' + low_temp
wind = lines.find('span', class_="NNW").get('title')
windnumber = lines.find('p', class_="win").i.get_text()
result = {
"日期": date,
"天气": weather,
"温度": temp,
"风向": wind,
"风级": windnumber
}
print(u"日期:{0} \n天气:{1} \n温度:{2} \n风向:{3} \n风级:{4}".format(date, weather, temp, wind, windnumber))
return result
if __name__ == "__main__":
print('*****程序开始!******')
weather()
print('*****程序结束!******')
对了,要运行这段代码,需要在pyhonista中下载lxml库。如果不想下载,可以将soup = BeautifulSoup(r.text, "lxml") 改成,效果是一样的。
soup = BeautifulSoup(s, "html.parser")
5
总结
Pythonista3 在sample里有些很有意思的代码,如消消乐(300行代码实现的,大神是真的牛逼!)、三维绘图等。
然后预告下周的博客主题,基于Pythonista 3开发自己的iphone入口,如下图。好啦,下周见!
~~~下课铃~~~
点击下方诗句,可以留言互动喔
清风以北过南巷,南巷故人不知归。你本无意穿堂风,偏偏孤倨引山洪。
扫描二维码
与鹏哥一起
学python吧!