模拟登录之京东网 - selenium
接上一篇模拟登录之拉勾网。
拉勾网对表单的密码字段进行了几轮 md5 加密,官网加密的思路比较清楚,顺藤摸瓜,就能找到拉勾网加密的方法,但是像淘宝、京东等大型商业网站,为了账户的安全,加密的逻辑复杂,可能加密规则每天都在改变,一些表单字段是很难成功获取到的,尽管如此,还是有工具能够解决这类网站 —— Selenium
准备
Selenium
Selenium 测试直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Mozilla 和 Firefox 中运行。
在终端模仿用户对浏览器的操作,如鼠标点击,鼠标下滑,键盘输入。
使用 selenium
需要安装/下载:
- selenium
pip install selenium
- 下载浏览器驱动 ChromeDriver
思路
- 分析京东登录页面
-
Selenium
模拟用户登录 - 使用
pickle
保存cookies
- 验证
cookies
是否有效
分析京东登录页面
在浏览打开 https://passport.jd.com/new/login.aspx 页面后,界面如:
loginpage.png大概有几种登录方式,二维码和账密登录,首先登录页面展示二维码登录,我们需要点击账户登录才能切换到账密登录,打开调试器查看账户登录的 css
代码:
定位此元素:div.login-tab-r a
切换到账户登录后,还需要获取三个 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!'
整段代码做了如下事情:
- 找到浏览器驱动位置
- 请求京东登录界面
- 切换登录按钮
- 填写账号和密码
- 点击登录,保存
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
此段代码做了如下事情:
- 将
cookies
一个个加入session
中 -
session
请求权限页面 -
allow_redirects
如果返回的状态码不是200
,那么就重定向,此参数看情况添加 - 将
response.text
写到本地,再次确认cookies
是否有效
参考资料:
Selenium:http://www.seleniumhq.org/
Github 上 Selenium 项目:https://github.com/search?l=Python&q=selenium&type=Repositories&utf8=%E2%9C%93