Tom*_*lid 6 shell-script wget google
我不想打电话给整个Firefox
/ Chrome
/Opera
用一个字......找出的意思Google translate
,所以我决定写一个shell script
,它使用wget
获得的内容translate.google.hu
,并得到从下载文件的翻译。但是我在第一步卡住了。
例如,如果我想找出“爱好者”一词的翻译(从 eng 到 hun),我会尝试
$ wget https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast
Run Code Online (Sandbox Code Playgroud)
但wget
不会下载我输入的页面
进入我浏览器的地址栏。相反,我得到了以下内容:
solid@skynet:~> wget https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast
[1] 2143
solid@skynet:~> --2016-05-02 08:23:24-- https://translate.google.hu/?hl=hu
Resolving translate.google.hu (translate.google.hu)... 216.58.209.163, 2a00:1450:400d:806::2003
Connecting to translate.google.hu (translate.google.hu)|216.58.209.163|:443... connected.
HTTP request sent, awaiting response... 403 Forbidden
2016-05-02 08:23:24 ERROR 403: Forbidden.
Run Code Online (Sandbox Code Playgroud)
我在等待,等待,等待......最后我按下了ENTER:
[1]+ Exit 8 wget https://translate.google.hu/?hl=hu
Run Code Online (Sandbox Code Playgroud)
有人可以解决我的问题吗?
(我使用的是 OpenSuse Linux 13.2)
更新根据 [Alexander Batischev] 我已经尝试过
$ wget 'https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast'
Run Code Online (Sandbox Code Playgroud)
它解决了在后台运行的问题,并传递给 wget 正确的地址(而不是创建局部变量 'tab')^.^'
但我得到同样的错误,直到Forbidden
:
$ wget 'https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast'
--2016-05-03 14:57:48-- https://translate.google.hu/?hl=hu&tab=wT
Resolving translate.google.hu (translate.google.hu)... 216.58.209.163, 2a00:1450:400d:806::2003
Connecting to translate.google.hu
(translate.google.hu)|216.58.209.163|:443... connected. HTTP request
sent, awaiting response... 403 Forbidden
2016-05-03 14:57:48 ERROR 403: Forbidden.
Run Code Online (Sandbox Code Playgroud)
当您运行此命令时:
wget https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast
Run Code Online (Sandbox Code Playgroud)
真正发生的是:
wget
使用“ https://translate.google.hu/?hl=hu ”的网址运行;wget
将在后台运行;tab
定义了一个名为的变量并获得了一个值wT#en/hu/Enthusiast
。这一切的原因是 shell 为特殊的东西保留了一些字符,包括&符号。要防止 shell 解释 & 号,请使用引号:
wget 'https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast'
Run Code Online (Sandbox Code Playgroud)
解决了这个问题后,您仍然会收到“禁止”响应。
这是想要绕过接口的客户和不想让接口的提供者之间的竞赛。Google 从广告中获得收入,它知道您的脚本不会显示任何内容。因此,他们正在采取措施禁止任何访问,但通过浏览器。
唯一能准确告诉您为什么被“禁止”的人是 Google 工程师。也就是说,这些技术中较容易的一种是众所周知的。
最简单的方法之一是被“用户代理字符串”阻止。这是一个标识客户端(您的浏览器或 wget)的品牌和版本的字符串。它看起来像这样:
Wget/1.16.3 (linux-gnu)
Run Code Online (Sandbox Code Playgroud)
客户端随每个请求发送此字符串。服务器可以使用它来调整结果的外观,或者拒绝访问,就像你的情况一样。
wget
接受--user-agent
标志,您可以在其中指定要发送的用户代理字符串。要模仿您自己的浏览器,您可以在同一个 Google 中输入“我的用户代理是什么”,然后从那里复制字符串:) 然后,将它传递给wget
像这样:
wget --user-agent='Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0' \
'https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast'
Run Code Online (Sandbox Code Playgroud)
您的问题的一个方面是您应该使用引号来避免像 & 这样的 shell 命令出现问题。但这并不是唯一的问题。如果您使用像 wget 这样的机器人或程序,许多网站会拒绝为您服务。所以你必须改变用户代理。
去:
本网站向您显示您浏览器的用户。然后运行:
wget -U "Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405" 'https://translate.google.hu/?hl=hu&tab=wT#en/hu/Enthusiast' -O Enthusiast.html
Run Code Online (Sandbox Code Playgroud)
更明智的选择是使用 Google Chrome。打开 Chrome,按 F12,转到https://translate.google.com/。然后右键单击第一个请求,即 translate.google.com,然后选择“复制为 cURL”。然后您可以使用该命令来请求页面(几乎),就像您正在使用 Google Chrome 一样。您可以在 cURL 中使用“-o”将其保存为文件,或者您可以将命令转换为 wget 中可用的命令。
此处记录了 Chrome 的此功能:
http://www.lornajane.net/posts/2013/chrome-feature-copy-as-curl
请注意,有时当您收到“禁止”消息时,您必须等待一段时间,或者使用浏览器访问该网站并回答诸如验证码之类的问题才能继续您对该网站的请求。
最后,您应该在以特定方式使用它之前检查“服务条款”。我不知道你是否在做正确的事情,所以请自己检查一下。