美文网首页Python程序员Python教程
requests+beautifulsoup模拟登陆京东

requests+beautifulsoup模拟登陆京东

作者: 芝士改变力量 | 来源:发表于2016-04-28 18:45 被阅读4040次

最近需要实现获取个人京东订单信息的功能,利用了requests+beautifulsoup来实现。
requests是python的第三方库,相比之前常用的python标准库中的urllib2,requests简直不要好用太多,具体实现思路是,首先使用firefox+firebug找到京东登陆所需要的信息,利用requests的get获取需要模拟登陆的信息,post之后获取cookie,然后带着cookie访问相应订单的网页就可以得到订单信息了。
打开京东登陆的网页,使用账户登陆京东,在firebug上查看传递的参数

loginname是登陆的用户名,loginpwd和nloginpwd都是登陆的密码。以machine开头的三个参数传递参数为空,authcode是验证码,如果京东检测到你登陆状态有异常就会提示输入验证码。
经过测试,我们需要获取的参数有uuid、-t、和eAHDKkiNwP三个参数
回到京东登陆界面寻找这三个参数,在登陆界面的源代码中可以看到有个id名称为formlogin的form标签

正好全部包含了登陆需要传递的参数,利用Beautifulsoup将对于name的value提取出来,放在构造post信息的字典中,将构造好的字典通过requests的post方法获取到登陆的cookie。这样,得到订单信息我们已经完成了一大半了。
下面是具体实现的部分源码

import requests
from bs4 import BeautifulSoup
header= {
'Host':'order.jd.com',
'Upgrade-Insecure-Requests':'1',
'Connection':'keep-alive',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2700.0 Safari/537.36',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding':'gzip, deflate, sdch',
'Accept-Language':'zh-CN,zh;q=0.8',
'Cache-Control':'max-age=0'
}

导入相应的包之后,需要构造header,网站服务器通过host来确定访问的网页,User-Agent是用户使用浏览器版本,系统的标签。许多网站会检查header中的host和User-Agent信息是否正确合理,不会处理未带正确header的请求,header可以在firebug上查看,这里我直接粘贴firebug上的,如果是大型的爬虫可以构造一个header池,每隔一段时间变更header中的User-Agent,简单的爬虫就不需要做的这么麻烦啦。

sessions = requests.session()
login_page=sessions.get('https://passport.jd.com/new/login.aspx',headers = header)
login_soup = BeautifulSoup(login_page.text,'lxml')
login_postinfo = login_soup.find_all('form',attrs = {'id' : 'formlogin'})[0].find_all('input')

先构造一个sessions来帮助我们处理获取到的cookie,session可以自动处理cookie字符。
获取到登陆界面的text之后,先转换为beautiful可以处理的格式,login_postinfo为上文提到的formlogin下的所有input标签信息

uuid = login_soup.find_all('input',attrs = {'id' : 'uuid'})[0]['value']
_t = login_soup.find_all('input',attrs = {'name' : '_t'})[0]['value']

利用beautifulsoup获取到uuid和_t

for input_info in login_postinfo:    
    if len(input_info['value']) == 5:            
         str1 = input_info['name']            
         str2 = input_info['value']

在提取最后一个关键key时和之前的不一样,它的key名是input标签中的name,value是标签中的value,所以我们无法按照name或id来提取,它们是一直在变化的,但是可以观察到一个规律,value值都是5个英文字母组成的,而input标签其他的value要不为空,要不有下划线或是一串很长的字符串,所以可以根据value的字符长度来定位到我们所需要的input

post_info = {    
'uuid':uuid,    
'loginname':'XXXXX',    
'loginpwd':'XXXX',    
'machineCpu':'',    
'machineDisk':'',    
'machineNet':'',    
'nloginpwd':'XXXX',    
 str1:str2,   
'_t':_t,    
'authcode':''}
content = sessions.post('http://passport.jd.com/uc/loginService',data=post_info,headers = header)

构造post信息的字典,通过sessions发送带着post字典的请求,可以得到success的信息

Paste_Image.png

然后我们就可以访问相应的界面获取想要的信息了

相关文章

网友评论

  • 5c39c691b65a:源码在哪里呢。
    5c39c691b65a:@三人游 没有呢。。只能先放弃了
    60504a7e8ae5:你好,你解决密码加密的问题了吗?
  • b584ccf31c50:运行报错呢?
    Traceback (most recent call last): File "E:/PycharmProjects/XXX_portTest/JD_Login.py", line 16, in <module> login_page = sessions.get('https://passport.jd.com/new/login.aspx', headers=header) File "E:\Python27\lib\site-packages\requests\sessions.py", line 521, in get return self.request('GET', url, **kwargs) File "E:\Python27\lib\site-packages\requests\sessions.py", line 508, in request resp = self.send(prep, **send_kwargs)
    File "。。:\Python27\lib\site-packages\requests\sessions.py", line 640, in send history = [resp for resp in gen] if allow_redirects else [] File "E:\Python27\lib\site-packages\requests\sessions.py", line 140, in resolve_redirects raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) requests.exceptions.TooManyRedirects: Exceeded 30 redirects. Process finished with exit code 1
  • 酸豇豆儿:作者你写的不完整,loginpwd的密码是做了加密的,你这块就跳过了。
    d4fe8037293d:@酸豇豆儿 怎么解决的
    酸豇豆儿:@世上无难事1995 我已经解决了这个问题了
    6ed9c88e01e1:你看下作者写着文章的日期啊,京东可能改版了
  • f559ae8531f6:'Host':'order.jd.com', 貌似有跳转问题.
    输入验证码怎么解决?
    芝士改变力量: @HelloChao 跳转问题具体指的是什么?验证码如果是个人项目练手的话可以把验证码下载到本机,自己手动输入。如果用作是大规模的生产的话可以用一些机器学习算法建模做验证码识别或者寻求打码平台

本文标题:requests+beautifulsoup模拟登陆京东

本文链接:https://www.haomeiwen.com/subject/byshrttx.html