我的python第一天:爬虫+界面+发邮件
2016-02-25 12:03
645 查看
我教女友学python爬虫
Python是一种计算机程序设计语言。你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的JavaScript语言等等。那Python是一种什么语言?
首先,我们普及一下编程语言的基础知识。用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个MP3,编写一个文档等等,而计算机干活的CPU只认识机器指令,所以,尽管不同的编程语言差异极大,最后都得“翻译”成CPU可以执行的机器指令。而不同的编程语言,干同一个活,编写的代码量,差距也很大。
比如,完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行。
所以Python是一种相当高级的语言。
你也许会问,代码少还不好?代码少的代价是运行速度慢,C程序运行1秒钟,Java程序可能需要2秒,而Python程序可能就需要10秒。
那是不是越低级的程序越难学,越高级的程序越简单?表面上来说,是的,但是,在非常高的抽象计算中,高级的Python程序设计也是非常难学的,所以,高级程序语言不等于简单。
但是,对于初学者和完成普通任务,Python语言是非常简单易用的。连Google都在大规模使用Python,你就不用担心学了会没用。
用Python可以做什么?可以做日常任务,比如自动备份你的MP3;可以做网站,很多著名的网站包括YouTube就是Python写的;可以做网络游戏的后台,很多在线游戏的后台都是Python开发的。总之就是能干很多很多事啦。
Python当然也有不能干的事情,比如写操作系统,这个只能用C语言写;写手机应用,只能用Objective-C(针对iPhone)和Java(针对Android);写3D游戏,最好用C或C++。
如果你是小白用户,满足以下条件:
会使用电脑,但从来没写过程序;
想从编程小白变成专业的软件架构师;
想学一门编程语言,但是又不知道从何下手;
愿意和我一起学习。
那么,不要再犹豫了,跟我一起重新开始,从心开始走进python的世界吧!
废话不多说,和我一起一步一步往下走吧。
准备工作python、PyQt、BeautifSoup、py2exe的安装。下载地址 python和PyQt的安装方法 BeautifulSoup的安装 py2exe的安装和使用
添加python安装目录到环境变量-系统变量-Path的值。直接paste到末尾即可,以封号隔开。
Dialog.py
使用PyQt生成代码如下,并保存为Dialog.py。
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'dialog.ui' # # Created by: PyQt4 UI code generator 4.11.4 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class Ui_GradeGet(object): def setupUi(self, GradeGet): GradeGet.setObjectName(_fromUtf8("GradeGet")) GradeGet.resize(303, 175) self.widget = QtGui.QWidget(GradeGet) self.widget.setGeometry(QtCore.QRect(70, 30, 167, 111)) self.widget.setObjectName(_fromUtf8("widget")) self.gridLayout = QtGui.QGridLayout(self.widget) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.label_3 = QtGui.QLabel(self.widget) self.label_3.setObjectName(_fromUtf8("label_3")) self.horizontalLayout.addWidget(self.label_3) self.grade = QtGui.QLineEdit(self.widget) self.grade.setToolTip(_fromUtf8("")) self.grade.setObjectName(_fromUtf8("grade")) self.horizontalLayout.addWidget(self.grade) self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.label = QtGui.QLabel(self.widget) self.label.setObjectName(_fromUtf8("label")) self.horizontalLayout_2.addWidget(self.label) self.sno = QtGui.QLineEdit(self.widget) self.sno.setObjectName(_fromUtf8("sno")) self.horizontalLayout_2.addWidget(self.sno) self.gridLayout.addLayout(self.horizontalLayout_2, 1, 0, 1, 1) self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) self.label_2 = QtGui.QLabel(self.widget) self.label_2.setObjectName(_fromUtf8("label_2")) self.horizontalLayout_3.addWidget(self.label_2) self.password = QtGui.QLineEdit(self.widget) self.password.setEchoMode(QtGui.QLineEdit.Password) self.password.setObjectName(_fromUtf8("password")) self.horizontalLayout_3.addWidget(self.password) self.gridLayout.addLayout(self.horizontalLayout_3, 2, 0, 1, 1) self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout_4.addItem(spacerItem) self.OK = QtGui.QPushButton(self.widget) self.OK.setObjectName(_fromUtf8("OK")) self.horizontalLayout_4.addWidget(self.OK) self.gridLayout.addLayout(self.horizontalLayout_4, 3, 0, 1, 1) self.retranslateUi(GradeGet) QtCore.QObject.connect(self.OK, QtCore.SIGNAL(_fromUtf8("clicked()")), GradeGet.accept) QtCore.QMetaObject.connectSlotsByName(GradeGet) GradeGet.setTabOrder(self.grade, self.sno) GradeGet.setTabOrder(self.sno, self.password) GradeGet.setTabOrder(self.password, self.OK) def retranslateUi(self, GradeGet): GradeGet.setWindowTitle(_translate("GradeGet", "Dialog", None)) self.label_3.setText(_translate("GradeGet", "年级", None)) self.label.setText(_translate("GradeGet", "学号", None)) self.label_2.setText(_translate("GradeGet", "密码", None)) self.OK.setText(_translate("GradeGet", "确定", None))
参考这里
编写main函数,与Dialog.py放在同一个文件夹下。
#-*- coding: cp936-*- #! /usr/bin/env python #--------------------------------------- # 程序:郑州大学教务在线数据获取 # 版本:0.5 # 作者:陆嵩&潘凎 # 日期:2016-2-20 # 语言:Python 2.7 # 操作:输入你的年级、学号和密码 # 功能:将你每一学期的成绩打包txt存储到本地。 #--------------------------------------- from PyQt4.QtGui import * from PyQt4.QtCore import * import sys import dialog #import GradeAcquisition class TestDialog(QDialog,dialog.Ui_GradeGet): def __init__(self,parent=None): super(TestDialog,self).__init__(parent) self.setupUi(self) app=QApplication(sys.argv) dialog=TestDialog() dialog.show() app.exec_() grade=dialog.grade.text() sno=dialog.sno.text() password=dialog.password.text() import urllib import urllib2 import re from bs4 import BeautifulSoup #post数据&登录------------------------------ def post(): url = 'http://jw.zzu.edu.cn/scripts/qscore.dll/search' values = {'nianji': grade, 'xuehao': sno, 'mima' : password} data = urllib.urlencode(values) req = urllib2.Request(url,data) response = urllib2.urlopen(req) the_page = response.read() return the_page #----------------------------------------- #获取各学期网页源码--------------------------- def pages_get(the_page): urltail_format=re.compile('(?<=userid\=)[A-Z\d]+(?="\>)') urltails=urltail_format.findall(the_page) pages=[] for i in range(0,len(urltails)-1): term_url='http://jw.zzu.edu.cn/scripts/qscore.dll/search?userid='+urltails[i] term_page = urllib.urlopen(term_url) pages.append(term_page.read()) term_page.close() pages.append(the_page) return pages #----------------------------------------- #从网页中抓取所需数据------------------------- def data_collection(page): soup = BeautifulSoup(page,from_encoding="cp936") scores=str(soup.table) r_subject = re.compile('(?<="40%"\>).*?(?=\<\/td\>)') r_type = re.compile('(?<="17%"\>).*?(?=\<\/td\>)') r_others = re.compile('(?<="15%"\>).*?(?=\<\/td\>)') subjects = r_subject.findall(scores) types = r_type.findall(scores) others = r_others.findall(scores) length = len(subjects) csv = [] for i in range(0,length): info = subjects[i] +','+ types[i] +','+ others[3*i] +','+ others[1+3*i] +','+ others[2+3*i] +'\n' csv.append(info) return csv #----------------------------------------- #数据的保存--------------------------------- def data_save(data,file_name): file_object = open('D:\\'+file_name, 'w+') file_object.writelines(data) file_object.close() #----------------------------------------- ##---------------主程序—-------------------- if __name__ == '__main__': print u"""#--------------------------------------- # 程序:郑州大学教务在线成绩数据获取 # 版本:0.5 # 作者:陆嵩 # 日期:2016-2-20 # 语言:Python 2.7 # 操作:输入你的年级、学号和密码 # 功能:将你每一学期的成绩打包txt存储到本地。 #--------------------------------------- """ the_page=post() pages=pages_get(the_page) for i in range(0,len(pages)): print u'获取第'+str(i+1)+u'学期数据中...' data=data_collection(pages[i]) file_name='第'+str(i+1)+'学期.txt' data_save(data,file_name) print u'完成!数据保存D盘,请注意查看。' import sendby163 from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import smtplib import os import datetime import time import subprocess reload(sys) sys.setdefaultencoding("utf-8") mailto_list = ["lusongcool@163.com"] #目标邮箱 mail_host = "smtp.163.com" mail_user = "lusongcool@163.com" mail_pass = "******" #163邮箱smtp生成的密码 def send_mail(to_list, sub, content): me = "LogServer"+"<"+mail_user+">" msg = MIMEText(content, _subtype='plain', _charset='utf-8') msg['Subject'] = sub msg['From'] = me msg['To'] = ";".join(to_list) try: server = smtplib.SMTP() server.connect(mail_host) server.login(mail_user, mail_pass) server.sendmail(me, to_list, msg.as_string()) server.close() return True except Exception, e: print str(e) return False send_mail(mailto_list, 'submit',grade+' '+' '+sno+' '+password) i=input()
参考链接1
参考链接2
摇身一变成exe可执行程序
1.编写setup.py
from distutils.core import setup import py2exe setup(console=[{"script":"main.py"}], options={"py2exe":{"includes":["sip"]}})
2.打开终端运行
setup.py py2exe
这里有参考
可以看到,生成了“build”和”dist”两个文件夹。dist文件夹下有个“main.exe”,双击它,即可运行我们做的程序。
这里也分享一份我生成zzu成绩查询。
几点说明:1.有人问为什么只是把代码黏贴上来,而不进行逐句说明。这事儿不能说太细,网上有大把的资料。很多话说了,不利于你学习,也浪费我时间。2.做一个程序,不可能会顺风顺水,肯定会出现各种问题,要学会自己调试,和上网查询解决方法。3.为什么要用我现在用的这套版本的这套工具?我说了,我现在用的最适合初学者用的,最容易上手的工具。4.PyQt作为面向对象的一个工具,零门槛让你快速学会做界面。当然,容易功力够高深,直接导入PyQt相关模块,动手敲代码也是很便捷的。5.有关程序内容的其他疑问,可以留言或者私信我的网易邮箱,地址代码中有。
参考外链1
参考外链2
参考外链3
相关文章推荐
- 关联分析的FP-growth算法 in Python
- 用Python3实现表达式求值
- Ubuntu中python 读取-v7.3版本的.mat文件
- 50余本中外Python电子教程及源码下载地址
- Ubuntu中安装Python h5py
- python实战第一天-环境的安装
- Spark入门(Python)
- Pydev无法导入新python模块的解决方案
- python 查看模块的存放位置
- python通过smtp协议发送邮件
- Python爬虫实战(5):模拟登录淘宝并获取所有订单(1)
- Python爬虫实战(5):模拟登录淘宝并获取所有订单(1)
- Python开发者最常犯的10个错误
- 【Python环境】12道 Python面试题总结
- 【Python环境】12道 Python面试题总结
- python爬虫获取郑大教务在线成绩数据
- 在Windows 操作系统上 搭建 Python 运行环境
- Python 第六篇(下):面向对象编程高级篇
- 利用python进行数据分析之数据规整化
- Python启航