Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

Python爬虫常规流程

2019/09/15 爬虫 Python
Word count: 1,452 | Reading time: 6min

Python爬虫常规流程

以爬取有道翻译为例子。

挖取可自用的API

web 端的有道翻译,在之前是直接可以爬的。也就是说只要获取到了他的接口,你就可以肆无忌惮的使用他的接口进行翻译而不需要支付任何费用。那么自从有道翻译推出他的API服务的时候,就对这个接口做一个反爬虫机制(如果大家都能免费使用到他的翻译接口,那他的APl服务怎么赚钱)。这个反爬虫机制在爬虫领域算是一个非常经典的技术手段。

1.查看要爬取的内容是否是静态加载的。

比如在翻译输入框中输入apple,翻译输出框中会出现苹果,然后在``页面中右键->查看网页源代码,直接Ctrl+F搜索是否存在apple或者苹果`,如果没有的话,证明不是静态加载的。

2.查看内容如何加载的

  • 页面初始化get、post请求
  • 局部刷新发送ajax请求
    • 如果存在局部更新内容产生变化的(Url没有发生变化,或者没有页面发生跳转、刷新的感觉),一般都是采用的AJAX更新技术,发送了POST、GET请求获得局部需要更新的数据,可以直接在Network项的XHR里面找到动态加载的文件 (可以看下Ajax技术实现了解下为什么可以在XHR中找到)

这边的话,可以看到输入一个要翻译的内容后,页面没有产生多大的变化,因此猜想是AJAX加载的。在XHR里也找到了相应的Response文件。

使用Chrome自带的抓包工具(页面中右键->检查或者按F12都可以打开,然后选择->Network项(网络监听窗口)就可以看到抓包的数据了)

然后同样在翻译输入框中输入apple,然后可以观察到抓包工具中出现了很多内容。为了确定apple的翻译苹果是在哪个文件中返回的,可以直接Ctrl+F打开搜索框后直接搜索,如图所示。

chrome抓包

JS加密破解

1.使用Python进行模仿JS加密计算

2.运行JS代码获得加密结果

  • 使用python-js2py模块

如一个参数生成的结果是这样的{"LoginKey":"46fd82c2-3108-b2a4-3056-0eaa426f975b","data":"{/"User_Oid/":/"账号/",/"User_Password/":/"密码/"}"}

找到生成LoginKey值的JS文件加密算法是这样的:

1
2
3
4
5
6
function s4() {
return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
};
function guid() {
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
}

然后安装pip install js2py

1
2
3
4
5
6
7
8
9
10
11
12
#coding=utf-8
import js2py
LoginKey = js2py.eval_js('''
function s4() {
return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
};
function guid() {
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
}
var a = guid() // 在这里是需要调用的
''')
print LoginKey

就能获得结果了。

  • 使用pyexe、PyV8、js2py模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import execjs

def get_des_psswd(data, key):
jsstr = get_js()
ctx = execjs.compile(jsstr) #加载JS文件
return (ctx.call('strEnc', data, key)) #调用js方法 第一个参数是JS的方法名,后面的data和key是js方法的参数


def get_js():
f = open("./../lib/des.js", 'r', encoding='utf-8') # 打开JS文件
line = f.readline()
htmlstr = ''
while line:
htmlstr = htmlstr+line
line = f.readline()
return htmlstr

if __name__ == '__main__':
print(get_des_psswd('123456', 'RUY2OTdCRUFFRTg0OUQ0Q0E0ODNDRDMxN0YzOEEzREQudG9tY2F0OTQ='))

js2py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import js2py
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())
# https://blog.csdn.net/guodejie/article/details/81436556

逐步确定JS对密码的加密逻辑 ==> 定位到加密函数

两种思路

  • 全局搜索password字段

  • 全局搜加密算法的名字

    加密一般都是JS加密,加密算法一般比较出名的就那么几个,比如MD5,base64,aes(对称密码),rsa(非对称加密算法)都是可以用来加密的,你可以全局搜这些加密算法的名字

https://www.jianshu.com/p/055e1ddf7bb2

rsa加密

对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破==>为什么密码要大于6位。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

Author: Mrli

Link: https://nymrli.top/2019/08/30/Python爬虫常规流程/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
2019_6月编程笔记
NextPost >
Word2016配置使用MathType
CATALOG
  1. 1. Python爬虫常规流程
    1. 1.1. 挖取可自用的API
    2. 1.2. JS加密破解
      1. 1.2.1. 1.使用Python进行模仿JS加密计算
      2. 1.2.2. 2.运行JS代码获得加密结果
      3. 1.2.3. rsa加密