您的位置:首页 > 编程语言 > Python开发

【详解】Python模拟登录b站并抓取信息【教程续】

2015-12-16 16:50 1221 查看
之前我们写过一个 模拟登录b站 的脚本教程,但写到登录这一步时,碰到了验证码的问题,一直没解决,遂不了了之。

这几天又回头研究了验证码问题,并成功解决。

这一下午也成功实现了模拟登录b站!所以我们接着写下去。

首先说一下大致思路,模拟登录网站与以前一样,提交postdata。

验证码问题,我们获取验证码图片到本地,然后人工输入验证码,实现登录。

登录成功与否的判定条件是,访问个人中心的网址,看返回的网页代码。

如果登录成功,会返回个人中心的代码。如果失败,会返回需要登录的提示代码。

接下来对这个过程进行详细的阐述!

照旧,先贴出全部代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

__author__ = "$Author: wangxin.xie$"
__version__ = "$Revision: 1.0 $"
__date__ = "$Date: 2015-12-16 15:03$"

###############################################################
# 功能:模拟登录b站成功后,获取个人关注动态的视频信息
###############################################################
import urllib
import urllib2
import datetime
import sys
import cookielib
import json
#####################全局变量###########################################

today = datetime.datetime.today()
todayStr = datetime.datetime.strftime(today, "%Y-%m-%d")
lastDayDate = today - datetime.timedelta(1)
lastDayDateStr = datetime.datetime.strftime(lastDayDate, "%Y-%m-%d")
picname="vdcode.png"
vdUrl="https://account.bilibili.com/captcha"
goLoginUrl="https://account.bilibili.com/login"
loginUrl="https://account.bilibili.com/login/dologin"
accountUrl="http://account.bilibili.cn/crossDomain?Expires=604800&DedeUserID=7385982&DedeUserID__ckMd5=258b1b7cb17d993c&SESSDATA=c4090d71,1450773446,55659e39&gourl=http://www.bilibili.com/"
mainUrl="http://www.bilibili.com/"
memberUrl="http://member.bilibili.com"
#################################################################

def getVdCode():
'''获取验证码图片'''
resp=urllib2.urlopen(vdUrl)
f = open(picname, 'wb')
f.write(resp.read())
f.close()
print('VdCodePic Saved!')

def dealCookie():
'''处理cookie'''
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)

def toLogin():
'''进入登录页面'''
resp = urllib2.urlopen(goLoginUrl)
html = resp.read().decode('utf-8').encode('gbk')

def login():
'''开始登录'''
username=raw_input("please input your username: ")
password=raw_input("please input your password: ")
vdcode = raw_input("please input your vdcode: ")
# 登录
postDict = {
'userid'      :username,
'pwd'      : password,
'vdcode'   : vdcode
}
postData = urllib.urlencode(postDict)
req = urllib2.Request(loginUrl, postData)

urllib2.urlopen(req)
urllib2.urlopen(memberUrl)
resp=urllib2.urlopen("http://member.bilibili.com/index.do?act=dynamic&page=1")

#开始解析Python数据
resp = resp.read().decode('utf-8').encode('gbk')
data = json.loads(resp)
print '------------------------------------------------'
for i in range(10):
print data[str(i)]['time_at']
print data[str(i)]['uname']+': '+data[str(i)]['title']
#因为播放数是数字,所以要转成字符串
print '播放数: '.decode('utf-8')+str(data[str(i)]['play'])
print '------------------------------------------------'

def main():
print "===%s start===%s"%(sys.argv[0], datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S"))
dealCookie()
toLogin()
getVdCode()
login()
print "===%s end===%s"%(sys.argv[0], datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S"))

#################################################################################
if __name__ == "__main__":
main()
 


我们在主函数中可以看到整个代码逻辑:

先处理cookie,

然后进入登录页面,

拿到验证码,

然后进行登录操作,即,自行输入用户名、密码、验证码。

最后就能输出个人的关注动态中的视频信息了。

其实整个过程,与最简单的不需要输入验证码的模拟登录,的区别就是:

需要拿到验证码图片,人工输入验证码。

然后才能实现登录操作,仅此而已。

我们会最基本的模拟登录,了解最简单的验证码分析原理,就能够达到   模拟登录需要验证码的网站   的目的了。

接下来的抓取关注动态的数据,也不过就是找到了我们所需要的数据的链接。

然后发现这个链接返回的是JSON数据。

访问该链接,解析返回的JSON数据,就能够拿到我们想要的那些数据了。

【错误记录】

这里提一下犯的极其傻逼不可原谅的错误。

之所以花了一段时间才做完这个脚本,也是因为在这个问题上的粗心大意废了不少时间。

即,之前,先获取了验证码,然后再进入的登录页面!!

getVdCode()
toLogin()

提示验证码不对是自然的。一度以为是cookie的问题,还把问题想得很复杂。

不过也多亏这个错误,知道了cookie的自动处理是很简单的事情!只需要在脚本开始的时候用

def dealCookie():
'''处理cookie'''
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)

这几行代码声明一下,就可以不用担心了。

接下来,进入登录页面,然后获取验证码。才是对的!

toLogin()
getVdCode()
login()

OVER!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: