- 前言
- 案例
- 难点
- 参数加密
- IP封禁
- 代码解析
- 翻译评论
- 完整代码
- 成果
- 最后
想要更进一步了解爬虫领域,学Js肯定是必不可少的,怎么说呢?现在大部分网站开始对数据层层加密,导致我们要花费大量的精力去研究,如果不了解的话,甚至连入口都找不到!这时候就会有人说:用selenium不就行了,确实没问题,但是要想想效率高吗?要是10w+的数据量,那得跑多久?如果生产使用,你要怎么办?你跟老板说,机器慢我也没办法?回到主题,js逆向没有固定的方法论,所以也没有一定的解决方法,只能见招拆招
案例最近因工作原因需要抓一些产品评论,但是评论都是英文的,加上本人英语较烂,还得借助翻译,总不能手动一条一条翻译吧,所以我找了一个免费的翻译接口(有道翻译),分享给大家!!!
难点总而言之,言而总之!直接步入正题
参数加密 第一步:打开检查,点击XHR,下面跳出来一个请求接口,看看里面有哪些参数?除了我标注的以外,其他参数一律都是加密过的,需要找到加密方法,然后自动生成。
第二步:通过全局搜索,随便搜索一个加密参数,找到加密的Js文件后打开原文件。
第三步:打开js原文件后,点击格式化js,标注的大括号。
第四步:Ctrl+F搜索刚刚加密的参数,我们可以找到加密方法,然后打上断点,进行调式。
第五步:通过调式,发现其中加密参数,与之前请求的一致,可以肯定,这就是加密方法!
第六步:一些函数方法,可能很多小伙伴不知道什么意思,我们可以在控制台上运行,来进行判断,我已经帮大家打印出来了,还有不懂的可以自己动动手。
import js2py
r = js2py.eval_js('(new Date).getTime()') # 时间戳
bv = str(md5('5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36')) # md5加密请求头
ts = str(r)
salt = ts + str(random.randint(0,10)) # 时间戳 + 一个随机整数
sign = md5("fanyideskweb" + e + salt + "Ygy_4c=r#e#4EX^NUGUc5") # 签名加密
body = {
'i': e, # e是你输入的文字,比如我输入love
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'lts': ts,
'bv': bv,
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
} # 请求参数
第七步:我们将js代码转成成python代码,也可以通过js2py或者execjs来运行Js代码,因为加密比较简单,所以我通过转换代码,大家更容易理解!
IP封禁翻译的文本较多,翻了一会发现报错,我就知道应该没那么简单,那就找找原因吧!其实只要经验比较丰富的朋友都知道,基本上就是IP封了。 上图显示,状态码:302,连网页都封了,这下就很容易解释了,好了,可以直接去购买代理了!!!
代理:我用的小象代理,不推荐大家用什么,自己觉得好用就行。
request调用
proxy_host = 'http-dynamic-S03.xiaoxiangdaili.com'
proxy_port = 10030
proxy_username = '*******'
proxy_pwd = '********'
proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
"host": proxy_host,
"port": proxy_port,
"user": proxy_username,
"pass": proxy_pwd,
}
proxies = {
'http': proxyMeta,
'https': proxyMeta,
}
try:
res = requests.get(url=url, proxies=proxies)
print(res.text)
except Exception as e:
print e
代码解析
- md5
def md5(value):
x = hashlib.md5()
x.update(value.encode('utf-8'))
return x.hexdigest()
- 请求参数
def from_data(e):
r = js2py.eval_js('(new Date).getTime()') # 时间戳
bv = str(md5('5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36')) # md5加密请求头
ts = str(r)
salt = ts + str(random.randint(0,10)) # 时间戳 + 一个随机整数
sign = md5("fanyideskweb" + e + salt + "Ygy_4c=r#e#4EX^NUGUc5") # 签名加密
body = {
'i': e, # e是你输入的文字,比如我输入love
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'lts': ts,
'bv': bv,
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
} # 请求参数
return body
- 爬取数据
def spider():
headers = {
'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
'Cookie':'OUTFOX_SEARCH_USER_ID=-1958836229@10.110.96.159; OUTFOX_SEARCH_USER_ID_NCOO=547250116.881104; ___rl__test__cookies=1657074774894',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Host': 'fanyi.youdao.com',
'Origin': 'https://fanyi.youdao.com',
'Referer': 'https://fanyi.youdao.com/',
}
url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
e = input('请输入要翻译的文本: ')
all_list = [] # 创建一个空列表
data = from_data(e)
res = requests.post(url,headers=headers,data=data,proxies=proxies).json()
text = res['translateResult'][0][0]['src']
fanyi = res['translateResult'][0][0]['tgt']
print(f'原文:{text},译文:{fanyi}')
翻译评论
这是我爬取的评论,然后保存到xlsx中
import js2py
import hashlib
import random
import requests
import pandas as pd
import csv
def md5(value):
x = hashlib.md5()
x.update(value.encode('utf-8'))
return x.hexdigest()
def from_data(e):
r = js2py.eval_js('(new Date).getTime()')
bv = str(md5('5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'))
ts = str(r)
salt = ts+str(random.randint(0,10))
sign = md5("fanyideskweb" + e + salt + "Ygy_4c=r#e#4EX^NUGUc5")
body = {
'i': e,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'lts': ts,
'bv': bv,
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
return body
def spider():
proxy_host = 'http-dynamic-S03.xiaoxiangdaili.com'
proxy_port = 10030
proxy_username = '******8888'
proxy_pwd = '88888888'
proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
"host": proxy_host,
"port": proxy_port,
"user": proxy_username,
"pass": proxy_pwd,
}
proxies = {
'http': proxyMeta,
'https': proxyMeta,
}
headers = {
'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
'Cookie':'OUTFOX_SEARCH_USER_ID=-1958836229@10.110.96.159; OUTFOX_SEARCH_USER_ID_NCOO=547250116.881104; ___rl__test__cookies=1657074774894',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Host': 'fanyi.youdao.com',
'Origin': 'https://fanyi.youdao.com',
'Referer': 'https://fanyi.youdao.com/',
}
url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
df = pd.read_excel('翻译.xlsx',sheet_name='Sheet1')
txt = df['评论内容']
all_list = []
for e in txt:
data = from_data(e)
res = requests.post(url,headers=headers,data=data,proxies=proxies).json()
text = res
fanyi = text['translateResult'][0][0]['src']
to = text['translateResult'][0][0]['tgt']
print(f'原文:{fanyi},译文:{to}')
result = {}
result['原文'] = fanyi
result['译文'] = to
all_list.append(result)
return all_list
def sava():
with open('译文.csv','wt',encoding='utf8') as f:
writer = csv.DictWriter(f,
fieldnames=['原文','译文'])
writer.writeheader()
data = spider()
writer.writerows(data)
if __name__ == '__main__':
sava()
成果
点关注不迷路,本文章若对你有帮助,烦请三连支持一下 ❤️❤️❤️ 各位的支持和认可就是我最大的动力❤️❤️❤️