【爬虫进阶】Js逆向——有道批量翻译文本

本文介绍了在爬虫过程中遇到的JS加密参数和IP封禁问题,以及如何解决。首先,通过浏览器开发者工具分析请求,找到加密参数并反编译JS找到加密方法,将JS代码转换为Python实现。然后,针对IP封禁,采取使用代理IP的方式避免。最后,提供了一个翻译评论的完整Python代码示例,展示了如何利用这些技巧进行实际操作。
摘要由CSDN通过智能技术生成

前言

想要更进一步了解爬虫领域,学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()

成果

在这里插入图片描述
在这里插入图片描述

最后

点关注不迷路,本文章若对你有帮助,烦请三连支持一下 ❤️❤️❤️
各位的支持和认可就是我最大的动力❤️❤️❤️

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值