我爱编程

模拟登录之京东网 - selenium

2017-12-31  本文已影响197人  __Cool

接上一篇模拟登录之拉勾网。

拉勾网对表单的密码字段进行了几轮 md5 加密,官网加密的思路比较清楚,顺藤摸瓜,就能找到拉勾网加密的方法,但是像淘宝、京东等大型商业网站,为了账户的安全,加密的逻辑复杂,可能加密规则每天都在改变,一些表单字段是很难成功获取到的,尽管如此,还是有工具能够解决这类网站 —— Selenium

准备

Selenium

Selenium 测试直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Mozilla 和 Firefox 中运行。

在终端模仿用户对浏览器的操作,如鼠标点击,鼠标下滑,键盘输入。
使用 selenium 需要安装/下载:

  1. selenium pip install selenium
  2. 下载浏览器驱动 ChromeDriver

思路

  1. 分析京东登录页面
  2. Selenium 模拟用户登录
  3. 使用 pickle 保存 cookies
  4. 验证 cookies 是否有效

分析京东登录页面

在浏览打开 https://passport.jd.com/new/login.aspx 页面后,界面如:

loginpage.png

大概有几种登录方式,二维码和账密登录,首先登录页面展示二维码登录,我们需要点击账户登录才能切换到账密登录,打开调试器查看账户登录的 css 代码:

css1.png

定位此元素:div.login-tab-r a

zhanghu.png

切换到账户登录后,还需要获取三个 css 控件,经过调试获得的 css 代码:

邮箱:input#loginname
密码:input#nloginpwd
登录按键:a#loginsubmit

selenium 登录

import time
from selenium import webdriver
import requests
import pickle
def jd_login(username, password):
    driver = webdriver.Chrome(executable_path="C:\Users\Stone\PycharmProjects\Virtualenv\scrapy_1\chromedriver.exe") # 浏览器驱动位置
    driver.get('https://passport.jd.com/new/login.aspx')  # JD 登录页面
    time.sleep(2)  # 等待加载
    driver.find_element_by_css_selector('div.login-tab-r a').click()     # 切换登录按钮
    driver.find_element_by_css_selector('input#loginname').send_keys(username)   # 填写账号
    driver.find_element_by_css_selector('input#nloginpwd').send_keys(password)      # 填写密码
    driver.find_element_by_css_selector('a#loginsubmit').click()              # 点击登录按钮
    driver.delete_all_cookies()  
    jd_cookies = driver.get_cookies() 
    driver.close()  # 关闭浏览器
    pickle.dump(jd_cookies, open('cookies.pkl', 'wb'))  # 保存cookies
    print 'cookies save successfully!'

整段代码做了如下事情:

  1. 找到浏览器驱动位置
  2. 请求京东登录界面
  3. 切换登录按钮
  4. 填写账号和密码
  5. 点击登录,保存 cookies

如果 css 代码正确,这一步 over

测试 cookies 有效性

经过 selenium 登录得到的 cookies 保存在同目录的 cookies.pkl 文件中,加载此文件,将获取到的 cookies 去访问京东需要登录的界面,如:http://helper.jd.com/IDPlus/pchtml/size-center.html

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/6.1.3397.16 Safari/537.36',
}
def is_login():
    try:
        cookies = pickle.load(open('cookies.pkl', 'rb'))  # 加载cookies,传给requests
        print 'cookies loaded successfully '
    except:
        print 'cookies failed to load!'
    session = requests.session()
    for cookie in cookies:
        session.cookies.set(cookie['name'], cookie['value'])
    response = session.get('http://helper.jd.com/IDPlus/pchtml/size-center.html', headers=headers,
                           allow_redirects=False)
    with open("jd.html",'w') as f:
        f.write(response.text.encode("utf-8"))
        f.close()
    print response.text

此段代码做了如下事情:

  1. cookies 一个个加入 session
  2. session 请求权限页面
  3. allow_redirects 如果返回的状态码不是 200,那么就重定向,此参数看情况添加
  4. response.text 写到本地,再次确认 cookies 是否有效

参考资料:

Selenium:http://www.seleniumhq.org/
Github 上 Selenium 项目:https://github.com/search?l=Python&q=selenium&type=Repositories&utf8=%E2%9C%93

上一篇下一篇

猜你喜欢

热点阅读