京东自动登录

## 京东自动登录

注:本文所做操作皆以京东web为例

包含:xpath,splinter,ocr

遇到的坑:  

1. 登录页面通过查看网页元素,能看到账户,密码唯一id,但是执行

   ```
   browser.fill("loginname", name)  # 填写账户密码
   browser.fill("nloginpwd", passwd)
   ```

   报错信息

   ```
   selenium.common.exceptions.InvalidElementStateException: Message: invalid element state: Element is not currently interactable and may not be manipulated 
   ```

   实际原因如下

   ```
   元素你看得到,但是代码要操作的元素是跟随鼠标变更样式的,或者其他条件实时变更的,导致代码不能“看见”。这种情况就需要通过js操作dom元素来适应场景。 
   ```

   经过分析,查看网页源代码可以看到,实际被js代码渲染,可能更改,所以一定要保持页面如真是用户操作一样,方可。所以添加如下代码,解决问题

   ```
       browser.click_link_by_text("账户登录")#使login,passwd可见
       browser.fill("loginname", name)  
       browser.fill("nloginpwd", passwd)
   ```

   2.京东验证吗

   注:京东验证码阻塞了俩天,通过搜索知道京东验证码由三部分组成;

   ```
   acid,uid,yys三部分拼装而成,acid,uid为固定值,可以从页面直接抓取,yys为随机生成的13为字符串,拼装而成的验证码例如url=https://authcode.jd.com/verify/image?a=1&acid=b6ff1eca-e3e5-4692-904b-be35da5f0752&uid=b6ff1eca-e3e5-4692-904b-be35da5f0752&yys=5436761901589
   ```

    过程1. requests 请求url获取一直ok,通过requests返回值result, 查看result.text发现返回的为京东首页的html网页内容,显然有误,查看返回302代码,重定向。定位问题,应该是访问url,ok.requests headers 有误。然后添加了cookie,返回200

    过程2.  返回200,查看返回数据,发现一堆乱码,以为是编码问题,打印result.encoding,返回None,应该不是编码问题。经搜索,返回如果是图片,应该是二进制数据,所以乱码。尝试保存数据到硬盘,发现验证码图片保存成功。

    过程3. 调用百度ocr接口,实现验证码识别,准确度不高,有待提高

代码地址:

```
https://github.com/wanderingpuppy/seckill
```

你可能感兴趣的:(京东自动登录)