【详解】Python模拟登录b站并抓取信息【教程续】
2015-12-16 16:50
1221 查看
之前我们写过一个 模拟登录b站 的脚本教程,但写到登录这一步时,碰到了验证码的问题,一直没解决,遂不了了之。
这几天又回头研究了验证码问题,并成功解决。
这一下午也成功实现了模拟登录b站!所以我们接着写下去。
首先说一下大致思路,模拟登录网站与以前一样,提交postdata。
验证码问题,我们获取验证码图片到本地,然后人工输入验证码,实现登录。
登录成功与否的判定条件是,访问个人中心的网址,看返回的网页代码。
如果登录成功,会返回个人中心的代码。如果失败,会返回需要登录的提示代码。
接下来对这个过程进行详细的阐述!
照旧,先贴出全部代码如下:
我们在主函数中可以看到整个代码逻辑:
先处理cookie,
然后进入登录页面,
拿到验证码,
然后进行登录操作,即,自行输入用户名、密码、验证码。
最后就能输出个人的关注动态中的视频信息了。
其实整个过程,与最简单的不需要输入验证码的模拟登录,的区别就是:
需要拿到验证码图片,人工输入验证码。
然后才能实现登录操作,仅此而已。
我们会最基本的模拟登录,了解最简单的验证码分析原理,就能够达到 模拟登录需要验证码的网站 的目的了。
接下来的抓取关注动态的数据,也不过就是找到了我们所需要的数据的链接。
然后发现这个链接返回的是JSON数据。
访问该链接,解析返回的JSON数据,就能够拿到我们想要的那些数据了。
【错误记录】
这里提一下犯的极其傻逼不可原谅的错误。
之所以花了一段时间才做完这个脚本,也是因为在这个问题上的粗心大意废了不少时间。
即,之前,先获取了验证码,然后再进入的登录页面!!
提示验证码不对是自然的。一度以为是cookie的问题,还把问题想得很复杂。
不过也多亏这个错误,知道了cookie的自动处理是很简单的事情!只需要在脚本开始的时候用
这几行代码声明一下,就可以不用担心了。
接下来,进入登录页面,然后获取验证码。才是对的!
OVER!
这几天又回头研究了验证码问题,并成功解决。
这一下午也成功实现了模拟登录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!
相关文章推荐
- Python中初始化的问题以及注释问题
- 史上最直白的LDA教程之二
- python注意事项1
- Python的流程控制
- python os.system os.popen 区别
- python3下urlopen解析中文url编码错误
- python之脚本编码
- python学习 字符串
- Python文件夹与文件的操作
- Json概述以及python对json的相关操作
- 零基础入门学习Python视频(全42集)
- 51nod 1452:加括号 python eval
- 备忘录:python 3在class中使用yield
- SubLime Text3 Python不能输出中文的解决办法
- 零基础入门学习Python(12):lambda表达式、filter()和map()
- Python基础教程 第4章: 字典 学习笔记
- python操作MySQL数据库
- Python 学习
- python and ice
- python批量GBK转UTF-8