爬虫之js2py的使用

在知道了js如何生成我们想要的数据之后,那么接下来我们就需要使用程序获取js执行之后的结果了

1.1 js2py的介绍

js2py是一个js的翻译工具,也是一个通过纯python实现的js的解释器

1.2 js的执行思路

js的执行方式大致分为两种:

  1. 在了解了js内容和执行顺序之后,通过python来完成js的执行过程,得到结果
  2. 在了解了js内容和执行顺序之后,使用类似js2py的模块来执js代码,得到结果

但是在使用python程序实现js的执行时候,需要观察的js的每一个步骤,非常麻烦,所以更多的时候我们会选择使用类似js2py的模块去执行js,接下来我们来使用js2py实现人人网登录参数的获取(http://www.renren.com/)

1.3 具体的实现

定位进行登录js代码

formSubmit: function() {var e, t = {};$(".login").addEventListener("click", function() {t.phoneNum = $(".phonenum").value,t.password = $(".password").value,e = loginValidate(t),t.c1 = c1 || 0,e.flag ? ajaxFunc("get", "http://activity.renren.com/livecell/rKey", "", function(e) {var n = JSON.parse(e).data;if (0 == n.code) {t.password = t.password.split("").reverse().join(""),setMaxDigits(130);var o = new RSAKeyPair(n.e,"",n.n), r = encryptedString(o, t.password);t.password = r,t.rKey = n.rkey} elsetoast("公钥获取失败"),t.rKey = "";ajaxFunc("post", "http://activity.renren.com/livecell/ajax/clog", t, function(e) {var e = JSON.parse(e).logInfo;0 == e.code ? location.href = localStorage.getItem("url") || "" : toast(e.msg || "登录出错")})}) : toast(e.msg)})}

从代码中我们知道:

  1. 我们要登录需要对密码进行加密和获取rkey字段的值
  2. rkey字段的值我们直接发送请求rkey请求就可以获得
  3. 密码是先反转然后使用RSA进行加密, js代码很复杂, 我们希望能通过在python中执行js来实现

实现思路:

  1. 使用session发送rKey获取登录需要信息

    • url: http://activity.renren.com/livecell/rKey
    • 方法: get
  2. 根据获取信息对密码进行加密 2.1 准备用户名和密码

    2.2 使用js2py生成js的执行环境:context

    2.3 拷贝使用到js文件的内容到本项目中

    2.4 读取js文件的内容,使用context来执行它们

    2.5 向context环境中添加需要数据

    2.6 使用context执行加密密码的js字符串

    2.7 通过context获取加密后密码信息

  3. 使用session发送登录请求

    • URL: http://activity.renren.com/livecell/ajax/clog
    • 请求方法: POST
    • 数据:

        phoneNum: xxxxxxxpassword: (加密后生产的)c1: 0rKey: rkey请求获取的
      

具体代码

需要提前下载几个js文件到本地:

BigInt.js

RSA.js

Barrett.js

import requests
import json
import js2py# - 实现思路:
#   - 使用session发送rKey获取登录需要信息
#     - url: http://activity.renren.com/livecell/rKey
#     - 方法: get
#  获取session对象
session = requests.session()
headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Mobile Safari/537.36","X-Requested-With": "XMLHttpRequest","Content-Type":"application/x-www-form-urlencoded"
}
# 设置session的请求头信息
session.headers = headersresponse = session.get("http://activity.renren.com/livecell/rKey")
# print(response.content.decode())
n = json.loads(response.content)['data']#   - 根据获取信息对密码进行加密
#     - 准备用户名和密码
phoneNum = "131..."
password = "****"
#     - 使用js2py生成js的执行环境:context
context = js2py.EvalJs()
#     - 拷贝使用到js文件的内容到本项目中
#     - 读取js文件的内容,使用context来执行它们
with open("BigInt.js", 'r', encoding='utf8') as f:context.execute(f.read())with open("RSA.js", 'r', encoding='utf8') as f:context.execute(f.read())
with open("Barrett.js", 'r', encoding='utf8') as f:context.execute(f.read())# - 向context环境中添加需要数据
context.t = {'password': password}
context.n = n
#     - 执行加密密码的js字符
js = '''t.password = t.password.split("").reverse().join(""),setMaxDigits(130);var o = new RSAKeyPair(n.e,"",n.n), r = encryptedString(o, t.password);'''
context.execute(js)
# - 通过context获取加密后密码信息
# print(context.r)
password = context.r
#   - 使用session发送登录请求
#     - URL: http://activity.renren.com/livecell/ajax/clog
#     - 请求方法: POST
#     - 数据:
#       - phoneNum: 15565280933
#       - password: (加密后生产的)
#       - c1: 0
#       - rKey: rkey请求获取的
data = {'phoneNum': '131....','password': password,'c1':0,'rKey':n['rkey']
}# print(session.headers)
response = session.post("http://activity.renren.com/livecell/ajax/clog", data=data)
print(response.content.decode())# 访问登录的资源
response = session.get("http://activity.renren.com/home#profile")
print(response.content.decode())

爬虫之js2py的使用相关推荐

  1. 爬虫 第四讲 js2py和selenium

    文章目录 爬虫 第四讲 selenium 一.js2py 1.js2py简介 2. js2py模块的使用 3. js2py快速入门 4. js代码翻译 5.js代码中使用函数 二.selenium的使 ...

  2. 爬虫之观察js的执行过程

    爬虫之观察js的执行过程 找到js的位置之后,我们可以来通过观察js的位置,找到js具体在如何执行,后续我们可以通过python程序来模拟js的执行,或者是使用类似js2py直接把js代码转化为pyt ...

  3. 爬虫之常见的反爬手段和解决思路

    1 服务器反爬的原因 爬虫占总PV(PV是指页面的访问次数,每打开或刷新一次页面,就算做一个pv)比例较高,这样浪费钱(尤其是三月份爬虫). 三月份爬虫是个什么概念呢?每年的三月份我们会迎接一次爬虫高 ...

  4. python 获取html js 变量_Python爬虫与反反爬虫实践

    因为要收集数据,所以打算自己撸一个爬虫,期间碰到网站的反爬措施,让我非常头疼,在此记录一下. 基础 爬虫的基础是不需要自己手动通过浏览器访问网页,而是通过程序构造网络请求,获取网站返回的结果.例如使用 ...

  5. 爬虫模拟登陆手机验证码_网络爬虫干货总结,这次比较全面!

    我从五个方面介绍了利用 Python 进行网络爬虫开发的相关知识点和技巧: 抓取 解析 存储 反爬 加速 目录 一.爬取 爬取的目标可以大致分为两类:网页.APP 对于网页,可以分为两种类别,即 服务 ...

  6. 基础网络爬虫(Web crawler)相关技术浅析

    文章目录 前言 基本概念 Robots协议 基本原理 现状概况 爬虫软件 跨语言 Selenium Python urllib requests Scrapy Pyspider Java WebMag ...

  7. python3爬虫(5)百度云盘暴力破解尝试

    4年前写过一篇文章,暴力破解百度云,链接(当然这个方法早已失效): https://blog.csdn.net/liujiayu2/article/details/48953745 当时写这篇文章的时 ...

  8. python网络爬虫系列(八)——常见的反爬手段和解决方法

    常见的反爬手段和解决思路 学习目标 了解 服务器反爬的原因 了解 服务器常反什么样的爬虫 了解 反爬虫领域常见的一些概念 了解 反爬的三个方向 了解 常见基于身份识别进行反爬 了解 常见基于爬虫行为进 ...

  9. Python 大规模异步新闻爬虫、google翻译、百度翻译、有道翻译、百度指数

    参考:https://www.yuanrenxue.com/crawler/news-crawler-urlpool.html url_pool.py # -*- coding: utf-8 -*- ...

最新文章

  1. 985大学的高材生只会写代码片段,丢人吗?
  2. 杨桃32开发版最小核心板和底板接口定义以及各io口功能
  3. Windows核心编程 第2 5章 未处理异常和C ++异常(上)
  4. JavaScript —— this、闭包、原型、异步
  5. Spark _16 _SparkUIMaster HA
  6. Debian 9 中设置网络
  7. 计算机怎么删除表格,电脑中删除Excel2010表格多余图片的三种方法
  8. Flutter中ListView动画OpenContainer动画Flutter径向过渡OpenContainer
  9. GCF(1)---How to modify PICS according to FGI bits UE reported
  10. 编程小技巧 --用VB解决时间同步的问题
  11. 突发!程序员!快别闷头学Python了!
  12. 鼠标移入通过时间控制实现两个不同步的动画效果
  13. 如何使用 ggplot2 ?
  14. Java学习个人备忘录之文档注释
  15. 读书-算法《程序设计导引及在线实践》-简单计算题4:填词
  16. 第一章 为什么我们对机器学习感兴趣?(二)
  17. wps重复上一步快捷键_Wps重复命令快捷键
  18. Rasa3 domain官方文档翻译
  19. 遥感小目标检测论文梳理
  20. netscape.exe_评论-Netscape 6.1

热门文章

  1. AI+大数据助力抗疫,带你认识百度地图的新玩法!
  2. 29篇计算机视觉领域论文,篇篇惊艳!内附链接!
  3. 如何构建可解释的推荐系统?| 深度
  4. 用Python解锁“吃鸡”正确姿势
  5. 比特大陆发力边缘计算,详解终端AI芯片BM1880
  6. 10分钟教你用睡觉这件事玩转贝叶斯推断
  7. 干货 | 转型人工智能,你需要掌握的八大神经网络
  8. 推荐一个分布式JVM监控工具,非常实用!
  9. Nginx为什么快到根本停不下来?
  10. 分享 14 个 Spring MVC 顶级技巧!