美丽的神话,细菌感染,阿拉善-有爱俱乐部,让爱心充满这个世界

admin 3周前 ( 06-01 01:58 ) 0条评论
摘要: Python爬虫:使用Charles和requests模拟微博登录...

咱们经过模仿微博登录这个比方来看看怎样运用Charles剖析网站加载流程,顺便把微博模仿登录的Python代码也给完成了。

Charles是一个网络抓包东西,跟Fiddler相同,你哪个用的随手就用那个。

抓包是写爬虫的必备技术,娴熟的运用抓包东西能使剖析功率极大进步,当然这进程中也少了剖析逻辑。

1. 用Charl张悦小甜甜es记载整个登录进程

首要,咱们运转Charles并开端记载。然后翻开C移动模架法施工动画hrome浏览器,挑选运用Charles署理,翻开微博主页 ,呈现登录页面(假如美丽的神话,细菌感染,阿拉善-有爱沙龙,让爱心充溢这个国际之前登录过微博,要先退出登录)。输入用户名和暗码进行登录,登录成功后就能够中止Charles的记载。这样咱们就用Charles完好记载下了微博的登录进程。见图:

咱们把整个登录进程写出一个Python类,它的界说为:


class W谭启贤eiboLogin:

user_agent = (

'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) '

'Chrome/20.0.1132.57 Safari/536.11'

)

def __init__(self, username, passw美丽的神话,细菌感染,阿拉善-有爱沙龙,让爱心充溢这个国际ord, cookies_tosave='weibo.cookies'):

self.weibo_user = username

self.weibo_password = password

self.cookies_tosave = cookies_tosave

self.session = requests.session()

self.session.headers['User-Agent'] = self.user_agent

接下来咱们剖析登录进程,并逐个完成这个类的各个办法。

2. 剖析登录进程

把Charles的主窗口切换到“Sequence”标签页,

咱们能够按加载时刻次序调查Charles记载的微博登录进程,咱们发现第一个可疑的恳求的Host是:

  • login.sina.com.cn

点击该条记载,下方呈现该条恳求的完好内容,它的途径是:


GET /sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.19)&_=1542456042531 HTTP/1.1

这个GET恳求的参数_=1542456042531看起来是个时刻戳,这个在ssologin.js(看后边是怎样找到的)界说为preloginTimeStart,能够用int(time.time()*1000)得到。

从prelogin.php这个姓名看,它是一个预登陆,即在你输入用户名和暗码前,它先从服务器拿点东西过来:

用Py安进秋thon完成这个prelogin:


def prelogin(self):

preloginTimeStart = int(time.time()*1000)

url = ('https://login.sina.com.cn/sso/prelogin.php?'

'entry=weibo&callback=sinaSSOController.preloginCallBack&'

'su=&rsakt=mod&clien问酒谢花t=ssologin.js(v1.4.19)&'

'_=%s') % preloginTimeStart

resp 踏雪寻踪= self.session.g99核工厂et(url)

pre_login_str = re.match(r'[^{]+({.+?})', resp.text).group(1)

pre_login = json.loads(pre_login_str)

pre_login['preloginTimeStart'] = preloginTimeStart

print ('pre_login 1:', pre_login)

return pre_login

这些预先爱的被告国语版20集拿过来的东西有什么用呢?目前为止还不知道,持续往下看。

弥补:关于认证码

昨日开端写这篇教程的时分,没有碰到验证码。今日就碰到验证码跳出来了,真是皆大欢喜,能够把这部分弥补上了。

比照昨日的prelogin的URL参数不能发现,今日美丽的神话,细菌感染,阿拉善-有爱沙龙,让爱心充溢这个国际的多了两个参数:

  • su=xxxxx 便是加密的那个(实为base64编码)用户美丽的神话,细菌感染,阿拉善-有爱沙龙,让爱心充溢这个国际名
  • checkpin=1 通知服务器要查看验证码(我去,自己写爬虫肯定不会这么干)

带着这两个参数恳求服务器,回来来的也会多了showpin的值:

已然要显现pin(验证码),就要下载验证码,它的地址是:

https://login.sina.com.cn/cgi/pin.php?r=2855501&s=0&p=aliyun-a34a347956ab8e98d6eb1a99dfddd83bc708

这个是怎样来的呢?直接按Ctrl+F 翻开“Text to Find”窗口查找“pin.php”:

这个Find窗口很有用,它让咱们能够在记载的一切恳求和呼应里边查找特定文本,而且它还支撑正则表达式、大小写灵敏、只找全词。只找全词,对查找su这样的短词很有协助,能够过滤许多包括它的词,比方super。

这儿要特别阐明一下,为什么只选在”Response Body”里边查找。

由于咱们是要找上面的URL是怎样生成的,咱们以为它是在某个js文件的某段代码完成的,所以它一定是在 Response Body 里边的,这样也能够过滤掉许多无关信滴滴赵培辰息。

经过上面的过滤,直接就定位了相关代码,双击进去,再略微一搜,就发现对应的代码了:


var pincodeUrl = "https://login.sina.com.cn/cgi/pin.php";

...

return pincodeUrl + "?r=" + Math.floor(Math.random() * 100000000) + "&s=" + size + (pcid.length > 0 ? "&p=" + pcid : "")

有了这个js,用Pytho推拉电磁铁n来完成就一挥而就了,小猿们能够自己试试看。

有了验证码的URL,咱们就用self.session下载它并保存为文件,在POST 一切login数据前,经过pin = input('>>please input pin:')来获取,加入到POST数据里边一同POST发送即可。

第二条可疑的恳求的Host跟第一条相同,途径是:

POST /sso/login.php?client=ssologin.js(v1.4.19) HTTP/1.1

这是一条POST,我来看看它POST的数据,挑选这条记载,点击“Contents”标签,再点击“Form”标签,能够看到它POST的数据:

这时分咱们能够把这写POST的参数和prelogin得到的联系起来了。

参数:su

这个看上去是“加密”的username,即用户名。那它是怎样加密的呢?浏览器运转的是JavaScript,所以咱们猜想是经过JS加密的,那么是哪段JS呢?看上面login.php途径里给了参数client=ssologin.js(v1.4.19),那咱们就去ssologin.js里边找找,挑选加载这美丽的神话,细菌感染,阿拉善-有爱沙龙,让爱心充溢这个国际个js文件的恳求,“Contents”标签下面就会显现JS代码,按Ctrl+F查找username:

公然在这儿,其实便是用base美丽的神话,细菌感染,阿拉善-有爱沙龙,让爱心充溢这个国际64编码了一下,算不上加密,所以咱们就有了取得su的办法:


def encrypt_user(self, username):

user = urllib.parse.quote(username)

su = base64.b64encode(user.encode())

return su

**参数:sp**

跟su相同的思路,仍是在ssologin.js里边查找password,咱们发现了加密password的算法:

所以有了取得sp的办法:


def encrypt_passwd(self, passwd, pubkey, servertime, nonce):

key = rsa.PublicKey(int(pubkey, 16), int('10001', 16))

message = str(servertime) + '\t' + str(nonce) + '\n' + str(passwd)

passwd = rsa.encrypt(message.encode('utf-8'), key)

return binascii.b2a_hex(passwd)

参数:prelt

已然ss厉南城温暖ologin.js便是管登录的,那咱们仍是在这儿找prelt,Ctrl+F 查找到

request.prelt = preloginTime;

本来prelt便是preloginTime的简称,那咱们再搜黄播盒子索preloginTime:

preloginTime = (new Date()).getTime() - preloginTimeStart - (parseInt(result.exectime, 10) || 0)

这儿的pre老公太小loginTimeStart便是恳求prelogin.php时的时刻戳,result.exectime便是prelogin恳求回来成果里边的exectime。

哈哈哈,又找到了prelt的算法,其实这个prelt便是从恳求开端到现在的时刻差,好像也没那么重要,随机一个就能够,不过仍是用Python完成一下:


def get_prelt(self, pre_login):

prelt = int(time.time() * 1000) - pre_login['preloginTimeStart'] - pre_login['exectime']

return prelt

目苏眠秦北蓦前,咱们现已取得了登录的重要参数,接下来再看看登录恳求的流程,在“Sequence”的 “Filter” 输入login,咱们能够看到过滤后的恳求,其间前三个便是登录的先后次序:

其具体流程便是:

  1. prelogin从服务器取得一些参数
  2. 把加密的用户名暗码等参数POST给https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)
  3. 第2步回来的是html代码,html代码里边重定向到别的的url (所以咱们代码里边也要完成这个重定向)
  4. 第3步回来的仍是html代码,里边经过JS先完成几个跨域设置,最终重定向到别的一个url(咱们也要完成这部分操作)

第4步回来的HTTP头里边重定向到别的的URL,request会跟从这个重定向,不必咱们完成。

用Python完成html代码里边的JS重定向的办法便是,用正则表达式提取出JS代码里边的重定向URL,然后用requests做GET恳求。

完好的登录流程的代码便是:


def logi小小杰鼠标连点器n(self):

# step-1. prelogin

男人吃太岁猝死pre_login = self.prelogin()

su = self.encrypt_user(self.weibo_user)

sp = self.encrypt_passwd(

self.美丽的神话,细菌感染,阿拉善-有爱沙龙,让爱心充溢这个国际weibo_password,

pre_login['pubkey'],

pre_login['servertime'],

pre_login['nonce']

)

prelt = self.get_prelt(pre_login)

data = {

'entry': 'weibo',

'gateway': 1,

'from': '',

'savestate': 7,

'qrcode_flag': 'false',

'userticket': 1,

'pagerefer': '',

'vsnf': 1,

'su': su,

'service': 'miniblog',

'servertime': pre_login['servertime'],

'nonce': pre_login['nonce'],

'vsnf': 1,

'pwencode': 'rsa2',

'sp': sp,

'rsakv' : pre_login['rsakv'],

'encoding': 'UTF-8',

'prelt': prelt,

'sr': "1280*800",

'url': 'http://weibo.com/a卢今锡jaxlogin.php?framelogin=1&callback=parent.'

'sinaSSOController.feedBackUrlCallBack',

'returntype': 'META'

}

# step-2 login POST

login_url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)'

resp = self.session.post(login_url, data=data)

print(resp.headers)

print(resp.content)

print('Step-2 response:', resp.text)

# step-3 follow redirect

redirect_url = re.findall(r'location\.replace\("(.*?)"', resp.text)[0]

print('Step-3 to redirect:', redirect_url)

resp = self.session.get(redirect_url)

print('Step-3 response:', resp.text)

# step-4 process step-3's response

arrURL = re.findall(r'"arrURL":(.*?)\}', resp.text)[0]

arrURL = json.loads(arrURL)

print('CrossDomainUrl:', arrURL)

for url 动漫小萝莉in arrURL:

print('set CrossDomainUrl:', url)

resp_cross = self.session.get(url)

print(resp_cross.text)

redirect_url = re.findall(r'location\.replace\(\'(.*?)\'', resp.text)[0]

print('Step-4 redirect_url:', redirect_url)

resp = self.session.get(redirect_url)

print(resp.te茅于轼事情始末xt)

with open(self.cookies_tosave, 'wb') as f:

pickle.dump(self.session.cookies, f)

return True

代码中打印了许多信息,便利咱们进程整个登录进程。

要测验咱们的完成就很简略了:


if __name__ == '__main__':

weibo_user = 'your-weibo-username'

weibo_password = 'your-weibo-password'

wb = WeiboLogin(weibo_user, weibo_password)

wb.login()

修改为你的微博账户和暗码就能够测验起来啦。

传闻你想学爬虫?重视可儿,每日都会共享一些学习小技巧。

学习材料收取处:重视、私信小编【材料】就能够收取啦。

文章版权及转载声明:

作者:admin本文地址:http://lovecub50.com/articles/1602.html发布于 3周前 ( 06-01 01:58 )
文章转载或复制请以超链接形式并注明出处有爱俱乐部,让爱心充满这个世界