写代码的也是有女朋友滴。。因为女朋友也是写代码滴。。
言归正转。
1.最近一直有时间就在看爬虫这方面的,我首先是参考了很多前人的思路,当时他们都说要模拟登录,没有说为什么,然后我当时看了媳妇微博的首页,当时我没有登录,浏览器是可以直接看的,然后 心想应该是可以的呀,天真的我,去尝试了一下,先用的是node,
如果打出来 statusCode 会发现是302
主页的地址,后面更详细的参数也都没填
weibo.com/u/+uid
2.当时我就感慨前辈毕竟是前辈,然后根据前辈的总结,找到了模拟登陆的办法用的是 以及微博模拟登录的加密方式,这些都是前辈的代码。
class Userlogin:
def userlogin(self, username,password,pagecount):
url_prelogin='https://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=ODA3NzIyODU1JTQwcXEuY29t&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_=1506407183548'
url_login='https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)'
session = requests.Session()
resp = session.get(url_prelogin)
json_data=re.findall(r'(?<=\().*(?=\))',resp.text)[0]
data = json.loads(json_data)
print('data',data)
servertime=data['servertime']
nonce = data['nonce']
pubkey = data['pubkey']
rsakv = data['rsakv']
print('username',username)
print(base64.b64encode(username.encode(encoding="utf-8")))
su = base64.b64encode(username.encode(encoding="utf-8"))
rsaPublickey= int(pubkey,16)
key = rsa.PublicKey(rsaPublickey,65537)
message = str(servertime)+'\t'+str(nonce)+'\n'+str(password)
sp = binascii.b2a_hex(rsa.encrypt(message.encode(encoding='utf_8'),key))
postdata = {
'entry': 'weibo',
'gateway': '1',
'from': '',
'savestate': '7',
'userticket': '1',
'ssosimplelogin': '1',
'vsnf': '1',
'vsnval': '',
'su': su,
'service': 'miniblog',
'servertime': servertime,
'nonce': nonce,
'pwencode': 'rsa2',
'sp': sp,
'encoding': 'UTF-8',
'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype': 'META',
'rsakv' : rsakv,
}
resp = session.post(url_login,data=postdata)
3.前辈的代码我不用多解释,怎么找到是md5 和rsa 加密的 网上前辈讲的很仔细,这段代码最后发送了post请求 .我得到的结果是这样的
<html>
<head>
<title>新浪通行证</title>
<meta content="0; url='https://login.sina.com.cn/crossdomain2.php?action=login&entry=weibo&r=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callba
ck%3Dparent.sinaSSOController.feedBackUrlCallBack%26ssosavestate%3D1538102016%26ticket%3DST-MjI3MjEzMDUwMQ%3D%3D-1506566016-gz-B5BC6F13782ED5CED17A4A8D208944FF-1%26r
etcode%3D0'" http-equiv="refresh"/>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
</head>
<body alink="#ff0000" bgcolor="#ffffff" link="#0000cc" text="#000000" vlink="#551a8b">
<script language="javascript" type="text/javascript">
location.replace("https://login.sina.com.cn/crossdomain2.php?action=login&entry=weibo&r=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26cal
lback%3Dparent.sinaSSOController.feedBackUrlCallBack%26ssosavestate%3D1538102016%26ticket%3DST-MjI3MjEzMDUwMQ%3D%3D-1506566016-gz-B5BC6F13782ED5CED17A4A8D208944FF-1%
26retcode%3D0");
</script>
</body>
</html>
4.然后这里应该就是正在登录界面,然后就是意味着 页面还会跳转, 然后就提取出来location.replace,再次请求后,发现会发现又一次得到一个需要跳转的页面
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<title>新浪通行证</title>
<script charset="utf-8" src="https://i.sso.sina.com.cn/js/ssologin.js"></script>
</head>
<body>
正在登录 ...
<script>
try{sinaSSOController.setCrossDomainUrlList({"retcode":0,"arrURL":["https:\/\/passport.weibo.com\/wbsso\/login?ticket=ST-MjI3MjEzMDUwMQ%3D%3D-1506566231-gz-6CAAFA60D
3C6956F02A2608B543823AC-1&ssosavestate=1538102231","https:\/\/passport.97973.com\/sso\/crossdomain?action=login&savestate=1538102231","https:\/\/passport.weibo.cn\/s
so\/crossdomain?action=login&savestate=1"]});}
catch(e){
var msg = e.message;
var img = new Image();
var type = 1;
img.src = 'https://login.sina.com.cn/sso/debuglog?msg=' + msg +'&type=' + type;
}try{sinaSSOController.crossDomainAction('login',function(){location.replace('https://login.sina.com.cn/');});}
catch(e){
var msg = e.message;
var img = new Image();
var type = 2;
img.src = 'https://login.sina.com.cn/sso/debuglog?msg=' + msg +'&type=' + type;
}
</script>
</body>
</html>
5.然后我尝试复制出arrURL里面的地址,然后放入已经有登录cookie的浏览器打开,发现 里面可以得到我自己的uid,虽然我知道自己的uid,但是这一步请求还是必须的,如果不请求,我依然不能成功拿到媳妇的微博, 这个请求发出去后,就可以登录了
add_url= re.findall(r'(?<=arrURL\"\:\[\").*?(?=\")',str(soup_1))
add_url=str(add_url[0]).replace(r'\/','/')
respo = session.get(add_url)
# uid = re.findall('"uniqueid":"(\d+)",',respo.text)[0]
url = "http://weibo.com/u/这里是uid?profile_ftype=1&is_ori=1#_0"
respo = session.get(url)
拿到东西后,我发现,前辈说的真对,拿到简单,但是处理起来还真是蛋疼。因为得到的页面经过新浪处理,不是单纯的dom,试试就知道,,还有问题,随时联系我。。。。对了,下个问题是如何控制翻页,网上的思路是有插件可以控制网页滚动的。。 我也尝试看了一下,微博的加载更多,点击加载更多发送了几个请求,但是请求的结果没有需要加载的数据,,,看来还是修行不够,得再向前辈请教