嘘~ 正在从服务器偷取页面 . . .

工欲善其事,必先利其器——识别验证码(2)


模拟登录人人网

前面我们学习了使用第三方平台实现验证码的识别,那现在就让我们来用验证码的识别实现人人网的登录。

首先我们先到人人网的登录页面去踩点。


人人网登录在三次失败后需要输入验证码,那我们现在需要做的就是通过数据解析将验证码保存到本地(为了更好的使用第三方验证码识别平台)。

有了验证码之后,我们又要怎么通过爬虫实现登录呢?首先我们打开抓包工具,看看登陆时会发生什么。


首先我们先点击那个禁止符号的符号,将数据清空,然后再点击 “ preserve log ”,然后我们再实现登录。


我们发现这里有一个 login 的文件,我们点开它。


我们发现这个文件的 data 一栏里的 icode 是我们输入的验证码,那么我们就有理由怀疑这一栏需要动态改变的就是 icode 这一栏,这就是说我们前面保存的验证码在这里就有用武之地。

分析结束,就开始写代码了。

import requests
from lxml import etree
import base64
import json

def base64_api(uname, pwd, img, typeid):
    with open(img, 'rb') as f:
        base64_data = base64.b64encode(f.read())
        b64 = base64_data.decode()
    data = {"username": uname, "password": pwd,"typeid":typeid, "image": b64}
    result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
    if result['success']:
        return result["data"]["result"]
    else:
        return result["message"]
    return ""


if __name__ == "__main__":
    # UA伪装
    header = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36"
        }

    # 指定url
    url = "http://www.renren.com/"

    # 获取源码
    page_text = requests.get(url = url, headers = header).text

    # xpath 解析
    tree = etree.HTML(page_text)
    src = tree.xpath('//*[@id="verifyPic_login"]/@src')[0] # 验证码网址

    # 保存验证码
    photo = requests.get(url = src, headers = header).content
    with open("./验证码.jpg", "wb") as fp:
        fp.write(photo)


    img_path = "C:\\Users\\ASUS\\Desktop\\CSDN\\验证码识别\\验证码.jpg"
    result = base64_api(uname='账号', pwd='密码', img=img_path, typeid=3)
    print(result)

    # 登录网址
    url = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20214120314"

    data = {
        "email": "15157485037",
        "icode": result,
        "origURL": "http://www.renren.com/home",
        "domain": "renren.com",
        "key_id": "1",
        "captcha_type": "web_login",
        "password": "8a62222be07c2cf68e8d68f4617fe01d7dbc488427d0bc61666ab8a6e56e94f0",
        "rkey": "07a9f1810ecf9b507634a45447a628e7",
        "f": "http%3A%2F%2Fwww.renren.com%2F976706166%2Fprofile"
    }

    # 模拟登录
    response = requests.post(url = url, headers = header, data = data)

    # 判断登录状态。 200 说明登录成功
    print(response.status_code)

我们看一下运行结果


说明登录成功。

注意:

我们一般用这种方法判断是否登录,其实也可以保存页面来判断,但有一些网站登录成功后返回的并非是网页而是 json 串,所以我们通常用 status code 来判断是否成功,200 表示和网页连接成功。


文章作者: New Ass
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 New Ass !
  目录