项目名称:登陆考勤管理系统爬取个人考勤信息并写入excel表格

编写目的:

公司经常要统计员工的考勤信息,而员工每次都要登陆考勤系统,再复制相关信息出来,贴到EXCEL,再转给统计人员,统计人员再挨个核对,麻烦无比,实在是看不下去了。我擦。。。。。

由于登陆的是内网的考勤系统,出了公司就登陆不了,所以本篇文章仅做参考,来体验一下cookie、post与get登陆使用。

先说用用到哪些知识吧:

1、tkinter Gui编程,写爬虫没有GUI怎么能行

2、cookie

3、post,get

其实不多是吧,简单。

要爬取一个网站,总得要矢爬的网站登陆地址,及登陆信息吧。分析一下看看。。。

好的,我们获取了如下信息:

登陆地址:LoginUrl = 'http://17.xx.xx.xx/j_acegi_security_check'

post提交:post_data = {'j_username':'your_username','j_password':'your_password'}

那就开工 ,写一下登陆代码吧

#!/usr/bin/env python

# _*_ coding:utf-8 _*_

import urllib

import urllib2

import cookielib

LoginUrl = 'http://17.xx.xx.xx/j_acegi_security_check'

post_data = {'j_username':'your_username','j_password':'your_password'}

# 定义一个类

class kaoqin_login(object):

def __init__(self):

self.cj = cookielib.CookieJar() # 初始化一个cookie补全,用于存储cookie

self.handler = urllib2.HTTPCookieProcessor(self.cj) # 创建一个cookie处理器

self.opener = urllib2.build_opener(self.handler) # 创建一个功能强大的opener

def login(self,url,post): # post提交

post_data = urllib.urlencode(post) # 编码post数据为标准格式

req = urllib2.Request(url,post_data) # 做为data参数传给Request对象,此处也可以写成data=post_data

response = self.opener.open(req) # 登陆网站,获取返回结果

print response.url

if __name__ == '__main__':

cls = kaoqin_login()

cls.login(LoginUrl,post_data)

返回信息如下:

http://17.xx.xx.xx/;jsessionid=7AC236C4B9C5E653208D59ECCE55E8EF

好,登陆成功了,之后怎么办呢?嗯,对了,找一下考勤页面在哪里,分析一下吧

瞧,真实页面的信息就这些了。自己把url和post信息整理出来吧,注意,提交表单信息要写成字典,url呢,问号之前的都是了。

示例代码

#!/usr/bin/env python

# _*_ coding:utf-8 _*_

import urllib

import urllib2

import cookielib

import json

LoginUrl = 'http://17.xx.xx.xx/j_acegi_security_check'

post_data = {'j_username':'your_username','j_password':'your_password'}

# 定义一个类

class kaoqin_login(object):

def __init__(self):

self.cj = cookielib.CookieJar() # 初始化一个cookie补全,用于存储cookie

self.handler = urllib2.HTTPCookieProcessor(self.cj) # 创建一个cookie处理器

self.opener = urllib2.build_opener(self.handler) # 创建一个功能强大的opener

def login(self,url,post): # post提交

post_data = urllib.urlencode(post) # 编码post数据为标准html格式

req = urllib2.Request(url,post_data) # 做为data参数传给Request对象,由request做post数据隐式提交,此处也可以写成data=post_data

response = self.opener.open(req) # 登陆网站,获取返回结果

print response.url

def get_response(self,url,post): # get方式提交数据

get = urllib.urlencode(post) # 将提交的数据编码成html标准格式

response = self.opener.open(url,get) # 将标准的编码数据放到url后面,变成真正的url地址

try:

JsData = json.loads(response.read())

return JsData['datas']

except Exception as e:

return False

if __name__ == '__main__':

cls = kaoqin_login()

cls.login(LoginUrl,post_data)

Login = 'http://17.xx.xx.xx/km/attendance/km_attendance_main/kmAttendanceMain.do'

data ={

'method':'data'

,'categoryId':''

,'q.s_raq':0.5949037911774411

,'pageno':2

,'rowsize':15

,'orderby':'fdAttendanceDate'

,'ordertype':'down'

,'s_ajax':'true'

}

jsdata = cls.get_response(Login,data)

print jsdata

好了,数据取到了,发一下全部的代码吧.

上面的代码是我重点想说的,下面的代码就不是那么重要了,关于excel的读取,博客里有详细的解释,GUI开发也有相关文档。

#!/usr/bin/env python

# _*_ coding:utf-8 _*_

import urllib

import urllib2

import cookielib

import json,re,time

'''

因为脚本只取了前4页数据,所以最好用来爬取本月的考勤信息

如需爬取其它月的信息,需要更改代码

for i in range(1,5) 将5改为更大,最大15

'''

# ==============框口区==================

from Tkinter import *

from ScrolledText import ScrolledText

import tkFileDialog

root = Tk()

root.iconbitmap('../data/spider_128px_1169260_easyicon.net.ico')

root.title('邮储个人考勤记录爬虫')

# 第一行

Label(root,text='考勤日期',fg='#8F8C8F').grid(row=0,column=0)

var_date1 = StringVar()

var_date1.set('2016-01-01')

var_date2 = StringVar()

var_date2.set('2016-01-31')

date1 = Entry(root,fg='red',bg='#FFFACD',textvariable=var_date1)

date1.grid(row=0,column=1)

Label(root,text='至',fg='#8F8C8F').grid(row=0,column=2)

date2 =Entry(root,fg='red',bg='#FFFACD',textvariable=var_date2)

date2.grid(row=0,column=3)

# 第二行

Label(root,text='用户密码文件',fg='#8F8C8F').grid(row=1,column=0)

var = StringVar()

def get_file():

filename = tkFileDialog.askopenfilename(initialdir='c:')

var.set(filename)

def get_file_des():

filename = tkFileDialog.askopenfilename(initialdir='c:')

ent_des.set(filename)

var.set(r'C:\spider_dev\data\kaoqin_user_pwd.txt')

Ent = Entry(root,textvariable=var).grid(row=1,column=1)

Button(root,text='选择文件',command=get_file,fg='#006400').grid(row=1,column=2)

ent_des = StringVar()

timpsta = '%d'%(time.time()*1000)

ent_des.set(r'C:\spider_dev\data\kaoqin_%s.xls'%str(timpsta))

Ent_d = Entry(root,textvariable=ent_des).grid(row=2,column=1,sticky=N)

Button(root,text='目标文件',command=get_file_des,fg='#006400').grid(row=2,column=2,sticky=N)

T_logi_info = ScrolledText(root,width=20)

T_logi_info.grid(row=2,column=0)

# 标签

v_lable = StringVar()

v_lable.set('错误记录...')

Label(root,textvariable=v_lable,fg='red').grid(row=3,column=0)

# 信息框

text = ScrolledText(root,bg='#87CEFA')

text.grid(row=0,column=4,rowspan=3)

# ==============框口区==================

# --------------爬虫区-----------------

class kaoqin_login(object):

def __init__(self):

self.cj = cookielib.CookieJar()

self.handler = urllib2.HTTPCookieProcessor(self.cj)

self.opener = urllib2.build_opener(self.handler)

def login(self,url,post):

post_data = urllib.urlencode(post)

req = urllib2.Request(url,post_data)

response = self.opener.open(req)

if response.code == 200:

return True

else:

return False

def get_response(self,url,post):

get = urllib.urlencode(post)

response = self.opener.open(url,get)

try:

JsData = json.loads(response.read())

return JsData['datas']

except Exception as e:

return False

def post_page(self,pages):

get={

'method':'data'

,'categoryId':''

,'q.s_raq':0.9518796035349586

,'pageno':pages

,'rowsize':15

,'orderby':'fdAttendanceDate'

,'ordertype':'down'

,'s_ajax':'true'

}

return get

def get_data_file(self,filename):

with open(filename,'rb') as f:

data = f.read().split('\r\n')

return data

# --------------爬虫区-----------------

#

from openpyxl.workbook import Workbook

from openpyxl.writer.excel import ExcelWriter

from openpyxl.cell import get_column_letter

wb = Workbook()

ew = ExcelWriter(workbook=wb)

ws = wb.worksheets[0]

ws.title = u'第一个sheet'

# 数据开始写入的行、列、无组数据及文件名

def write_2_excel(r,c,t_data,FileName):

i = r

for record in t_data:

for x in range(c,len(record)+c):

col = get_column_letter(x)

ws.cell('%s%s'%(col,i)).value ='%s'%record[x-c]

i+=1

ew.save(filename=FileName)

#

# ************主函数*****************

if __name__ == '__main__':

def Spider():

#初始化实例

cls = kaoqin_login()

if var.get():

List_username = cls.get_data_file(var.get())

else:

v_lable.set('密码文件对吗???')

#出勤状态,如正常、迟到

Real_Data = []

#按用户获取数据

for each_user in List_username:

#标题数据,比如excel的头部,日期,星期、上下午

Title_Data = []

#网站登陆用户信息

Pno,Pname,username,password = each_user.split(',')[0],each_user.split(',')[1],each_user.split(',')[2],each_user.split(',')[3]

LoginUrl = 'http://17.xx.xx.xx/j_acegi_security_check'

LoginPost ="{'j_username':'%s','j_password':'%s'}"%(username,password)

LoginPost = eval(LoginPost)

if cls.login(LoginUrl,LoginPost):

#进入考勤页面

Kq_Url = 'http://17.xx.xx.xx/km/attendance/km_attendance_main/kmAttendanceMain.do'

tmp1=[]

tmp2=[]

tmp3=[]

tmp4=[]

tmp4.append(Pno)

tmp4.append(Pname)

#考勤post列表,第一页到第四页数据

for i in range(1,5):

jsret = cls.get_response(Kq_Url,cls.post_page(i))

if jsret:

pass

else:

T_logi_info.insert(END,Pname+'登陆失败'+ '\n')

T_logi_info.see(END)

break

#对考勤数据处理

for each_day in jsret:

v_date=v_week=v_Bc=v_status=v_name=''

start_date = var_date1.get()

end_date = var_date2.get()

if start_date and end_date:

for item_dic in each_day:

col = item_dic['col']

if col == 'fdAttendanceDate':

v_date = item_dic['value'].strip()

if col == 'fdWeek':

v_week = item_dic['value'].strip()

if col == 'fdBc':

v_Bc = item_dic['value'].strip()

if col == 'fdStatus':

v_status = item_dic['value'].strip()

v_status = re.search('>(.*?)

if col == 'fdPerson.fdName':

v_name = item_dic['value']

if v_date >= start_date and v_date <= end_date:

tmp1.append(v_date)

tmp2.append(v_week)

tmp3.append(v_Bc)

tmp4.append(v_status)

text.insert(END, v_name +',' + v_date+','+v_week+','+v_Bc+','+v_status+'\n')

text.see(END)

text.update()

else:

v_lable.set('时间不对吧...')

pass

Title_Data.append(tmp1)

Title_Data.append(tmp2)

Title_Data.append(tmp3)

Real_Data.append(tmp4)

write_2_excel(1,3,Title_Data,ent_des.get())

write_2_excel(4,1,Real_Data,ent_des.get())

#第三行

Button(root,text='开始爬取',fg='#3CB371',command=Spider).grid(row=3,column=4)

root.mainloop()

好了,看看一下实际效果吧

python post cookies_python 之post、get与cookie实战相关推荐

  1. Python爬虫入门(6):Cookie的使用

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  2. python基础实例 韦玮 pdf_精通Python网络爬虫 核心技术、框架与项目实战 作者:韦玮PDF...

    文件目录: 书本介绍: 书名 精通Python网络爬虫:核心技术.框架与项目实战 作者 韦玮著 出版社 机械工业出版社 出版日期 2017 内容简介 本书从系统化的视角,为那些想学习Python网络爬 ...

  3. 精通Python网络爬虫_核心技术框架与项目实战_韦玮.pdf

    精通Python网络爬虫_核心技术框架与项目实战_韦玮 编辑推荐 从技术.工具.实战3个维度讲透Python网络爬虫各项核心技术和主流框架,深度讲解网络爬虫的抓取技术与反爬攻关技巧 内容简介 随着大数 ...

  4. Python执行pyinstaller打包生成的exe文件实战

    Python执行pyinstaller打包生成的exe文件实战 目录 Python执行pyinstaller打包生成的exe文件实战 #pyinstaller打包生成的exe文件

  5. Python使用matplotlib绘图并去除颜色样条colorbar实战:remove colorbar from figure in matplotlib

    Python使用matplotlib绘图并去除颜色样条colorbar实战:remove colorbar from figure in matplotlib 目录 Python使用matplotli ...

  6. python使用Spacy迁移学习库进行句法分析实战

    python使用Spacy迁移学习库进行句法分析实战 目录 使用Spacy迁移学习库进行句法分析实战 Spacy

  7. python将ElasticSearch索引数据读入pandas dataframe实战

    python将ElasticSearch索引数据读入pandas dataframe实战 # 导入基础包和库 import pandas as pdpd.set_option('display.max ...

  8. python处理excel表格数据-利用Python处理和分析Excel表中数据实战.doc

    利用Python处理和分析Excel表中数据实战 [利用python进行数据分析--基础篇]利用Python处理和分析Excel表中数据实战 原创 2017年06月28日 15:09:32 标签: p ...

  9. Python+Django+Ansible Playbook自动化运维项目实战(二)

    Python+Django+Ansible Playbook自动化运维项目实战 一.资产管理,自动化发现.扫描 1.服务端资产探测.扫描发现 1)资产管理的资产: 2)抽象与约定: 2.探测协议和模块 ...

  10. Python 网络爬虫笔记5 -- Beautiful Soup库实战

    Python 网络爬虫笔记5 – Beautiful Soup库实战 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. ...

最新文章

  1. 学习java周期_Java第一作业周期总结
  2. 高精度地图量产难,四维图新利用优势准备实现突破
  3. VTK:可视化算法之HeadSlice
  4. 如何修改Ubuntu Linux的时间
  5. 【渝粤题库】陕西师范大学720001 分子生物学
  6. java 集合addall_Java集合的addAll()方法和示例
  7. [WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu)
  8. 设计师专用新年春节2021牛年艺术字体,提升设计效率!
  9. 进阶!基于CentOS7系统使用cobbler实现单台服务器批量自动化安装不同版本系统(week3_day5_part2)-技术流ken...
  10. 【目标定位】基于matlab粒子滤波目标定位仿真【含Matlab源码 129期】
  11. 【2019杭电多校第一场1004=HDU6581】Vacation(思维+避免超时)
  12. 科比职业生涯数据集分析
  13. Axure RP 8文件按钮效果
  14. aden - 接小球游戏
  15. 英语十大词性之四 - 副词
  16. BlendMask 论文学习
  17. 全球物联网产品信息安全国际技术规范(ISO15408体系)——《物联网安全通信模块信息安全技术规范》(IoT Secure Communications Module Protection Profi
  18. 2个 windows 下的网络测试工具
  19. css层叠样式表、基本选择器
  20. 深入浅出理解类和对象

热门文章

  1. SAP License:SAP项目文档的考核标准
  2. swiper动态加载数据滑动失效,ajax执行后swiper.js的效果消失问题
  3. git上传项目全部流程
  4. python库--tensorflow--数学函数
  5. iOS工程师常用的命令行命令总结
  6. HDU 4870 Rating(高斯消元 )
  7. 笔记-JavaWeb学习之旅4
  8. Web前端开发前景怎么样?现在学习还来得及吗?
  9. Flask之flask-script
  10. SSM框架下分页的实现(封装page.java和List?)