用“小聪明”实现连续爬取谷歌翻译

爬取谷歌翻译

    • 所需附件stealth.min.js
    • 前提
    • 思路
    • 调整
    • 代码实现
    • 使用备注

所需附件stealth.min.js

来自顽强拼搏的阿k博主的stealth.min.js,下载不需要C币或积分,我就不上传了。

前提

之前我发布的浅析Python谷歌翻译库的核心里面的代码仍然可以获取翻译结果,但是对于复杂翻译语种,获取到的结果和网页上的显示不同,这让我很气。
我自己也尝试进行再次破解过,但是万事俱备,只欠x-goog-batchexecute-bgr。这个参数是我的心头病,只要掌握了这个参数的获取方式,就能直接从谷歌翻译官网获取到正确的返回结果。如果有人会获取这个参数,可以留言评论,鄙人感激不尽!

思路

要想实现对复杂语种的准确翻译爬取,只能使用selenium爬虫了,用“所见即所得”的方式,无疑是最简单的爬虫方式,不过谷歌翻译官网默认不会允许webdriver的存在,所以就要使用stealth.min.js文件进行抹除webdirver的特征指纹,使用方式参照源码。

调整

谷歌翻译的自动语种识别有时候不准,拼音会识别为中文,所以这里我借用了一下百度翻译识别语种的接口,如有需要可以自行更改。

代码实现

# _*_ coding:utf-8 _*_
# FileName: google.py
# IDE: PyCharm
# 菜菜代码,永无BUG!

import time
import requests
from fastapi import FastAPI  # pip install uvicorn fastapi jinja2 aiofiles
from urllib.parse import quote
from selenium import webdriver, common
from starlette.middleware.cors import CORSMiddleware
# from selenium.webdriver.chrome.options import Options
# options = Options()

app = FastAPI()
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
lans = ['af', 'sq', 'am', 'ar', 'hy', 'az', 'eu', 'be', 'bn', 'bs', 'bg', 'ca', 'ceb', 'ny', 'zh-cn', 'zh-tw', 'co', 'hr', 'cs', 'da', 'nl', 'en', 'eo', 'et', 'tl', 'fi', 'fr', 'fy', 'gl', 'ka', 'de', 'el', 'gu', 'ht', 'ha', 'haw', 'iw', 'he', 'hi', 'hmn', 'hu', 'is', 'ig', 'id', 'ga', 'it', 'ja', 'jw', 'kn', 'kk', 'km', 'ko', 'ku', 'ky', 'lo', 'la', 'lv', 'lt', 'lb', 'mk', 'mg', 'ms', 'ml', 'mt', 'mi', 'mr', 'mn', 'my', 'ne', 'no', 'or', 'ps', 'fa', 'pl', 'pt', 'pa', 'ro', 'ru', 'sm', 'gd', 'sr', 'st', 'sn', 'sd', 'si', 'sk', 'sl', 'so', 'es', 'su', 'sw', 'sv', 'tg', 'ta', 'te', 'th', 'tr', 'uk', 'ur', 'ug', 'uz', 'vi', 'cy', 'xh', 'yi', 'yo', 'zu']


@app.get('/stop')
def stop():
    driver.close()
    driver.quit()
    print('Stopped complete .')
    return 'Stopped complete .'


@app.get('/translate/{des:str}/{text:str}')
# 比赛开始结束
def competitions(des, text):
    lan = requests.post('https://fanyi.baidu.com/langdetect', data={"query": text}).json()["lan"]
    for la in lans:
        if la in lan.lower():
            lan = la
            break
    else:
        lan = 'auto'
    for la in lans:
        if la in des.lower():
            des = la
            break
    else:
        des = 'zh-CN'
    url = f'https://translate.google.cn/?sl={lan}&tl={des}&text={quote(text)}&op=translate'
    try:
        driver.get(url)
        # driver.find_element_by_class_name('er8xn').send_keys(text)
    except common.exceptions.TimeoutException:
        pass
    while 1:
        try:
            return {'lan': lan, 'des': des, 'res': driver.find_element_by_class_name('VIiyi').text}
        except common.exceptions.NoSuchElementException:
            time.sleep(0.5)


options = webdriver.ChromeOptions()
options.headless = True
options.add_argument('lang=zh_CN.UTF-8')
options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36')
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option('excludeSwitches',  ['enable-automation'])  # webdriver防检测
# options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})  # 禁止图片加载
driver = webdriver.Chrome(options=options)
# driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {  # 关闭 window.navigator.webdriver 属性
#     "source": """
#         Object.defineProperty(navigator,'webdriver',{
#             get: () => false
#         })
#     """
# })
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": open('stealth.min.js', 'r', encoding='utf-8').read()})
driver.get('https://translate.google.cn/')
driver.set_page_load_timeout(1)
print('Started complete .')

使用备注

  • 启动方式:uvicorn google:app --reload --port 8080
  • 使用方式:print(requests.get(“http://127.0.0.1:8080/translate/zh-cn/apple”).json()[“res”])
  • 停止方式:requests.get(“http://127.0.0.1:8080/stop”) 随后Ctrl + C手动停止uvicorn服务
  • 不宜连续使用次数过多,没有设计长时间使用的优化,否则最终容易卡住得不到返回值。

你可能感兴趣的:(Python爬虫,爬虫,python)