python模拟登陆并爬取数据

引言

这几天玩这个以太妖怪玩得上瘾,先是爬神兽数据,看看神兽图片,看看神兽归属,心里还是挺骄傲的。然后发现查看神兽不需要登陆就能查看,静态网页;但是妖怪信息就必须登陆,动态。所以这几天,工作时间赶工赶点,试着用先前的思路尝试爬取动态网页,抱着试试看的态度结果没想到一上午成功解决问题。特此公告。喜大普奔。

如何查看请求发送地址

打开登陆页面,然后按F12查看控制台,选择Network选项,这时在网页点击登陆,查看控制台变化,这时候应该name下会新增几条记录,通过查看这几个name记录查看登陆和验证码的请求地址。具体可查看下图:
F12控制台页面信息

源码共享

以下是源码信息,和之前那篇爬取神兽的post不一样的部分主要在动态网页模拟登陆。要用代码将登陆请求模拟发送出去。更详细可以通过代码理解。。
这次网站内容没有屏蔽,如感兴趣可以尝试。
技术是无罪的,本人单纯性地分享源码,如果对网站造成任何损失,本人概不负责。

# encoding: utf-8
import urllib # 导入urllib模块
import urllib2
import re # 导入re模块
import cookielib # cookielib 模块
#### add opener and headers
cj=cookielib.CookieJar()
headler=urllib2.HTTPCookieProcessor(cj)
opener=urllib2.build_opener(headler)
'''--------------------------------------------------
模拟登录
--------------------------------------------------'''
def login():
login_url = 'https://etmon.cc/loginApi'
validation_code_url = 'https://etmon.cc/kaptcha.jpg' # 通过f12的network 调试查看
headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
print "---------登录中-------------------"
print '输入登陆邮箱:'
email = raw_input()
print "输入密码:"
password = raw_input()
# 请求验证码网页内容,保存登陆页面的验证码图片到根目录,查看并输入,然后回车登陆进入。
t=urllib2.Request(validation_code_url, headers=headers)
yzm=opener.open(t)
yzmgif=open("validation_code.jpg","w")
yzmgif.write(yzm.read())
yzmgif.close()
print "到当前目录下查看验证码validation_code.jpg并输入:"
validation_code = raw_input()
values={"email":email, "password":password, "verificationCode":validation_code}
request=urllib2.Request(login_url,urllib.urlencode(values),headers = headers)
f=opener.open(request)
print "---------登录成功!----------------"
'''---------------------------------------------------
传入i参数 用于查看第i只妖怪的需要的数据
---------------------------------------------------'''
def check_monster_id(i):
headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
link = 'https://etmon.cc/monster/' + str(i)
request = urllib2.Request(link,headers=headers)
page = opener.open(request)
content = page.read()
re_span = re.compile('<span>(.*)</span>') # 正则<span></span>中间内容 如owner,monster name,state, time etc.
re_div = re.compile('<div class="level">(.*)</div>') # 正则div中的妖怪等级信息
# 以下为正则到要求数据后并对数据列表做一定的清洗 选择
ele_span = re.findall(re_span,content)
ele_div = re.findall(re_div, content)
ele_span[0] = ele_div[0]
## 将选择后的数据写入文本,'a'为文本追加模式
filename = open('/home/yann/PC/data.txt','a')
if ele_span[5][-3:] != 'eth':
for i in ele_span[:6]:
filename.write(i+' ')
filename.write('\n')
filename.close()
###################
login()
for i in range(1,2000):
check_monster_id(i)
print 'monster_id: ', i, '---complete!'

结语

  • 模拟登陆思路和之前南通大学一键测评脚本代码思路一致,反而更简单了,毕竟只是爬数据,没有模拟更多请求,如购买 出售等信息。。毕竟随随便便就是0.02个eth的,调试不起啊,万一炸天了 。。。
  • 好好学习,用技术创造自己的精神世界,做更好的自己!

参考链接

无。