您当前的位置: 首页 >  爬虫

不会翻墙的泰隆

暂无认证

  • 5浏览

    0关注

    31博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

不会翻墙的泰隆 发布时间:2022-07-18 15:22:49 ,浏览量:5

本文目录
  • 前言
  • 案例
    • 难点
      • 参数加密
      • 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()
成果

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

最后

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

在这里插入图片描述

关注
打赏
1658128969
查看更多评论
立即登录/注册

微信扫码登录

0.0435s