大家都用 Python 来做什么啊?修改
发现很多人都在学习 Python ,但是没有明确的说明可以做什么,主流的功能是什么?想知道目前利用 Python 开发的都在干什么?修改
举报3 条评论 • 邀请回答
默认排序按时间排序
63 个回答
首先上一首Python之禅:
Python是一个非常好用的程序语言,开发的速度非常快。我用Python已经一年多了,从Python2.7到现在的Python3.4,也写了好多的小程序,其中大部分都是爬虫程序,下面简单列举几个,可怜了我科的各种系统。
0. 制作引文分析利器HistCite的便捷使用版本
怎么又出现了一个序号为零的啊!没错,这个又是我后来加上的,嘻嘻~
对于整天和文献打交道的研究生来说,HistCite是一款不可多得的效率利器,它可以快速绘制出某个研究领域的发展脉络,快速锁定某个研究方向的重要文献和学术大牛,还可以找到某些具有开创性成果的无指定关键词的论文。但是原生的HistCite已经有4年没有更新了,现在使用会出现各种bug,于是我就用Python基于HistCite内核开发了一个方便使用的免安装版本。具体的使用方法和下载链接见我的第一篇知乎专栏文章:文献引文分析利器HistCite使用教程(附精简易用免安装Pro版本下载) - Tsing的文章 - 知乎专栏
1. 破解观看中科大网络课堂
中国科学技术大学网络课堂(http://wlkt.ustc.edu.cn/)是一个非常好的平台,上面汇集了很多知名教授的授课视频,以及最新的讲座、报告、表演视频,内容还是相当丰富的。但是这些视频只面向校内IP开放。
所以想在校外看到这些视频必须破解视频地址,于是利用Python的requests库结合BeautifulSoup,用了不到10行代码就可以获取真实下载地址。
为了方便没有安装Python的电脑使用,简单写了一个GUI界面,给室友用,都说还是挺好的用的哈。
考虑到视频版权问题,代码和程序就不放出来了,请大家见谅。
2. 获取中科大研究生系统全部学生姓名、学号、选课信息
登录中国科学技术大学的研究生综合系统(中国科学技术大学研究生信息平台),可以看到每一门课选课的学生姓名和学号,当时就想能不能做一个这样的系统,来输入任何姓名(或者学号)就可以看到他所有的选课信息呢?这是选课首页:
点击每门课的已选人数链接,可以看到所有的选课学生姓名和学号:
下面就利用requests的模拟登录功能,先获取全部课程的链接,并保存对于的课程信息,然后挨个获取了所有课程的选课信息。为了保护学生信息,对程序的关键部分进行了模糊处理,希望大家谅解。
这样就获取了一个巨大的json文件,里面全部是学生姓名学号选课信息:
有了这个json文件,我们可以写入数据库,也可以直接利用json文件来查询:
为了方便其他人使用,基于上面的数据我开发了一个线上版本:
输入姓名或者学号都可以直接查询别人的选课信息:
这个地址就不放出来了,如果您是科大的研究生,私信我,我把链接发给你。
3. 扫描中科大研究生系统上的弱密码用户
基于上面获得的选课学生学号,很容易利用Python依次模拟登录研究生,密码就用弱密码123456,然后可以获得身份证号码等重要信息。
这样就得到了使用123456作为密码的用户信息,所以在此提醒大家一定不要使用弱密码,希望下面的同学早日修改密码。
4. 模拟登录中科大图书馆并自动续借
最近,科大图书馆系统升级了,到处都加了验证码,所以下面这个方法直接使用肯定是不行了,不过曾经毕竟成功过哈。以前收到借阅图书到期通知短信,就会运行一下这个程序,自动续借了,然后就可以再看一个月了。
运行就是这样的,自动续借成功,看到的链接就是每本书的续借链接。
5. 网易云音乐批量下载
终于来一个正常一点的哈,那么我就直接放代码吧,可以下载网易云音乐各个榜单的全部歌曲,批量下载,速度挺快。请注意提前要创建一个名为 “网易云音乐” 的文件夹。
于是就可以愉快的听歌了。
6. 批量下载读者杂志某一期的全部文章
上次无意中发现读者杂志还有一个在线的版本,然后兴趣一来就用Python批量下载了上面的大量文章,保存为txt格式。
7. 获取城市PM2.5浓度和排名
最近环境问题很受关注,就用Python写了一个抓取PM2.5的程序玩玩,程序支持多线程,方便扩展。
8. 爬取易迅网商品价格信息
当时准备抓取淘宝价格的,发现有点难,后来就没有尝试,就把目标选在了易迅网。
9. 音悦台MV免积分下载
音悦台上有好多高质量的MV,想要下载却没有积分,于是就想到破解下载。当时受一个大神的代码的启发,就写出了下面的代码,虽然写的有点乱,但还是可以成功破解的哈。
10. 其他请参考:能利用爬虫技术做到哪些很酷很有趣很有用的事情? - Tsing 的回答
结语:Python是一个利器,而我用到的肯定也只是皮毛,写过的程序多多少少也有点相似,但是我对Python的爱却是越来越浓的。
补充:看到评论中有好多知友问哪里可以快速而全面地学习Python编程,我只给大家推荐一个博客,大家认真看就够了:Python教程 - 廖雪峰的官方网站
Python是一个非常好用的程序语言,开发的速度非常快。我用Python已经一年多了,从Python2.7到现在的Python3.4,也写了好多的小程序,其中大部分都是爬虫程序,下面简单列举几个,可怜了我科的各种系统。
0. 制作引文分析利器HistCite的便捷使用版本
怎么又出现了一个序号为零的啊!没错,这个又是我后来加上的,嘻嘻~
对于整天和文献打交道的研究生来说,HistCite是一款不可多得的效率利器,它可以快速绘制出某个研究领域的发展脉络,快速锁定某个研究方向的重要文献和学术大牛,还可以找到某些具有开创性成果的无指定关键词的论文。但是原生的HistCite已经有4年没有更新了,现在使用会出现各种bug,于是我就用Python基于HistCite内核开发了一个方便使用的免安装版本。具体的使用方法和下载链接见我的第一篇知乎专栏文章:文献引文分析利器HistCite使用教程(附精简易用免安装Pro版本下载) - Tsing的文章 - 知乎专栏
1. 破解观看中科大网络课堂
中国科学技术大学网络课堂(http://wlkt.ustc.edu.cn/)是一个非常好的平台,上面汇集了很多知名教授的授课视频,以及最新的讲座、报告、表演视频,内容还是相当丰富的。但是这些视频只面向校内IP开放。
所以想在校外看到这些视频必须破解视频地址,于是利用Python的requests库结合BeautifulSoup,用了不到10行代码就可以获取真实下载地址。
为了方便没有安装Python的电脑使用,简单写了一个GUI界面,给室友用,都说还是挺好的用的哈。
考虑到视频版权问题,代码和程序就不放出来了,请大家见谅。
2. 获取中科大研究生系统全部学生姓名、学号、选课信息
登录中国科学技术大学的研究生综合系统(中国科学技术大学研究生信息平台),可以看到每一门课选课的学生姓名和学号,当时就想能不能做一个这样的系统,来输入任何姓名(或者学号)就可以看到他所有的选课信息呢?这是选课首页:
点击每门课的已选人数链接,可以看到所有的选课学生姓名和学号:
下面就利用requests的模拟登录功能,先获取全部课程的链接,并保存对于的课程信息,然后挨个获取了所有课程的选课信息。为了保护学生信息,对程序的关键部分进行了模糊处理,希望大家谅解。
这样就获取了一个巨大的json文件,里面全部是学生姓名学号选课信息:
有了这个json文件,我们可以写入数据库,也可以直接利用json文件来查询:
为了方便其他人使用,基于上面的数据我开发了一个线上版本:
输入姓名或者学号都可以直接查询别人的选课信息:
这个地址就不放出来了,如果您是科大的研究生,私信我,我把链接发给你。
3. 扫描中科大研究生系统上的弱密码用户
基于上面获得的选课学生学号,很容易利用Python依次模拟登录研究生,密码就用弱密码123456,然后可以获得身份证号码等重要信息。
这样就得到了使用123456作为密码的用户信息,所以在此提醒大家一定不要使用弱密码,希望下面的同学早日修改密码。
4. 模拟登录中科大图书馆并自动续借
最近,科大图书馆系统升级了,到处都加了验证码,所以下面这个方法直接使用肯定是不行了,不过曾经毕竟成功过哈。以前收到借阅图书到期通知短信,就会运行一下这个程序,自动续借了,然后就可以再看一个月了。
运行就是这样的,自动续借成功,看到的链接就是每本书的续借链接。
5. 网易云音乐批量下载
终于来一个正常一点的哈,那么我就直接放代码吧,可以下载网易云音乐各个榜单的全部歌曲,批量下载,速度挺快。请注意提前要创建一个名为 “网易云音乐” 的文件夹。
# 网易云音乐批量下载
# By Tsing
# Python3.4.4
import requests
import urllib
# 榜单歌曲批量下载
# r = requests.get('http://music.163.com/api/playlist/detail?id=2884035') # 网易原创歌曲榜
# r = requests.get('http://music.163.com/api/playlist/detail?id=19723756') # 云音乐飙升榜
# r = requests.get('http://music.163.com/api/playlist/detail?id=3778678') # 云音乐热歌榜
r = requests.get('http://music.163.com/api/playlist/detail?id=3779629') # 云音乐新歌榜
# 歌单歌曲批量下载
# r = requests.get('http://music.163.com/api/playlist/detail?id=123415635') # 云音乐歌单——【华语】中国风的韵律,中国人的印记
# r = requests.get('http://music.163.com/api/playlist/detail?id=122732380') # 云音乐歌单——那不是爱,只是寂寞说的谎
arr = r.json()['result']['tracks'] # 共有100首歌
for i in range(10): # 输入要下载音乐的数量,1到100。
name = str(i+1) + ' ' + arr[i]['name'] + '.mp3'
link = arr[i]['mp3Url']
urllib.request.urlretrieve(link, '网易云音乐\\' + name) # 提前要创建文件夹
print(name + ' 下载完成')
上面这些都是在Python3的环境下完成的,在此之前,用Python2还写了一些程序,下面也放几个吧。初期代码可能显得有些幼稚,请大神见谅。
6. 批量下载读者杂志某一期的全部文章
上次无意中发现读者杂志还有一个在线的版本,然后兴趣一来就用Python批量下载了上面的大量文章,保存为txt格式。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 保存读者杂志某一期的全部文章为TXT
# By Tsing
# Python 2.7.9
import urllib2
import os
from bs4 import BeautifulSoup
def urlBS(url):
response = urllib2.urlopen(url)
html = response.read()
soup = BeautifulSoup(html)
return soup
def main(url):
soup = urlBS(url)
link = soup.select('.booklist a')
path = os.getcwd()+u'/读者文章保存/'
if not os.path.isdir(path):
os.mkdir(path)
for item in link:
newurl = baseurl + item['href']
result = urlBS(newurl)
title = result.find("h1").string
writer = result.find(id="pub_date").string.strip()
filename = path + title + '.txt'
print filename.encode("gbk")
new=open(filename,"w")
new.write("<<" + title.encode("gbk") + ">>\n\n")
new.write(writer.encode("gbk")+"\n\n")
text = result.select('.blkContainerSblkCon p')
for p in text:
context = p.text
new.write(context.encode("gbk"))
new.close()
if __name__ == '__main__':
time = '2015_03'
baseurl = 'http://www.52duzhe.com/' + time +'/'
firsturl = baseurl + 'index.html'
main(firsturl)
7. 获取城市PM2.5浓度和排名
最近环境问题很受关注,就用Python写了一个抓取PM2.5的程序玩玩,程序支持多线程,方便扩展。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 获取城市PM2.5浓度和排名
# By Tsing
# Python 2.7.9
import urllib2
import threading
from time import ctime
from bs4 import BeautifulSoup
def getPM25(cityname):
site = 'http://www.pm25.com/' + cityname + '.html'
html = urllib2.urlopen(site)
soup = BeautifulSoup(html)
city = soup.find(class_ = 'bi_loaction_city') # 城市名称
aqi = soup.find("a",{"class","bi_aqiarea_num"}) # AQI指数
quality = soup.select(".bi_aqiarea_right span") # 空气质量等级
result = soup.find("div",class_ ='bi_aqiarea_bottom') # 空气质量描述
print city.text + u'AQI指数:' + aqi.text + u'\n空气质量:' + quality[0].text + result.text
print '*'*20 + ctime() + '*'*20
def one_thread(): # 单线程
print 'One_thread Start: ' + ctime() + '\n'
getPM25('hefei')
getPM25('shanghai')
def two_thread(): # 多线程
print 'Two_thread Start: ' + ctime() + '\n'
threads = []
t1 = threading.Thread(target=getPM25,args=('hefei',))
threads.append(t1)
t2 = threading.Thread(target=getPM25,args=('shanghai',))
threads.append(t2)
for t in threads:
# t.setDaemon(True)
t.start()
if __name__ == '__main__':
one_thread()
print '\n' * 2
two_thread()
8. 爬取易迅网商品价格信息
当时准备抓取淘宝价格的,发现有点难,后来就没有尝试,就把目标选在了易迅网。
#!/usr/bin/env python
#coding:utf-8
# 根据易迅网的商品ID,爬取商品价格信息。
# By Tsing
# Python 2.7.9
import urllib2
from bs4 import BeautifulSoup
def get_yixun(id):
price_origin,price_sale = '0','0'
url = 'http://item.yixun.com/item-' + id + '.html'
html = urllib2.urlopen(url).read().decode('utf-8')
soup = BeautifulSoup(html)
title = unicode(soup.title.text.strip().strip(u'【价格_报价_图片_行情】-易迅网').replace(u'】','')).encode('utf-8').decode('utf-8')
print title
try:
soup_origin = soup.find("dl", { "class" : "xbase_item xprice xprice_origin" })
price_origin = soup_origin.find("span", { "class" : "mod_price xprice_val" }).contents[1].text
print u'原价:' + price_origin
except:
pass
try:
soup_sale= soup.find('dl',{'class':'xbase_item xprice'})
price_sale = soup_sale.find("span", { "class" : "mod_price xprice_val" }).contents[1]
print u'现价:'+ price_sale
except:
pass
print url
return None
if __name__ == '__main__':
get_yixun('2189654')
9. 音悦台MV免积分下载
音悦台上有好多高质量的MV,想要下载却没有积分,于是就想到破解下载。当时受一个大神的代码的启发,就写出了下面的代码,虽然写的有点乱,但还是可以成功破解的哈。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 音悦台MV免积分下载
# By Tsing
# Python 2.7.9
import urllib2
import urllib
import re
mv_id = '2278607' # 这里输入mv的id,即http://v.yinyuetai.com/video/2275893最后的数字
url = "http://www.yinyuetai.com/insite/get-video-info?flex=true&videoId=" + mv_id
timeout = 30
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
}
req = urllib2.Request(url, None, headers)
res = urllib2.urlopen(req,None, timeout)
html = res.read()
reg = r"http://\w*?\.yinyuetai\.com/uploads/videos/common/.*?(?=&br)"
pattern=re.compile(reg)
findList = re.findall(pattern,html) # 找到mv所有版本的下载链接
if len(findList) >= 3:
mvurl = findList[2] # 含有流畅、高清、超清三个版本时下载超清
else:
mvurl = findList[0] # 版本少时下载流畅视频
local = 'MV.flv'
try:
print 'downloading...please wait...'
urllib.urlretrieve(mvurl,local)
print "[:)] Great! The mv has been downloaded.\n"
except:
print "[:(] Sorry! The action is failed.\n"
10. 其他请参考:能利用爬虫技术做到哪些很酷很有趣很有用的事情? - Tsing 的回答
结语:Python是一个利器,而我用到的肯定也只是皮毛,写过的程序多多少少也有点相似,但是我对Python的爱却是越来越浓的。
补充:看到评论中有好多知友问哪里可以快速而全面地学习Python编程,我只给大家推荐一个博客,大家认真看就够了:Python教程 - 廖雪峰的官方网站
# 负能量预警,这是一个悲伤的故事。
用Python 可以撩妹。
前段时间撩一个妹子,吃饭期间聊起来,妹子正在找暑假的实习,问我有没有公司推荐。我说,『你想去什么样的公司呀?』,妹子说,『听说最近搞投资的机构好多待遇又好,你知不知道呀?』。开玩笑,我好歹也算VC圈里打过滚的人,当场拍着胸脯向妹子保证,『交给我吧!回头发你一份投资机构的名单!』
然而回去之后一合计,手机里的联系人统共加起来没几个,这要怎么向妹子交代?幸好我已经不是曾经那个花了5个小时手动下载几百张PPT 素材图片的『分析师』了,什么Requests, BeautifulSoup, lxml, NumPy, Pandas, 哪个我没有见过?说干就干,我找了一个收录了比较齐全的投资机构的网站,哼哧哼哧码起代码来。
一眨眼好几个小时过去了,在被Unicode 编码折磨了一百零一遍之后,我总算捯饬出了一份投资机构名单。
这是一份非常非常简陋的名单,因为我懒得再往里面添东西,毕竟妹子的原话是『在杭州有哪些投资机构啊?』,喏,都在这儿了。
怀着喜悦的心情,我把这份名单发给了妹子。
反应不错嘛!这几个小时没白花!
# 曾经
# 我是一个
# 懵懂的
# 热血青年
# 直到
# 有一天
# 我收到了
# 一张
# 小小的
# 卡片
## 以上是我创作的俳句
过了一段时间,妹子主动来找我了。哼哼,人生苦短,我用Python。你看,这不,轻轻松松撩妹成功。
。
。。
。。。
。。。。
。。。
。。
。
后来我和妹子成为了好朋友,每周都会联系个一次两次,聊上个一句两句。
# 正文已经结束,请观众有序离场。前方高能预警,请系好安全带,文明驾驶。
大概这才是Python 的正确用法吧。(远目
用Python 可以撩妹。
前段时间撩一个妹子,吃饭期间聊起来,妹子正在找暑假的实习,问我有没有公司推荐。我说,『你想去什么样的公司呀?』,妹子说,『听说最近搞投资的机构好多待遇又好,你知不知道呀?』。开玩笑,我好歹也算VC圈里打过滚的人,当场拍着胸脯向妹子保证,『交给我吧!回头发你一份投资机构的名单!』
然而回去之后一合计,手机里的联系人统共加起来没几个,这要怎么向妹子交代?幸好我已经不是曾经那个花了5个小时手动下载几百张PPT 素材图片的『分析师』了,什么Requests, BeautifulSoup, lxml, NumPy, Pandas, 哪个我没有见过?说干就干,我找了一个收录了比较齐全的投资机构的网站,哼哧哼哧码起代码来。
一眨眼好几个小时过去了,在被Unicode 编码折磨了一百零一遍之后,我总算捯饬出了一份投资机构名单。
这是一份非常非常简陋的名单,因为我懒得再往里面添东西,毕竟妹子的原话是『在杭州有哪些投资机构啊?』,喏,都在这儿了。
怀着喜悦的心情,我把这份名单发给了妹子。
反应不错嘛!这几个小时没白花!
# 曾经
# 我是一个
# 懵懂的
# 热血青年
# 直到
# 有一天
# 我收到了
# 一张
# 小小的
# 卡片
## 以上是我创作的俳句
过了一段时间,妹子主动来找我了。哼哼,人生苦短,我用Python。你看,这不,轻轻松松撩妹成功。
。
。。
。。。
。。。。
。。。
。。
。
后来我和妹子成为了好朋友,每周都会联系个一次两次,聊上个一句两句。
# 正文已经结束,请观众有序离场。前方高能预警,请系好安全带,文明驾驶。
大概这才是Python 的正确用法吧。(远目
xlzdPython话题优秀回答者 我呀,还是个孩子~
Python 可以做什么,这是一个有趣的问题。
从入门级选手到专业级选手都在做的——爬虫
用 Python 写爬虫的教程网上一抓一大把,据我所知很多初学 Python 的人都是使用它编写爬虫程序。小到抓取一个小黄图网站,大到一个互联网公司的商业应用。通过 Python 入门爬虫比较简单易学,不需要在一开始掌握太多太基础太底层的知识就可以很快上手,而且很快可以做出成果,非常适合小白一开始想做出点看得见的东西的成就感。
除了入门,爬虫也被广泛应用到一些需要数据的公司、平台和组织,通过抓取互联网上的公开数据,来实现一些商业价值是非常常见的做法。当然这些选手的爬虫就要厉害的多了,需要处理包括路由、存储、分布式计算等很多问题,与小白的抓黄图小程序,复杂度差了很多倍。
Web 程序
除了爬虫,Python 也广泛应用到了 Web 端程序,比如你现在正在使用的知乎,主站后台就是基于 Python 的 tornado 框架,豆瓣的后台也是基于 Python。除了 tornado (Tornado Web Server),Python 常用的 Web 框架还有 Flask(Welcome | Flask (A Python Microframework)),Django (The Web framework for perfectionists with deadlines) 等等。通过上述框架,你可以很方便实现一个 Web 程序,比如我认识的一些朋友,就通过 Python 自己编写了自己的博客程序,包括之前的 zhihu.photo,我就是通过 Flask 实现的后台(出于版权等原因,我已经停掉了这个网站)。除了上述框架,你也可以尝试自己实现一个 Web 框架。
桌面程序
Python 也有很多 UI 库,你可以很方便地完成一个 GUI 程序(话说我最开始接触编程的时候,就觉得写 GUI 好炫酷,不过搞了好久才在 VC6 搞出一个小程序,后来又辗转 Delphi、Java等,最后接触到 Python 的时候,我对 GUI 已经不感兴趣了)。Python 实现 GUI 的实例也不少,包括大名鼎鼎的 Dropbox,就是 Python 实现的服务器端和客户端程序。
科学计算
Python 的开发效率很高,性能要求较高的模块可以用 C 改写,Python 调用。同时,Python 可以更高层次的抽象问题,所以在科学计算领域也非常热门。包括 scipy、numpy 等用于科学计算的第三方库的出现,更是方便了又一定数学基础,但是计算机基础一般的朋友。
图像处理
这方面不熟,列几个关键词吧,如有错误,请斧正。
keywords : OpenCV, Pillow, PIL
小结
时间问题,暂到这里。基本上可以不负责任地认为,Python 可以做任何事情。
但是,如果你是打算以此为业,我的建议是,不要局限在 「学Python」这样的思维上。要在技术领域立足,仅仅学会了 Python 的语法是不够的,你需要很多编程语言之外的基础知识。
从入门级选手到专业级选手都在做的——爬虫
用 Python 写爬虫的教程网上一抓一大把,据我所知很多初学 Python 的人都是使用它编写爬虫程序。小到抓取一个小黄图网站,大到一个互联网公司的商业应用。通过 Python 入门爬虫比较简单易学,不需要在一开始掌握太多太基础太底层的知识就可以很快上手,而且很快可以做出成果,非常适合小白一开始想做出点看得见的东西的成就感。
除了入门,爬虫也被广泛应用到一些需要数据的公司、平台和组织,通过抓取互联网上的公开数据,来实现一些商业价值是非常常见的做法。当然这些选手的爬虫就要厉害的多了,需要处理包括路由、存储、分布式计算等很多问题,与小白的抓黄图小程序,复杂度差了很多倍。
Web 程序
除了爬虫,Python 也广泛应用到了 Web 端程序,比如你现在正在使用的知乎,主站后台就是基于 Python 的 tornado 框架,豆瓣的后台也是基于 Python。除了 tornado (Tornado Web Server),Python 常用的 Web 框架还有 Flask(Welcome | Flask (A Python Microframework)),Django (The Web framework for perfectionists with deadlines) 等等。通过上述框架,你可以很方便实现一个 Web 程序,比如我认识的一些朋友,就通过 Python 自己编写了自己的博客程序,包括之前的 zhihu.photo,我就是通过 Flask 实现的后台(出于版权等原因,我已经停掉了这个网站)。除了上述框架,你也可以尝试自己实现一个 Web 框架。
桌面程序
Python 也有很多 UI 库,你可以很方便地完成一个 GUI 程序(话说我最开始接触编程的时候,就觉得写 GUI 好炫酷,不过搞了好久才在 VC6 搞出一个小程序,后来又辗转 Delphi、Java等,最后接触到 Python 的时候,我对 GUI 已经不感兴趣了)。Python 实现 GUI 的实例也不少,包括大名鼎鼎的 Dropbox,就是 Python 实现的服务器端和客户端程序。
科学计算
Python 的开发效率很高,性能要求较高的模块可以用 C 改写,Python 调用。同时,Python 可以更高层次的抽象问题,所以在科学计算领域也非常热门。包括 scipy、numpy 等用于科学计算的第三方库的出现,更是方便了又一定数学基础,但是计算机基础一般的朋友。
图像处理
这方面不熟,列几个关键词吧,如有错误,请斧正。
keywords : OpenCV, Pillow, PIL
小结
时间问题,暂到这里。基本上可以不负责任地认为,Python 可以做任何事情。
但是,如果你是打算以此为业,我的建议是,不要局限在 「学Python」这样的思维上。要在技术领域立足,仅仅学会了 Python 的语法是不够的,你需要很多编程语言之外的基础知识。
- 获取实时可用代理ip
- 微信订阅号集成日常功能开发
- 把文本转成语音的脚本
- 对已屏蔽进行分析并预测下一组开奖号码
python基于新浪sae开发的微信公众平台,实现功能:
输入段子---回复笑话
输入开源+文章---发送消息到开源中国
输入快递+订单号---查询快递信息
输入天气---查询南京最近五天天气状况
输入微博热点---回复微博当前热门话题
输入电影+名称---回复百度云盘中搜索的链接
主要代码如下:
# -*- coding: utf-8 -*-
import hashlib
import web
import lxml
import time
import os
import urllib2,json
import urllib
import re
import random
import hashlib
import cookielib
from urllib import urlencode
from lxml import etree
class WeixinInterface:
def __init__(self):
self.app_root = os.path.dirname(__file__)
self.templates_root = os.path.join(self.app_root, 'templates')
self.render = web.template.render(self.templates_root)
def GET(self):
#获取输入参数
data = web.input()
signature=data.signature
timestamp=data.timestamp
nonce=data.nonce
echostr=data.echostr
#自己的token
token="weixin9047" #这里改写你在微信公众平台里输入的token
#字典序排序
list=[token,timestamp,nonce]
list.sort()
sha1=hashlib.sha1()
map(sha1.update,list)
hashcode=sha1.hexdigest()
#sha1加密算法
#如果是来自微信的请求,则回复echostr
if hashcode == signature:
return echostr
def POST(self):
str_xml = web.data() #获得post来的数据
xml = etree.fromstring(str_xml)#进行XML解析
content=xml.find("Content").text#获得用户所输入的内容
msgType=xml.find("MsgType").text
fromUser=xml.find("FromUserName").text
toUser=xml.find("ToUserName").text
if(content == u"天气"):
url = "http://m.ip138.com/21/nanjing/tianqi/"
headers = {
'Connection': 'Keep-Alive',
'Accept': 'text/html, application/xhtml+xml, */*',
'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'}
req = urllib2.Request(url, headers = headers)
opener = urllib2.urlopen(req)
html = opener.read()
rex = r'(?<=img src="/image/s[0-9].gif" alt=").{1,6}(?=" />)'
rexx = r'(?<=div class="temperature">).{5,15}(?=</div>)'
n = re.findall(rex,html)
m = re.findall(rexx,html)
str_wether = ""
for (i,j) in zip(m,n):
str_wether = str_wether + j + " " +i + "\n"
return self.render.reply_text(fromUser,toUser,int(time.time()),"最近五天天气:\n"+str_wether)
elif(content[0:2] == u"电影"):
keyword = urllib.quote(content[2:].encode("utf-8"))
url = "http://www.wangpansou.cn/s.php?q="+keyword
headers = {
'Connection': 'Keep-Alive',
'Accept': 'text/html, application/xhtml+xml, */*',
'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'}
req = urllib2.Request(url, headers = headers)
opener = urllib2.urlopen(req)
html = opener.read()
rex = r'https?://pan.baidu.com.*\?uk=[0-9]{10}.*[\d+?]"'
m = re.findall(rex,html)
string = u""
for i in m:
string = string + i + "\n"
return self.render.reply_text(fromUser,toUser,int(time.time()),u"以下是电影链接:\n"+string)
elif(u"段子" in content):
url_8 = "http://www.qiushibaike.com/"
url_24 = "http://www.qiushibaike.com/hot/"
headers = {
'Connection': 'Keep-Alive',
'Accept': 'text/html, application/xhtml+xml, */*',
'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'}
req_8 = urllib2.Request(url_8, headers = headers)
req_24 = urllib2.Request(url_24,headers = headers)
opener_8 = urllib2.urlopen(req_8)
opener_24 = urllib2.urlopen(req_24)
html_8 = opener_8.read()
html_24 = opener_24.read()
rex = r'(?<=div class="content">).*?(?=<!--)'
m_8 = re.findall(rex,html_8,re.S)
m_24 = re.findall(rex, html_24, re.S)
m_8.extend(m_24)
random.shuffle(m_8)
return self.render.reply_text(fromUser,toUser,int(time.time()),m_8[0].replace('<br/>',''))
elif(content[0:2] == u"开源"):
url = "https://www.oschina.net/action/user/hash_login"
urll = "http://www.oschina.net/action/tweet/pub"
username = "904727147@qq.com"
passw = ""
password = hashlib.sha1(passw).hexdigest()
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.3.0')]
urllib2.install_opener(opener)
data = {'email':username,'pwd':password}
data_post = urllib.urlencode(data)
opener.open(url, data_post)
user = "2391943"
msg = content[2:].encode("utf-8")
user_code = "lPFz26r3ZIa1e3KyIWlzPNpJlaEmZqyh6dAWAotd"
post = {'user_code':user_code,'user':user,'msg':msg}
msg_post = urllib.urlencode(post)
html = urllib2.urlopen(urll,msg_post).read()
return self.render.reply_text(fromUser,toUser,int(time.time()),u"发送到开源中国动弹成功!")
elif(content[0:2] == u"快递"):
keyword = content[2:]
url = "http://www.kuaidi100.com/autonumber/autoComNum?text="+keyword
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.3.0')]
urllib2.install_opener(opener)
html = urllib2.urlopen(url).read()
jo = json.loads(html)
typ = jo["auto"][0]['comCode']
if(typ is None):
return self.render.reply_text(fromUser,toUser,int(time.time()),u"请检查你的定单号!")
urll = "http://www.kuaidi100.com/query?type="+typ+"&postid="+keyword
html_end = urllib2.urlopen(urll).read()
jo_end = json.loads(html_end)
if(jo_end["status"] == "201"):
return self.render.reply_text(fromUser,toUser,int(time.time()),u"订单号输入有误,请重新输入!")
text = jo_end["data"]
string = u""
for i in text:
string = string + i["time"] + i["context"] + "\n"
return self.render.reply_text(fromUser,toUser,int(time.time()),string)
elif(content == u"微博热点"):
url = "http://weibo.cn/pub/?tf=5_005"
headers = {
'Connection': 'Keep-Alive',
'Accept': 'text/html, application/xhtml+xml, */*',
'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'}
req = urllib2.Request(url, headers = headers)
opener = urllib2.urlopen(req)
html = opener.read().decode("utf-8")
rex = r'(?<=div class="c"><a href=").{60,79}(?=</a>)'
ss = re.findall(rex,html)
string = u""
for i in ss:
string = string + i.replace('>','\n')+"\n"
return self.render.reply_text(fromUser,toUser,int(time.time()),string.replace('"',''))
elif(content == u"知乎信息"):
username = '18362983803'
password = ''
_xsrf='558c1b60725377c5810ae2484b26781e'
url = r'https://www.zhihu.com/login/phone_num'
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.3.0')]
data = urllib.urlencode({"phone_num":username,"password":password,'_xsrf':_xsrf})
opener.open(url,data)
html = opener.open('https://www.zhihu.com/noti7/new?r=1454793308655').read()
jo = json.loads(html)
data = jo[1]
string = "增长了:"+str(data[0])+"个评论"+str(data[1])+"个粉丝"+str(data[2])+"个赞同"
return self.render.reply_text(fromUser,toUser,int(time.time()),string)
elif(u"钟志远" in content):
return self.render.reply_text(fromUser,toUser,int(time.time()),u"你想找全世界最帅的人干嘛?如果你是妹子,请加微信18362983803!汉子绕道!")
elif(u"使用" in content):
return self.render.reply_text(fromUser,toUser,int(time.time()),u"搜电影:电影+电影名,最近天气:天气,微博热门:微博热点,知乎信息:知乎信息,快递查询:快递+单号,看笑话:段子,发送动弹到开源中国:开源+内容")
else:
url = r'http://www.xiaohuangji.com/ajax.php'
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.3.0')]
string = urllib.quote(content.encode("utf-8"))
try:
data = urllib.urlencode({"para":string})
html = opener.open(url,data).read()
string = html+"\n----[回复[使用]]"
return self.render.reply_text(fromUser,toUser,int(time.time()),string)
except Exception,ex:
return self.render.reply_text(fromUser,toUser,int(time.time()),u"我不想理你了~")
2、日常工作中经常需要用到代理ip,虽然某宝可以买但是不想买,想到有一些网站上面有可用的ip代理,但是大家都知道这些网站里面10个有9个是不能用的,好了现在就写了一个脚本,提取这种网站的所有代理ip一一进行测试,获取实时可用的代理ip,代码分享:
#encoding=utf8
import urllib2
import cookielib
import lxml.html
from __builtin__ import False
import threading
import time
ip_list = []#最后的可用列表
def prepare():
cj = cookielib.MozillaCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support)
opener.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.3.0')]
urllib2.install_opener(opener)
def page(j):
prepare()
try:
url = 'http://www.xicidaili.com/wn/'+str(j)
response = urllib2.urlopen(url)
http = response.read().decode('utf-8')
doc = lxml.html.fromstring(http)
results = doc.xpath('//div/table[@id="ip_list"]/tr/td/text()')
return results
except:
pass
def page_content(j):
url = 'http://www.xicidaili.com/wn/'+str(j)
results = page(j)
for i in range(1,100):
try:
proxy = results[i*10]+":"+results[i*10+1]
sContent = urllib2.urlopen(url,timeout=3).getcode()
if(sContent == 200):
print(proxy)
ip_list.append(proxy)
else:
print("***")
except:
pass
class everpage(threading.Thread):
def __init__(self,page):
threading.Thread.__init__(self)
self.page = page
self.thread_stop = False
def run(self):
while not self.thread_stop:
page_content(self.page)
self.stop()
def stop(self):
self.thread_stop = True
if __name__=='__main__':
for i in range(1,100):
try:
everpage(i).start()
time.sleep(5)
except:
pass
# Text To Speech using SAPI (Windows) and Python module pyTTS by Peter Parente
# download installer file pyTTS-3.0.win32-py2.4.exe
# from: http://sourceforge.net/projects/uncassist
# also needs: http://www.cs.unc.edu/Research/assist/packages/SAPI5SpeechInstaller.msi
# and pywin32-204.win32-py2.4.exe at this date the latest version of win32com
# from: http://sourceforge.net/projects/pywin32/
# tested with Python24 on a Windows XP computer vagaseat 15jun2005
import pyTTS
import time
tts = pyTTS.Create()
# set the speech rate, higher value = faster
# just for fun try values of -10 to 10
tts.Rate = 1
print "Speech rate =", tts.Rate
# set the speech volume percentage (0-100%)
tts.Volume = 90
print "Speech volume =", tts.Volume
# get a list of all the available voices
print "List of voices =", tts.GetVoiceNames()
# explicitly set a voice
tts.SetVoiceByName('MSMary')
print "Voice is set ot MSMary"
print
# announce the date and time, does a good job
timeStr = "The date and time is " + time.asctime()
print timeStr
tts.Speak(timeStr)
print
str1 = """
A young executive was leaving the office at 6 pm when he found
the CEO standing in front of a shredder with a piece of paper in hand.
"Listen," said the CEO, "this is important, and my secretary has left.
Can you make this thing work?"
"Certainly," said the young executive. He turned the machine on,
inserted the paper, and pressed the start button.
"Excellent, excellent!" said the CEO as his paper disappeared inside
the machine. "I just need one copy."
"""
print str1
tts.Speak(str1)
tts.Speak('Haah haa haah haa')
print
str2 = """
Finagle's fourth law:
Once a job is fouled up, anything done to improve it only makes it worse.
"""
print str2
print
print "The spoken text above has been written to a wave file (.wav)"
tts.SpeakToWave('Finagle4.wav', str2)
print "The wave file is loaded back and spoken ..."
tts.SpeakFromWave('Finagle4.wav')
print
print "Substitute a hard to pronounce word like Ctrl key ..."
#create an instance of the pronunciation corrector
p = pyTTS.Pronounce()
# replace words that are hard to pronounce with something that
# is spelled out or misspelled, but at least sounds like it
p.AddMisspelled('Ctrl', 'Control')
str3 = p.Correct('Please press the Ctrl key!')
tts.Speak(str3)
print
print "2 * 3 = 6"
tts.Speak('2 * 3 = 6')
print
tts.Speak("sounds goofy, let's replace * with times")
print "Substitute * with times"
# ' * ' needs the spaces
p.AddMisspelled(' * ', 'times')
str4 = p.Correct('2 * 3 = 6')
tts.Speak(str4)
print
print "Say that real fast a few times!"
str5 = "The sinking steamer sunk!"
tts.Rate = 3
for k in range(7):
print str5
tts.Speak(str5)
time.sleep(0.3)
tts.Rate = 0
tts.Speak("Wow, not one mispronounced word!")
# coding=utf-8
import urllib2
stand_list = range(0,10)
dic = {'0':'万位','1':'千位','2':'百位','3':'十位','4':'个位'}
def readsource():
'''从源网页读取数据'''
request = urllib2.Request('http://data.shishicai.cn/cqssc/zoushi/38/30/')
response = urllib2.urlopen(request)
_str = response.read()
i = _str.find('Trend')
j = _str[i:].find(';</script>')
i = i+5
ans = eval(_str[i:i+j-5])[2]
return ans
def sourcedatatest(data):
'''取出最近17期的数据存储返回一个list,此函数读取数据不对,暂时不要删除'''
result_list = []
for i in range(len(data)-17,len(data)):
result_list.append(data[i])
return result_list
def sourcedara(data):
'''取出最近17期的数据存储返回一个list'''
result_list = []
for i in range(len(data['m'])-17,len(data['m'])):
struse = ''
for j in data['m'][i]:
struse = struse + str(j.index(0))
print struse
result_list.append(struse)
return result_list
def geteverdata(everdata,add):
'''
返回17期中个十百千万某一指定位置的所有值返回list以便统计
传入的参数为:17期所有中奖号码,add为需要查询的位置
'''
ever_list = []
for i in everdata:
ever_list.append(int(str(i)[add:add+1]))
return ever_list
def getalldata(everdata):
'''
按照个十百千万的位置返回所有的list
'''
last_list = []
for i in range(0,5):
middle_list = []
result_list = geteverdata(everdata, i)
done_list = dowith(result_list)
print done_list
if(done_list == stand_list):
break
middle_list.append(i)
middle_list.append(list(set(stand_list)^set(done_list)))
last_list.extend(list(middle_list))
return last_list
def last(result):
'''
最后的处理
'''
rcontent = ''
content = getalldata(result)
print content,len(content)
for i in range(0,len(content)/2):
if(len(content[i*2+1]) >= 1):
rcontent = rcontent + dic[str(i)]+'---'+str(content[i*2+1])+'\n'
print rcontent
def dowith(data):
'''
首先对每一个list进行删除重复值处理
'''
return list(set(data))
def sendemail(content):
# coding=utf-8
from smtplib import SMTP_SSL
from email.header import Header
from email.mime.text import MIMEText
import time
now = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
title = "重庆已屏蔽信息"+now
mail_info = {
"from": "904727147@qq.com",
"to": "904727147@qq.com",
"hostname": "smtp.qq.com",
"username": "904727147@qq.com",
"password": "",
"mail_subject": title,
"mail_text": content,
"mail_encoding": "utf-8"
}
smtp = SMTP_SSL(mail_info["hostname"])
smtp.set_debuglevel(1)
smtp.ehlo(mail_info["hostname"])
smtp.login(mail_info["username"], mail_info["password"])
msg = MIMEText(mail_info["mail_text"], "plain", mail_info["mail_encoding"])
msg["Subject"] = Header(mail_info["mail_subject"], mail_info["mail_encoding"])
msg["from"] = mail_info["from"]
msg["to"] = mail_info["to"]
smtp.sendmail(mail_info["from"], mail_info["to"], msg.as_string())
smtp.quit()
if __name__ == '__main__':
ans = readsource()
result = sourcedara(ans)
print result
content =last(result)
欢迎关注我的专栏:IT人不懂安全怎么行 - 知乎专栏
不免费接收python爬虫类分析类相关答疑。微信:18362983803
gaga salamer 开发/化学/外语/算法
#做网站后台
Python在网站后台这边有大量的成熟的框架,如django,flask,bottle,tornado,我曾经用过flask和django搭建了的两个网站已经上线
http://zhaduixueshe.com
http://aljun.me
#写网络爬虫
Python写爬虫非常简单,库很健全
以下是我写的一些爬虫教程和心得
http://aljun.me/post/17
http://aljun.me/post/18
#科学计算
Python有三大神器:numpy,scipy,matplotlib,其中numpy很多底层使用C语言实现的,所以速度很快,我曾经用它参加各种数学建模大赛,完全可以替代r语言和MATLAB
以下是我写的科学计算简单教程
http://aljun.me/post/16
#数据挖掘,机器学习
Python的机器学习包很多,或者自己可以试着实现机器学习算法,因为Python的类似伪代码的语法,很容易快速实现自己的想法,另外主流的机器学习算法都有成熟的包,加上谷歌开源的TensorFlow,常用的机器学习包:scikit-learn,pattern,jieba,pybrain等等
#数据科学
最近spark,Hadoop都开了Python的接口,所以使用Python做大数据的mapreduce也非常简单,加上py对数据库支持都很好,或者类似sqlalchemy的orm也非常强大好用
以及剩下的码算法,玩玩树莓派什么的我就不多说了,
py的强大其实在于他能迅速的实现想法
Python在网站后台这边有大量的成熟的框架,如django,flask,bottle,tornado,我曾经用过flask和django搭建了的两个网站已经上线
http://zhaduixueshe.com
http://aljun.me
#写网络爬虫
Python写爬虫非常简单,库很健全
以下是我写的一些爬虫教程和心得
http://aljun.me/post/17
http://aljun.me/post/18
#科学计算
Python有三大神器:numpy,scipy,matplotlib,其中numpy很多底层使用C语言实现的,所以速度很快,我曾经用它参加各种数学建模大赛,完全可以替代r语言和MATLAB
以下是我写的科学计算简单教程
http://aljun.me/post/16
#数据挖掘,机器学习
Python的机器学习包很多,或者自己可以试着实现机器学习算法,因为Python的类似伪代码的语法,很容易快速实现自己的想法,另外主流的机器学习算法都有成熟的包,加上谷歌开源的TensorFlow,常用的机器学习包:scikit-learn,pattern,jieba,pybrain等等
#数据科学
最近spark,Hadoop都开了Python的接口,所以使用Python做大数据的mapreduce也非常简单,加上py对数据库支持都很好,或者类似sqlalchemy的orm也非常强大好用
以及剩下的码算法,玩玩树莓派什么的我就不多说了,
py的强大其实在于他能迅速的实现想法
匿名用户
1 刚开始是学着php的 但是觉得(或者说搜索后)发现php的ui 没有好的框架。恰好有一天在玩儿goagent 发现文件夹里有个东东叫python 就手贱搜索了下。。。从此一发不可收拾。
2 先找教程 神马python核心教程 标准库 学习手册 可爱的 等等 又去看官方文档 学习语法 什么的
3 觉得知乎所有问题没有赞同排行榜(其实是有的 只是当时没发现) 就抓了一下 就用的urllib 好慢啊 一晚上也就十万左右啊 然后就开始研究线程thread 忽然有一天 发现有个框架叫scrapy 瞬间小清新了!
4 上网找些问题 然后用python解决 一些算法啊 比如什么素数求法之类的
5 去百度知道回答一些小问题 (能很好的回顾基础)
6 有个朋友喜欢买已屏蔽 可是颈椎不好啊 就帮他实现一个自动投注的小软件 用的splinter
7 现在很想学pyqt 做点小界面出来玩儿
8 八萬多的吉他譜(.gtp .gp5 .gp6 .img .pdf) 自己寫程序 將當中重複的刪掉 如今還剩下6w多 ……我一定是有收集癖…………
9 朋友因工作原因需要从某400网站下载录音(不能批量),之后上传到自己的空间上,所以写了一个自动下载及上传的脚本,涉及到一些很基本的库。
作为一个初学者,什么才能让你对学习产生浓厚的兴趣并且有成就感呢?那就学爬虫吧!
我是在暑假才开始接触python,到现在认认真真的学了不到一个月的样子。今天终于参照曾经一次在知乎上看到过的想法写了一个程序给女朋友作为礼物。这也是我第一次送女朋友礼物,感觉还是挺有成就感的
我做的东西很简单,附上成品图
用正则爬武汉的天气网,然后把温度和生活指数爬下来,再爬了520张我爱你的电影截图,一天附上一张,这样就可以作为一个邮件发送了~
最后写了一个crontab的脚本,每天定时运行这个python,反正我mac也不关机~
但是这段感情关机了
我是在暑假才开始接触python,到现在认认真真的学了不到一个月的样子。今天终于参照曾经一次在知乎上看到过的想法写了一个程序给女朋友作为礼物。这也是我第一次送女朋友礼物,感觉还是挺有成就感的
我做的东西很简单,附上成品图
用正则爬武汉的天气网,然后把温度和生活指数爬下来,再爬了520张我爱你的电影截图,一天附上一张,这样就可以作为一个邮件发送了~
最后写了一个crontab的脚本,每天定时运行这个python,反正我mac也不关机~
但是这段感情关机了
匿名用户
接触python三个星期,目前做的有:
关于微信通知:
申请了个人测试号,通知来的时候会推送到锁屏
其实更好的方案是利用Slack的Bot来进行推送通知
- 学校活动场地申请脚本:身处帝都某211高校,场地资源紧张,如果申请的话需要在网上像抢课那样抢场地。于是乎写了拿python写了一个脚本,包含表单提交和邮件处理,实现了在睡觉的时候也能躺收场地。后来因为抢的太快被封杀 - -
- 12306余票检测脚本:我想买的票卖没了,所以写了个小脚本扔在服务器上24小时检测是否有余票,有的话就给我的微信发个提醒。
- 课堂作业:老师留的一些不限语言的简单小网站的制作,喜欢拿python的flask+jinja2来写
关于微信通知:
申请了个人测试号,通知来的时候会推送到锁屏
其实更好的方案是利用Slack的Bot来进行推送通知
1、用Python开发了一个保存instagram图片的 微信公众号。
通过发送链接、就可以获取 instagram图片或视频了。
当然发送@ID也是可以的。
后来顺带增加了保存Facebook和推特视频的功能。
2、配合lego ev3和小米手环,做了个微信跑步神器。日行8万步!
3、写小脚本,在朋友圈发非微信拍摄的小视频。
通过发送链接、就可以获取 instagram图片或视频了。
当然发送@ID也是可以的。
后来顺带增加了保存Facebook和推特视频的功能。
2、配合lego ev3和小米手环,做了个微信跑步神器。日行8万步!
3、写小脚本,在朋友圈发非微信拍摄的小视频。
用来写英语词频统计脚本。
时态、单复数、英美拼写、变体等情况可以用 Version 6 of the 12dicts word lists 提供的 2+2+3 lem list (http://wordlist.aspell.net/12dicts-readme/#223lem) 来转换。
顺带安利一下我用 Python 写的词频统计脚本:
GitHub - Enaunimes/freeq: A Python script to generate word frequency report of English text
英语文本词频统计 in Python - 魏华的文章 - 知乎专栏
词频统计脚本 freeq 0.1.1 版本更新 - 魏华的文章 - 知乎专栏
时态、单复数、英美拼写、变体等情况可以用 Version 6 of the 12dicts word lists 提供的 2+2+3 lem list (http://wordlist.aspell.net/12dicts-readme/#223lem) 来转换。
顺带安利一下我用 Python 写的词频统计脚本:
GitHub - Enaunimes/freeq: A Python script to generate word frequency report of English text
英语文本词频统计 in Python - 魏华的文章 - 知乎专栏
词频统计脚本 freeq 0.1.1 版本更新 - 魏华的文章 - 知乎专栏
非常感谢第9条关于提取音悦台MV的想法,@Tsing
作为一名音悦台不尴不尬的使用者,看到这一个想法简直是久旱逢雨,洞房花烛,。。。
于是我就打算整(neng)理(luan)一下代码,使成为一个方便的小工具长期使用。
结果不小心代码越写越多,最后到了450+行(尴尬),但好歹也稍微完善了一下
帮助:
使用例图:
使用例图:
结果:
关于修改说明:
作为一名音悦台不尴不尬的使用者,看到这一个想法简直是久旱逢雨,洞房花烛,。。。
于是我就打算整(neng)理(luan)一下代码,使成为一个方便的小工具长期使用。
结果不小心代码越写越多,最后到了450+行(尴尬),但好歹也稍微完善了一下
帮助:
使用例图:
使用例图:
结果:
关于修改说明:
<fix>由于下载的MV视频格式是MPEG-4,所以MV文件拓展名由.flv改为.mp4</fix>
<fix>依据实际情况重调了清晰度的选择逻辑,作为一名音悦台的重度使用者,总是选择满足条件的最清晰视频</fix>
<new>
迁移到python3
后来闲的蛋疼
在python2 文本/二进制傻傻分不清的<str>类型,
以及不支持日韩文等字符的Windows 中文默认编码gbk(big5)的
令人痛苦的骚扰下,
修改代码使对python2的兼容(也因此使得代码变得啰嗦而又难看起来)。
但还是推荐使用python3,python2对于文件名在非UTF-8终端显示上可能有一点问题,
但不影响文件本身的名字,所以我也懒得管它(我真是受够python2了)
</new>
<new>增加了批量处理支持(但经过综合考虑,不支持并发)
<description>假定文件名Tai_downloader.py 将其加入到了python的搜索路径</description>
<usage>直接输入MV id: python -m Tai_downloader 2067606 2573570 2565963</usage>
<usage>指定包含MV id 的csv文件 python -m Tai_downloader </usage>
<new>
<new>获取MV 正版名称(同样有赖于对title的正则匹配)</new>
<new>用标准库argparse包装成面向shell的工具</new>
<new>增加了对下载进程以及下载结果的显示</new>
<new>增加了一些错误信息提示等有的没的</new>
<new>
添加了Windows下cmd的颜色字体
添加了Linux 下bash的颜色字体
</new>
测试:
python 2.7.10
python 3.4
on Windows 10
on Kali
测试的还是少,按照辩证唯物主义的观点,bug一定有,只不过是多少与严重程度的问题
# -*- coding: utf-8 -*-
#! /usr/bin/env python
from __future__ import print_function #both for py2 and py3,must at top of file
"""
################################################################################
YinYueTai MV download Tool
First Author: Tsing in zhihu https://www.zhihu.com/people/wq123
Modified by minghu6
################################################################################
"""
import sys
import os
import re
def python_version():return sys.version_info.major
if python_version()==3:
from urllib.request import Request #python3
from urllib.request import urlopen #python3
from urllib.request import urlretrieve #python3
from html.parser import HTMLParser
elif python_version()==2:
from urllib2 import Request
from urllib2 import urlopen
from urllib import urlretrieve
from HTMLParser import HTMLParser
def report(count, block_size, total_size):
download_size=count*block_size
percent = int(download_size*100/total_size)
pts=('\rdownload ...{0:d}%'
'\t\t{1:f} mb').format(percent,download_size/10e5)
if iswin():
with printDarkSkyBlue():
sys.stdout.write(pts)
else:
sys.stdout.write(UseStyle(pts,'cyan'))
sys.stdout.flush()
MV_NOT_EXIST='mv_not_exist'
def get_mv_name(mv_id):
#get html according to mv_id
url='http://v.yinyuetai.com/video/'+str(mv_id)
i=urlopen(url)
html=i.read()
if python_version()==3:
codec = i.info().get_param('charset', 'utf8')
html = html.decode(codec,errors='ignore')
i.close()
#parse html and get title
class Hpr(HTMLParser):
def handle_starttag(self,tag,attr):
if tag=='title':
self.handle_data=self.get_data
self.data=list()
def handle_endtag(self,tag):
if tag=='title':
self.handle_data=self.do_nothing
def do_nothing(self,data):
pass
def get_data(self,data):
self.data.append(data)
if python_version()==3:
hpr=Hpr(convert_charrefs=False)
hpr.feed(html)
elif python_version()==2:
hpr=Hpr()
hpr.feed(unicode(html,'utf-8'))
mv_name=''.join(hpr.data)
hpr.close()
def format_mv_name(mv_name):
#because of MPEG-4 belongs to MP4
if python_version()==2:
"bytes"
mv_name=mv_name.encode('utf-8')
#mv_name_formatted=mv_name.split('\n\t')[-1].split('-')[1]+'--音悦Tai'+'.mp4'
pat=r'(?<=-).*(?=-高清MV)'
m=re.search(pat,mv_name)
mv_name_formatted=m.group(0)+'--音悦Tai'+'.mp4'
#mv_name_formatted=mv_name.split('\n\t-')[1].split('高清MV')[0]+'-音悦Tai'+'.mp4'
return mv_name_formatted
return format_mv_name(mv_name)
RESOLUTION_TOO_LOW='resolution_too_low'
error_dict=dict()
def main(mv_id,output_dir='',resolution='720p'):
resolution_map={'240p':0,'480p':1,'720p':2,'1080p':3}
minumum=resolution_map[resolution]
mv_id=str(mv_id)
url='http://www.yinyuetai.com/insite/get-video-info?flex=true&videoId='+mv_id
timeout=30
headers={'User-Agent':('Mozilla/5.0(Windows NT 6.3)'
'AppleWebKit/537.36 (KHTML,like Gecko)'
'Chrome/39.0.2171.95'
'Safari/537.36'),
'Accept':('text/html,application/xhtml+xml,'
'application/xml;'
'q=0.9,image/webp,*/*;q=0.8')}
req=Request(url,None,headers)
if python_version()==3:
with urlopen(req,None,timeout) as res:
html=res.read()
codec = res.info().get_param('charset', 'utf8')
html = html.decode(codec,errors='ignore')
elif python_version()==2:
res=urlopen(req,None,timeout)
html=res.read()
reg=r'http://\w*?\.yinyuetai\.com/uploads/videos/common.*?(?=&br)'
pattern=re.compile(reg)
findList=re.findall(pattern,html) #find all version of MV
if len(findList)==0:
error_dict[mv_id]=MV_NOT_EXIST
if iswin():
with printDarkRed():
print(MV_NOT_EXIST)
elif islinux():
print(UseStyle(MV_NOT_EXIST,'red'))
else:
print(MV_NOT_EXIST)
return
if len(findList)>=minumum+1:
#print(findList)
mvurl=findList[-1] # :240p 0 :480p 1 :720p 2 :1080p 3
else:
if iswin():
with printDarkRed():
print(RESOLUTION_TOO_LOW)
elif islinux():
print(UseStyle(RESOLUTION_TOO_LOW,'red'))
else:
print(RESOLUTION_TOO_LOW)
return
filename=get_mv_name(mv_id)
if filename==MV_NOT_EXIST:
error_dict[mv_id]=MV_NOT_EXIST
if iswin():
with printDarkRed():
print(MV_NOT_EXIST)
elif islinux():
print(UseStyle(MV_NOT_EXIST,'red'))
else:
print(MV_NOT_EXIST)
return
import traceback
try:
#some shell codec like Cinese Simplied Windows's gbk
# can not decode some unicode character
ps=':) downloading %s \t'
try:
fn_prtable=filename
if iswin():
with printDarkSkyBlue():
print (ps%fn_prtable)
elif islinux():
print(UseStyle(ps%fn_prtable,'cyan'))
else:
print (ps%fn_prtable)
except UnicodeEncodeError:
fn_prtable=filename.encode('utf-8')
if iswin():
with printDarkSkyBlue():
print (ps%fn_prtable)
elif islinux():
print(UseStyle(ps%fn_prtable,'cyan'))
else:
print (ps%fn_prtable)
try:
if python_version()==2:
filename=unicode(filename,'utf-8')
urlretrieve(url=mvurl,
filename=os.path.join(output_dir,filename),
reporthook=report)
except Exception as ex:
error_dict[mv_id]=MV_NOT_EXIST
#print(MV_NOT_EXIST)
if iswin():
with printDarkRed():
traceback.print_exc()
else:
traceback.print_exc()
except Exception as ex:
pts='\n:( Sorry! The action is failed.\n'
if iswin():
with printDarkRed():
traceback.print_exc()
print (pts)
elif islinux():
traceback.print_exc()
print(UseStyle(pts,'red'))
else:
traceback.print_exc()
print (pts)
error_dict[mv_id]=fn_prtable
def mains(mv_ids=set(),filename=None,output_dir='',resolution='720p'):
#print('hi',filename)
mv_ids=set(mv_ids)
if filename!=None:
import os
try:
def format_csv(csv_reader):
iset=set()
[[iset.add(item.strip()) for item in items if item.strip()!=''] \
for items in csv_reader]
return iset
import csv
with open(filename) as f:
r=csv.reader(f)
mv_ids=format_csv(r)
except Exception as ex:
if iswin():
with printDarkRed():
print(ex)
elif islinux():
print(UseStyle(ex.__doc__,'red'))
else:
print(ex)
for (i,mv_id) in enumerate(mv_ids):
pts='\nDownloading ({0:d}/{1:d}) file'.format(i+1,len(mv_ids))
if iswin():
with printDarkSkyBlue():
print(pts)
elif islinux():
print(UseStyle(pts,'cyan'))
else:
print(pts)
main(mv_id,output_dir,resolution)
print()
if len(error_dict)==0:
pts='\n\nDownload complete.'
if iswin():
with printDarkGreen():
print(pts)
elif islinux():
print(UseStyle(pts,'green'))
else:
print(pts)
else:
total_num=len(mv_ids)
failed_num=len(error_dict)
print('\n\n')
pts1='total: \t\t%d'%total_num
pts2='download:\t%d'%total_num-failed_num
pts3='failed:\t\t%d'%failed_num
if iswin():
with printDarkSkyBlue():
print(pts1)
with prinDarkGreen():
print(pts2)
with printDarkRed():
print(pts3)
elif islinux():
print(UseStyle(pts1,'cyan'))
print(UseStyle(pts2,'green'))
print(UseStyle(pts3,'red'))
else:
print(pts1)
print(pts2)
print(pts3)
print()
for key in error_dict:
pts='{0} : {1} failed\t'.format(key,error_dict[key])
if iswin():
with printDarkRed():
print(pts)
elif islinux():
print(UseStyle(pts,'red'))
else:
print(pts)
def interactive():
from argparse import ArgumentParser
parser=ArgumentParser()
parser.add_argument('-f','--file',dest='filename',
help=('pass masses of mv id in form of csv file\n'
'(can not use with mv_ids at the same time)\n'
'ascii comm!! for python2'))
parser.add_argument('mv_ids',nargs='*',
help='pass mv ids(can not use with -f at the same time)')
parser.add_argument('-o','--output_dir',
help='output mv directory')
parser.add_argument('-r','--resolution',default='720p',choices=['240p','480p','720p','1080p'],
help='the minimum resolution you can accept (default 720p)')
args=parser.parse_args().__dict__
#print(args)
if args['output_dir']!=None:
args['output_dir']=os.path.abspath(args['output_dir'])
if not os.path.isdir(os.path.abspath(args['output_dir'])):
raise Exception('arg: -o/--output_dir is not a valid directory')
else:
args['output_dir']=''
if args['filename']==None and args['mv_ids'].__len__()==0:
raise Exception('too few args need -f or mv_ids')
return args
################################################################################
# CMD Color Mode
################################################################################
import platform
import ctypes
import sys
def iswin():
return platform.platform().upper().startswith('WIN')
def islinux():
return platform.platform().upper().startswith('LINUX')
if iswin():
STD_OUTPUT_HANDLE = -11
std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
def set_cmd_text_color(color, handle=std_out_handle):
Bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
return Bool
FOREGROUND_RED = 0x0c # red.
FOREGROUND_GREEN = 0x0a # green.
FOREGROUND_BLUE = 0x09 # blue.
#reset white
def resetColor():
set_cmd_text_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
FOREGROUND_DARKRED = 0x04 # dark red.
FOREGROUND_DARKGREEN = 0x02 # dark green.
FOREGROUND_DARKSKYBLUE = 0x03 # dark skyblue.
class printColor:
def __exit__(self,*args,**kwargs):
resetColor()
class printDarkRed(printColor):
def __enter__(self):
set_cmd_text_color(FOREGROUND_DARKRED)
#暗绿色
#dark green
class printDarkGreen(printColor):
def __enter__(self):
set_cmd_text_color(FOREGROUND_DARKGREEN)
#暗天蓝色
#dark sky blue
class printDarkSkyBlue(printColor):
def __enter__(self):
set_cmd_text_color(FOREGROUND_DARKSKYBLUE)
elif islinux():
STYLE = {
'fore':
{
'red' : 31, # 红色
'green' : 32, # 绿色
'cyan' : 36, # 青蓝色
},
}
def UseStyle(string, fore=''):
fore = '%s' % STYLE['fore'][fore] if fore in STYLE['fore'] else ''
style = ';'.join([s for s in [fore] if s])
style = '\033[%sm' % style if style else ''
return '%s%s' % (style, string)
################################################################################
if __name__=='__main__':
args=interactive()
mains(**args)
python的方便就是到处都可用,随时编辑随时执行。所以我觉得和树莓派是一个很好的搭配。
目前自己正在考虑做的是家里的报警系统,功能如下:
目前自己正在考虑做的是家里的报警系统,功能如下:
- 程序检测时间是每天人不在家的7am-6pm;
- 树莓派搭配摄像头,对着家门进行图像识别,如果有变化(门开了),则报警;
- 报警的方法是给我发一封邮件带摄像头的拍照。昨天刚弄好现在也可以发手机短信了(网上有库,可以给各种手机发短信和彩信,只是每条短信要5分钱)。所以目前正在考虑换成免费发iMessage的。
本人本科生,最开始是想用爬虫来做教务系统抢课程序来着,后来卡在了http,get,post等实现上(非专业人员硬伤)。现在顶多就是写写筛选信息的小爬虫,用wxPython写写GUI小游戏,用numpy,scipy搞科学计算,用matplotlib画图,用pil批量p图,用csv处理Excel表格啥的。都是些很浅层次的用法~但依然是喜欢上Python这门语言了
可以用来画地图,如下图清代安徽省与今安徽省对比图:
底图:谭图第八册清代安徽省地图
边界信息由python 读取shapefile得到。
红色边界:今安徽省界
黑色边界:今地市界(三分巢湖,寿县枞阳县已更新)
灰色边界:今区县界
亮部:清代不归安徽省,今划归
暗部:清代划归安徽省,今划出
由于没有乡镇级行政区的shapefile,对更小的行政区划变化还不能精确掌握(如六安市新成立的叶集区,原叶集镇)。
红叉代表今安徽省所有县级以上行政区经纬度位置,通过python爬虫得到。
底图:谭图第八册清代安徽省地图
边界信息由python 读取shapefile得到。
红色边界:今安徽省界
黑色边界:今地市界(三分巢湖,寿县枞阳县已更新)
灰色边界:今区县界
亮部:清代不归安徽省,今划归
暗部:清代划归安徽省,今划出
由于没有乡镇级行政区的shapefile,对更小的行政区划变化还不能精确掌握(如六安市新成立的叶集区,原叶集镇)。
红叉代表今安徽省所有县级以上行政区经纬度位置,通过python爬虫得到。
写秒杀器,给自己秒点小东西。然后账号不够用了,又写批量注册机。
想下载图片,写图片下载器。
写过网站,还写过流量修改器。
最常用的还是处理文本,某些繁琐的流程,噼里啪啦很快就写个脚本出来,跑一下结束了,而且在下次再用。
想下载图片,写图片下载器。
写过网站,还写过流量修改器。
最常用的还是处理文本,某些繁琐的流程,噼里啪啦很快就写个脚本出来,跑一下结束了,而且在下次再用。
刚开始学,爬虫即入门。
大一到大三学过c c++ 然而基本都还给了老师…………
自学了一段时间的python,开始学爬虫,写爬虫,目前差不多只会request库。
下面是今天早上起来写到刚才的代码,爬耐卡影音的美剧资源,只爬取熟肉网盘链接。
现在的功能是爬取前N页的所有美剧的熟肉资源(但是还没加资源标题,就是只有网盘链接,但是不知道是那个剧)
放代码
大一到大三学过c c++ 然而基本都还给了老师…………
自学了一段时间的python,开始学爬虫,写爬虫,目前差不多只会request库。
下面是今天早上起来写到刚才的代码,爬耐卡影音的美剧资源,只爬取熟肉网盘链接。
现在的功能是爬取前N页的所有美剧的熟肉资源(但是还没加资源标题,就是只有网盘链接,但是不知道是那个剧)
放代码
#-*_coding:utf8-*-还有一些其他的,都差不多,还在学,有想法就做出来,这样才有趣……
#耐卡美剧资源爬取
# Python3.5.1
import requests
import re
class spider(object):
def __init__(self):
print ('-----------------开始爬取内容-------------------')
#getsource用来获取网页源代
def getsource(self,url):
html = requests.get(url,headers=hea)
return html.text
#changepage用来生产不同页数的链接
def changepage(self,url,total_page):
now_page = int(re.search('page=(\d+)',url,re.S).group(1))
page_group = []
for i in range(now_page,total_page+1):
link = re.sub('page=\d+','page=%s'%i,url,re.S)
page_group.append(link)
return page_group
#geteveryclass用来抓取每个链接块的信息
def geteveryclass(self,source):
everyclass = re.findall('<tbody id="normalthread(.*?)onclick="CONTENT_TID=',source,re.S)
return everyclass
#geteveryclass2用来第二次抓取每个帖子内链接块的信息
def geteveryclass2(self,source):
everyclass2 = re.findall('</iframe></div></div><br />(.*?)border="0" class="vm" alt="" />',source,re.S)
return everyclass2
#getnextclass用来从链接块里面抓美剧帖子链接
def getnextclass(self,source2):
nextclass = re.findall('<a href="(.*?)" title="',source2,re.S)
# nextclass = re.findall('<a href="(.*?)amp;(.*?)amp;(.*?)" title="',source2,re.S)
return nextclass
#getmovietitle用来抓取帖子内美剧地址的信息
def getmovietitle(self,eachmovie):
# address = re.findall('<a href="(.*?)" target="_',eachmovie,re.S)
# return address
info={}
info['address'] = re.findall('<a href="(.*?)" target="_',eachmovie,re.S)
return info
#saveinfo用来保存结果到耐卡.txt文件中
def saveinfo(self,classinfo):
f=open('耐卡.txt','w')
for each in classinfo:
f.write('美剧观看地址:' + str(each['address'])+ '\n')
f.write('\n')
f.close()
# 主程序
if __name__ == '__main__':
classinfo=[]
url1 = 'http://bbs.ncar.cc/'
url = 'http://bbs.ncar.cc/forum.php?mod=forumdisplay&fid=129&page=1'
hea={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 UBrowser/5.6.12150.8 Safari/537.36'}
YGspider = spider()
all_links = YGspider.changepage(url,5)
for link in all_links:
print ('正在处理页面:' + link)
htmll = YGspider.getsource(link)
htmll2 = YGspider.geteveryclass(htmll)
for j in htmll2: # 获得美剧链接,
bt = YGspider.getnextclass(j)
each = url1 + bt[0] #出来的链接为假链接
a=each.replace('&','&') # 替换字符,得到正确的链接
# print(a)
#截至这里的代码都正确
html3 = YGspider.getsource(a) #再次调用获取网页源代码函数
# print('源码'+html3)
html4 = YGspider.geteveryclass2(html3) #再次调用获取连接块函数
# print(html4)
#截至这里,所有代码跟预测的结果都一样
for m in html4:
LG = YGspider.getmovietitle(m)
classinfo.append(LG)
# print(LG)
YGspider.saveinfo(classinfo)
print('----------------------数据爬取完成--------------------')
对我来说学习Python完全是一种偶然,就职在杭州,因为工作的缘故,经常会关注浙江省内的高速公路路况信息。
当然,现在这种路况事件信息可以很轻松的随时查询到,渠道也挺多,电话、网站、APP、微信等等。
但我的需求比较特别。
首先,目前已有的查询渠道都是定向查询,需要用户先指定要查询的路名,然后它会把这条高速的路况信息一条一条的列出来。但我希望是页面一打开,就告诉我全部的路况事件信息。
然后,不要无关紧要的信息。比如今天几点到几点,K多少加多少有施工。这种信息其实很无聊。开车上高速前,你会因为这么个施工信息而考虑改变今天的行程么?当然,如果因为这个施工而造成了这个路段的拥堵,那是必须要提醒的。
找来找去,没找到符合我需求的,所以想着就只有自己动手了。目标是一个简单的网页,专门用来实现以上两个需求。
交待一下背景,交通工程专业,2000年毕业,大学里学过C和Foxpro,这是仅有的一点编程实践。
欲善其事,先利其器,本来应该交待一下选Python的前因后果,可是写不出来,因为根本就没有原因,也许只是因为看着眼熟吧。过程其实相当折腾,毕竟有毛20年没写过程序,一切几乎都是从零开始,虽然全程碰到的问题用搜索引擎都解决了,但反反复复在所难免,记忆最深刻的是编码问题,一度想放弃算了,搁置了将近三个星期,还是不甘心,又硬着头皮到处寻找问题原因,总算解决了。可是总结下来,Python确实让我非常惊喜。
步骤大致如下:
一、先写个爬虫,每5分钟去指定网站把高速公路路况事件信息抓下来。
二、把满足前提条件的事件信息保存下来。
三、展示出来。
程序部署在新浪的SAE,没有开数据库,用Memcached保存事件信息,反正每5分钟更新,也没作长期保存的打算。
网址:http://www.62gaosu.com/,为什么要在高速前面加62这个数字呢?因为在杭州话里, 62这个数字有着相当的含义,表示的是呆子、傻的意思,所以就是想表达不用动脑筋,打开就能用的意思。在手机上打开的效果是这样的:
贴上原代码,因为没有系统性的学习过,纯粹为了解决自己的特定需求而现查现改现写,莫名其妙之处,请一笑了之。为减少不必要的麻烦,将爬虫目标网址用星号代替了去。
当然,现在这种路况事件信息可以很轻松的随时查询到,渠道也挺多,电话、网站、APP、微信等等。
但我的需求比较特别。
首先,目前已有的查询渠道都是定向查询,需要用户先指定要查询的路名,然后它会把这条高速的路况信息一条一条的列出来。但我希望是页面一打开,就告诉我全部的路况事件信息。
然后,不要无关紧要的信息。比如今天几点到几点,K多少加多少有施工。这种信息其实很无聊。开车上高速前,你会因为这么个施工信息而考虑改变今天的行程么?当然,如果因为这个施工而造成了这个路段的拥堵,那是必须要提醒的。
找来找去,没找到符合我需求的,所以想着就只有自己动手了。目标是一个简单的网页,专门用来实现以上两个需求。
交待一下背景,交通工程专业,2000年毕业,大学里学过C和Foxpro,这是仅有的一点编程实践。
欲善其事,先利其器,本来应该交待一下选Python的前因后果,可是写不出来,因为根本就没有原因,也许只是因为看着眼熟吧。过程其实相当折腾,毕竟有毛20年没写过程序,一切几乎都是从零开始,虽然全程碰到的问题用搜索引擎都解决了,但反反复复在所难免,记忆最深刻的是编码问题,一度想放弃算了,搁置了将近三个星期,还是不甘心,又硬着头皮到处寻找问题原因,总算解决了。可是总结下来,Python确实让我非常惊喜。
步骤大致如下:
一、先写个爬虫,每5分钟去指定网站把高速公路路况事件信息抓下来。
二、把满足前提条件的事件信息保存下来。
三、展示出来。
程序部署在新浪的SAE,没有开数据库,用Memcached保存事件信息,反正每5分钟更新,也没作长期保存的打算。
网址:http://www.62gaosu.com/,为什么要在高速前面加62这个数字呢?因为在杭州话里, 62这个数字有着相当的含义,表示的是呆子、傻的意思,所以就是想表达不用动脑筋,打开就能用的意思。在手机上打开的效果是这样的:
贴上原代码,因为没有系统性的学习过,纯粹为了解决自己的特定需求而现查现改现写,莫名其妙之处,请一笑了之。为减少不必要的麻烦,将爬虫目标网址用星号代替了去。
import sae, urllib, urllib2, json, pylibmc
from werkzeug.wrappers import Request
def gsspider():
url = 'http://******'
#事件列表
causename = [u'缓行', u'缓慢', u'分流', u'排队', u'管制', u'大流量']
#定义一个空的路况事件列表
LqTxtList = []
for roadid in range(1, 51):
values = {"roadlineid" : str(roadid)}
request = urllib2.Request(url, urllib.urlencode(values))
html = urllib2.urlopen(request, timeout = 1).read()
html = json.loads(html)
data = html['data']
for i in range(len(data)):
reportout = data[i]['reportout']
for cause in range(len(causename)):
#路况事件信息内只有含有事件列表内的一个元素
#就将该条信息写入路况事件列表内
if causename[cause] in reportout:
LqTxtList.append(reportout)
break
#按时间倒序,然后输出成路况事件信息字符串
LqInfoList = sorted(LqTxtList, reverse=True)
LqInfoTxt = ''
for i in range(len(LqInfoList)):
LqInfoTxt = LqInfoTxt + LqInfoList[i] + '<br><br>'
#如果文本长度小于5,认为目前无异常路况
if len(LqInfoTxt) < 5:
LqInfoTxt = u'目前浙江省内高速公路通行正常。'
#初始化memcache
mc = pylibmc.Client()
#将符合条件的路况事件信息字符串存入memcache
mc.set('info', LqInfoTxt)
def app(environ, start_response):
#定义输出样式
htmlstyle = '''
<html>
<head>
<title>六耳高速网 | 浙江高速路况</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>%s<br></body>
<footer>浙ICP备16003482号</footer>
</html>'''
#如果访问的地址中含有spider,则判断是cron计划任务,执行gsspider
if "spider" in Request(environ).url:
gsspider()
#否则认为是用户在浏览器端发起的访问,输出结果
else:
mc = pylibmc.Client()
value = mc.get('info')
output = htmlstyle % value.encode('utf-8')
status = "200 OK"
response_headers = [
("Content-type", "text/html; charset = utf-8"),
("Content-Length", str(len(output)))
]
start_response(status, response_headers)
return [output]
application = sae.create_wsgi_app(app)
python就像arduino 大家玩玩很开心.我能这样了,我能那样了
说到真有什么用? 现成软件一大把,永远不会用python来做..
比如前面朋友说的盗链,直接用开发者工具好么...谁有空去分析源码啊.
所以,你硬是要干,我也不拦你...
你说你做了个什么东西,结果派上什么用.是的...是可以用.
但是..,你为什么不着更容易的办法呢?
为了看一个价格信息..你花20分钟做个软件. 我就问,你有20分钟,够你查多少次?
你说你以后可以再用....,真是会再用么,且不论
每次新的网站你再花20分钟解析登录什么...20分钟,你能成功就谢天谢地了
说到真有什么用? 现成软件一大把,永远不会用python来做..
比如前面朋友说的盗链,直接用开发者工具好么...谁有空去分析源码啊.
所以,你硬是要干,我也不拦你...
你说你做了个什么东西,结果派上什么用.是的...是可以用.
但是..,你为什么不着更容易的办法呢?
为了看一个价格信息..你花20分钟做个软件. 我就问,你有20分钟,够你查多少次?
你说你以后可以再用....,真是会再用么,且不论
每次新的网站你再花20分钟解析登录什么...20分钟,你能成功就谢天谢地了
我学python的动机是为了给正在开发的游戏做一个character,sprite编辑器,省去手动输入的重复劳动。用pyQt写成的编辑器生成lua代码,然后执行lua脚本。之所以选python,是因为1.它是脚本语言,2.我之后用C扩展方便可行。
阿阿聪 我有一个改变世界的想法!
在爬虫上用的比较多,偶尔还有些小工具
1、某次看到知乎上有人应excel画画,然后自己写了个照片转为excel的小东西,每个单元格当作一个像素点,然而并没有什么卵用。
2、接入机器人,终端聊天。
并没有什么卵用
3、爬取想要的东西,工作要求的,还有自己想要的,比如网上大量的图片,然后几行代码用flask加个瀑布流随机展示二十张,手机连上wifi就可以看到没有广告的高质量的你懂的图片。
4、大部分重复劳动,比如每天十点一分(上班时间)把该查询的该统计的做完给我发一封上一天的统计综述,感觉自己有一班小弟给自己汇报工作 (手动微笑
5、随手终端里面ipython处理一些简单的小任务,比如文本文件格式化,查查重,当计算器什么的。
1、某次看到知乎上有人应excel画画,然后自己写了个照片转为excel的小东西,每个单元格当作一个像素点,然而并没有什么卵用。
2、接入机器人,终端聊天。
并没有什么卵用
3、爬取想要的东西,工作要求的,还有自己想要的,比如网上大量的图片,然后几行代码用flask加个瀑布流随机展示二十张,手机连上wifi就可以看到没有广告的高质量的你懂的图片。
4、大部分重复劳动,比如每天十点一分(上班时间)把该查询的该统计的做完给我发一封上一天的统计综述,感觉自己有一班小弟给自己汇报工作 (手动微笑
5、随手终端里面ipython处理一些简单的小任务,比如文本文件格式化,查查重,当计算器什么的。
唐海 入门级数据挖掘工程师
工作上就是写写脚本,干一些shell类似的活,以及web相关的东西。
非工作自己捣鼓东西的话,那就是你想干什么就用python去干,比如写个爬虫,搭个博客,用用scikit-learn搞搞机器学习之类的,如果实在不知道做什么的话,像我一样写爬虫吧,豆瓣知乎微博,都试着搞搞
非工作自己捣鼓东西的话,那就是你想干什么就用python去干,比如写个爬虫,搭个博客,用用scikit-learn搞搞机器学习之类的,如果实在不知道做什么的话,像我一样写爬虫吧,豆瓣知乎微博,都试着搞搞
匿名用户
Python还挺全能的,主要是community活跃,各类package很多。直接编程也可以,面对对象也可以,写起来算是比较简洁方便的。
我常用matplotlib画图,还用过sqlite3 beautifulsoup json lxml等做过一些小的数据处理。
开发方面我想Django和flask等网络框架算一个,还有就是python+R的数据科学方面。
我常用matplotlib画图,还用过sqlite3 beautifulsoup json lxml等做过一些小的数据处理。
开发方面我想Django和flask等网络框架算一个,还有就是python+R的数据科学方面。
Python为web开发提供了许多选择:
- ·微框架如Flask和Bottle。
·高级内容管理系统,如Plone和django CMS。 - 框架如Django和Pyramid。
- 微框架如Flask和Bottle。
- 高级内容管理系统,如Plone和django CMS。
Python的标准库支持许多Internet协议:
- HTML和XML
- JSON
- 电子邮件处理
- 支持FTP,IMAP和其他Internet协议。
详细了解Python能做什么:谈谈Python能做什么