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

之前我们写过一个 模拟登录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!


阅读更多
换一批

没有更多推荐了,返回首页