python 自动登录网站_python实现带验证码网站的自动登陆实现代码

早听说用python做网络爬虫非常方便,正好这几天单位也有这样的需求,需要登陆XX网站下载部分文档,于是自己亲身试验了一番,效果还不错。

本例所登录的某网站需要提供用户名,密码和验证码,在此使用了python的urllib2直接登录网站并处理网站的Cookie。

Cookie的工作原理:

Cookie由服务端生成,然后发送给浏览器,浏览器会将Cookie保存在某个目录下的文本文件中。在下次请求同一网站时,会发送该Cookie给服务器,这样服务器就知道该用户是否合法以及是否需要重新登录。

Python提供了基本的cookielib库,在首次访问某页面时,cookie便会自动保存下来,之后访问其它页面便都会带有正常登录的Cookie了。

原理:

(1)激活cookie功能

(2)反“反盗链”,伪装成浏览器访问

(3)访问验证码链接,并将验证码图片下载到本地

(4)验证码的识别方案网上较多,python也有自己的图像处理库,此例调用了火车头采集器的OCR识别接口。

(5)表单的处理,可用fiddler等抓包工具获取需要提交的参数

(6)生成需要提交的数据,生成http请求并发送

(7)根据返回的js页面判断是否登陆成功

(8)登陆成功后下载其它页面

此例中使用多个账号轮询登陆,每个账号下载3个页面。

下载网址因为某些问题,就不透露了。

以下是部分代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

#!usr/bin/env python

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

import os

import urllib2

import urllib

import cookielib

import xml.etree.ElementTree as ET

#-----------------------------------------------------------------------------

# Login in www.***.com.cn

def ChinaBiddingLogin(url, username, password):

# Enable cookie support for urllib2

cookiejar=cookielib.CookieJar()

urlopener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))

urllib2.install_opener(urlopener)

urlopener.addheaders.append(('Referer','http://www.chinabidding.com.cn/zbw/login/login.jsp'))

urlopener.addheaders.append(('Accept-Language','zh-CN'))

urlopener.addheaders.append(('Host','www.chinabidding.com.cn'))

urlopener.addheaders.append(('User-Agent','Mozilla/5.0 (compatible; MISE 9.0; Windows NT 6.1); Trident/5.0'))

urlopener.addheaders.append(('Connection','Keep-Alive'))

print 'XXX Login......'

imgurl=r'http://www.*****.com.cn/zbw/login/image.jsp'

DownloadFile(imgurl, urlopener)

authcode=raw_input('Please enter the authcode:')

#authcode=VerifyingCodeRecognization(r"http://192.168.0.106/images/code.jpg")

# Send login/password to the site and get the session cookie

values={'login_id':username,'opl':'op_login','login_passwd':password,'login_check':authcode}

urlcontent=urlopener.open(urllib2.Request(url, urllib.urlencode(values)))

page=urlcontent.read(500000)

# Make sure we are logged in, check the returned page content

if page.find('login.jsp')!=-1:

print 'Login failed with username=%s, password=%s and authcode=%s' \

% (username, password, authcode)

return False

else:

print 'Login succeeded!'

return True

#-----------------------------------------------------------------------------

# Download from fileUrl then save to fileToSave

# Note: the fileUrl must be a valid file

def DownloadFile(fileUrl, urlopener):

isDownOk=False

try:

if fileUrl:

outfile=open(r'/var/www/images/code.jpg','w')

outfile.write(urlopener.open(urllib2.Request(fileUrl)).read())

outfile.close()

isDownOK=True

else:

print 'ERROR: fileUrl is NULL!'

except:

isDownOK=False

return isDownOK

#------------------------------------------------------------------------------

# Verifying code recoginization

def VerifyingCodeRecognization(imgurl):

url=r'http://192.168.0.119:800/api?'

user='admin'

pwd='admin'

model='ocr'

ocrfile='cbi'

values={'user':user,'pwd':pwd,'model':model,'ocrfile':ocrfile,'imgurl':imgurl}

data=urllib.urlencode(values)

try:

url+=data

urlcontent=urllib2.urlopen(url)

except IOError:

print '***ERROR: invalid URL (%s)' % url

page=urlcontent.read(500000)

# Parse the xml data and get the verifying code

root=ET.fromstring(page)

node_find=root.find('AddField')

authcode=node_find.attrib['data']

return authcode

#------------------------------------------------------------------------------

# Read users from configure file

def ReadUsersFromFile(filename):

users={}

for eachLinein open(filename,'r'):

info=[wfor win eachLine.strip().split()]

if len(info)==2:

users[info[0]]=info[1]

return users

#------------------------------------------------------------------------------

def main():

login_page=r'http://www.***.com.cnlogin/login.jsp'

download_page=r'http://www.***.com.cn***/***?record_id='

start_id=8593330

end_id=8595000

now_id=start_id

Users=ReadUsersFromFile('users.conf')

while True:

for keyin Users:

if ChinaBiddingLogin(login_page, key, Users[key]):

for iin range(3):

pageUrl=download_page+'%d' % now_id

urlcontent=urllib2.urlopen(pageUrl)

filepath='./download/%s.html' % now_id

f=open(filepath,'w')

f.write(urlcontent.read(500000))

f.close()

now_id+=1

else:

continue

#------------------------------------------------------------------------------

if __name__=='__main__':

main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值