2025年3月29日 星期六 甲辰(龙)年 月廿八 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

绕过webdriver检测 实现连续爬取谷歌翻译

时间:04-23来源:作者:点击数:54

所需附件stealth.min.js

来自CSDN博主-顽强拼搏的阿k的stealth.min.js

前提

之前我发布的浅析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服务
  • 不宜连续使用次数过多,没有设计长时间使用的优化,否则最终容易卡住得不到返回值。
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门