设计网站后台数据采集程序
■ 江苏 王坤
Python 是一门非常快捷的工具语言,类库非常丰富,在解决工作及生活中各类问题都有很多现成的工具和例子。近年来,Python 成为数据科学家们在数据分析、可视化和机器学习方面的语言,它可以带来高效率和高生产力。利用Python 采集数据,
在自动登录环节,需要对验证码进行识别,识别正确后,利用POST 提交用户名、密码信息完成登录操作。登录成功后,系统会返回登录凭证的Cookie 信息,利用登录凭证查特定数据,如数据存在更新则保存为mht 文件。
程序功能介绍
程序功能如图1所示,其难点在于如何实现自动登录及利用登录凭证抓取特定数
编者按:在日常的工作中,需要周期性的登录某些站点获取任务信息、任务进展状态、汇总数据及传送文件至共享服务器等,登录步骤繁琐且密码复杂多样,登录成功后需要逐个查看并保存任务,日常操作过程中工作效率不高,需要花费大量时间。本文介绍了利用Python 模拟登录网站后台并采集数据的程序实现原理及设计方法。
据。在自动登录过程中,由于验证码采用了空心化、扭曲、翻转、干扰线等手段防止程序的自动识别,在特定页面的访问上,需要获取登录凭证。同时,页面采取了“反盗链”机制,对页面来源、页面代理进行严格检测。因此,在程序设计过程中,需要训
练样本,打造模型,完成对验证码的识别并容错控制,在采集数据过程中,需要 “伪装”成正常用户行为,绕过页
面检测。
自动登录
1.验证码识别技术
设计验证码的主要
目的是区分人类和计算机,用来防止网络机器人的一些行为。因此许多人开始研究网络机器人技术,用来实现邮箱自动注册、发信息、自动灌水、自动登录等功能。目前,各种类型网
站系统都利用验证码阻止网络机器人入侵,从而验证码识别技术成为研究热点。
通过批量下载大量验证码分析,验证码采用了空心化、扭曲、翻转、干扰线等手段防止程序的自动识别,同时干扰线颜与验证码颜相近,无法有效去除。验证码如图2所示。
验证码采用4位随机字符,字符采用数字和大写字母组成,
字符位置固定。可
图1 数据采集程序功能流程
通过云除噪音、灰度化、二值化后,对字符进行切割,切割后保存到对应文件夹内,如图3所示。
由于噪音线条和验证码字符的颜相近,去噪难度较大,只能去除黑点和颜较深的部分。在人工标注好切割后的验证码后,利用svm[2]、pca[3]训练数据,生成del及del 文件,最后测试识别成功率在70%左右。
2.登录获取会话令牌
Python中cookielib[4]
库(python3中为http. cookiejar)为存储和管理cookie提供客户端支持,该模块主要功能是提供可存储cookie的对象,使用此模块捕获cookie并在后续连接请求时重新发送,还可以用来处理包含cookie 数据的文件。这个模块主要提供了这几个对象:CookieJar,FileCookieJar,MozillaCookieJar,LWPCook ieJar,此处主要用到LWPCookieJar。
def login():
loginurl1 = " www.fjhh/workspace/ sys.LoginCtl.depLogin.do"
loginurl2 = "
www.fjhh/workspace/
sys.LoginCtl.login.do"
c j=c o o k i e l i b.
payphoneLWPCookieJar()
cookie_support = urll
ib2.HTTPCookieProcessor(
cj)
o p e n e r=u r l l i b2.
b u i l d_o p e n e r(
c o o k i e_
s u p p o r t,u r l l i b2.
HTTPHandler)
urllib2.install_
opener(opener)
img_req=urllib2.
Request("www.
f j h h.c o m/w o r k s p a c e
/
图2 验证码形态
Captcha.jpg")
img_response=opener.
open(img_req)
try:
o u t=o p e n('c a p t c h a.
jpg','wb')
#print img_response.
read()
o u t.w r i t e(i m g_
out.flush()
out.close()
女孩的qq名
p r i n t
'------------V e r i
fy------------'
#p r i n t'G e t c o d e
success'
except IOError:
print 'file wrong'
#input code
img_code=captcha("cap
tcha.jpg")
print img_code
print 'your code is
%s'%img_code
for index,item in
enumerate(cj):
tmp = repile('Co
o k i e(.*)f o r').
findall(str(item))
cookievalue = tmp[0]图3 切割验证码
h e a d e r s={'U s e r-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1',
'Referer' : '******'} postData1 = {
'userType' : 'intern
al',
'departmentname' : 'fjhh',
'p a s s w o r d': 'password-fjhh',
'captcha_key' : img_ code
}
postData1 = urllib. urlencode(postData1)
request = urllib2. R e q u e s t(l o g i n u r l1, postData1, headers)
l o g i n_ r e s p o n s e=o p e n e r. open(request)
login_response=login_ ad()
#如果验证码出错,则
if("Verfication code i s w r o n g"i n l o g i n_ response):
print "Fail,Login1 Again"
login()
p r i n t'l o g i n1
success'
运行后如图4所示。
特定内容的抓取
为了快速准确匹配到特
定内容,需要用到正则表达
式[5]来实现此功能。正则
表达式使用单个字符串来描
述、匹配一系列符合某个句
法规则的字符串。在很多
文本编辑器里,正则表达式
通常被用来检索、替换那些
符合某个模式的文本。在
Python中利用re模块来实
现正则匹配。在匹配特定内
容前,在header头的User-
Agent参数填写IE客户端参
数,
“伪装”成正常用户的访
问。
def saveHttpPage(url,
cookie,taskID,type_ccc):
url = "www.
fjhh"+url
request = urllib2.
Request(url)
r e q u e s t.a d d_
h e a d e r('U s e r-
Agent', 'Mozilla/4.0
(compatible; MSIE 8.0;
Windows NT 6.1; WOW64;
T r i d e n t/4.0;S L C C2;
.NET CLR 2.0.50727; .NET
C L R 3.5.30729;.N E T
CLR 3.0.30729; Media
Center PC 6.0; .NET4.0C;
.NET4.0E)')
r e q u e s t.a d d_
微距闪光灯h e a d e r('R e f e r e r',
'h t t p s://w w w.f j h h.
c o m/w o r k s p a c e/t e s t s.
L a b S u b T a s k s C t l.
listLabTasks.do')
r e q u e s t.a d d_
header('Language', 'zh-
CN,zh;q=0.8')
r e q u e s t.a d d_
header('Cookie', cookie)
response = urllib2.
urlopen(request)
r e s p o n s e_b o d y=
p e o p l e_w e i t u o
=r e.c o m p i l e('<t d
width="">(.*)</td>').
findall(response_body)
霍建华叶璇
f i l e n a m e=
repile('appNumber"
图4 程序运行效果图
v a l u e ="(.*)">').findall(response_body)
applyID = filename[0].decode('utf8')
a p p l y T i m e _t m p = r e .c o m p i l e ('<t d class="15%">20(.*)<').findall(response_body)
applyTime ="20"+apply Time_tmp[0].decode('utf 8')
productSortCode_tmp = repile('productSortC
ode" value="(.*)">').findall(response_body)
p r o d u c t S o r t C o d e =productSortCode_tmp[0].decode('utf8')
存储及传送技术
获得特定数据后,先保存为html 文件,再调用pywin32库中的win32com.client 将html 转换为mht 格式,方便IE 浏览器用户的访问。
1.将html 文件转化为mht 格式
def html2mht(filenam e):
filename2 = os.path.join(os.p
ath.abspath('.'),file name)
try:
iMsg = Dispatch('CDO.Message')
iMsg.CreateMHTMLBody ('file://
/' + filename2)i M s g.G e t S t r e a m ().S a v e T o F i l e (o s.p a t h.s p l i t e x t (f i l e n a m e 2)[0]+'.mht')
#mht 文件生成后,删除html 文件,此处需优化
except Exception,e:print filename+"is error"
2.利用Samba 传输文件保存好文件后,利用Samba 协议将文件传输至文件共享服务器。
conn = SMBConnection(userID, password, client_machine_name, server_n a m e , d o m a i n =d o m a i n _name, use_ntlm_v2=True,
is_direct_tcp=True)
s h a r e s = c o n n .listShares()
remotefilelist = []for share in shares:i f n o t s h a r e .isSpecial and share.name not in ['NETLOGON', 'SYSVOL']:
sharedfiles = conn.l i s t P a t h (s h a r e.n a m e , '/')
for sharedfile in sharedfiles:
#
p r i n t (s h a r e d f i l e .filename)
超速标准r e m o t e f i l e l i s t .a p p e n d (s h a r e d f i l e.filename)
num = 0
def copy2Remote(file name,):
try:
file = open(filename ,'rb')
c
o
n
n
.
s t o r e F i l e ('s h a r e ', filename, file) #share mean share name
f i l e .【下转第80页】
Docker 布署SQL Server 数据库
■ 河北科技师范学院 赵学作
一般来讲,SQL Server 运行在Windows 平台上,而利用Docker 可
以在Linux 系统中搭建SQL Server 数据库环境,下面以Centos 7为例说明搭建过程。
安装Docker
1.把yum 包更新到最新yum update
2.安装需要的软件包, yum-util 提供yum-config-manager 功能,另外两个是devicemapper 驱动依赖的。
yum install -y yum-
编者按:Docker 是一个基于Linux 64bit 的开源的应用容器引擎,开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux 机器上来实现虚拟化。Docker 不依赖于任何语言、框架或包括系统。
u t i l s d e v i c e -m a p p e r -persistent-data lvm2
3.设置yum 源
yum-config-manager --a d d -r e p o h t t p s ://
d o w n l o a d.d o c k
e r.c o m /linux/po
4.可以查看所有仓库中所有docker 版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort
-r
5.
安
装Docker,命
令:yum
i n s t a l l
docker-ce-版本号,我选的是17.,如下
yum install docker-ce-17.
6.启动Docker,命令:systemctl start docker,然后加入开机启动
s y s t e m c t l s t a r t docker
s y s t e m c t l e n a b l e docker
7.验证安装是否成功有client 和service 两
close()global num
num = num + 1
print str(num) + " " + filename + " upload"
except: pass
def getFileName(path ):
f_list = os.listdir(p ath)
for i in f_list:# os.path.splitext():分离文件名与扩展名
if os.path.splitext(i)[1] == '.mht':
if i.decode("gbk") in remotefilelist:
p r i n t "E R R O R ! %s
already exists."%i
else:
copy2Remote(i.decode("g bk"))
getFileName(".")print str(num) + " files had upload!"
conn.close() N
【上接第79页】
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论