- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试创建一个脚本(纯粹是学习目的)来用几个不同的词典翻译给定的单词。我完成了两个工作,使用 urllib2 和 beautifulsoup 来获取和解析翻译,然后转向谷歌翻译。
我很快发现它返回 403 禁止错误。添加用户代理即可获得翻译,但只有一个单词的翻译。为了说明这一点,请转到http://translate.google.com/?text=test&sl=en&tl=es您将获得翻译(在名为“hps”的类(class)中)以及动词、名词和形容词的列表。但是使用下面的脚本和 html 是不同的,仅返回主要翻译,并且在
span id=result_box
找不到动词、名词等。
在这个过程中,通过大量的谷歌搜索,我意识到现在有一个 API - 而且不是免费的。我不打算发布任何最终脚本,也不打算用它来违反任何 TOS,但我现在最感兴趣的是为什么浏览器和 urllib 等之间存在差异。
为此,我尝试了带有用户代理的纯 urllib2,并进行了 Mechanize - 如下所示。所以,我的问题是 - 除了用户代理之外,浏览器和 python 脚本还有什么区别?我尝试过使用 Firebug ,但没有任何东西跳到我身上(尽管我是一个菜鸟)。谢谢!
编辑:来自 firebug 的请求 header 和我的脚本如下。
import mechanize
import re
import cookielib
# Browser
br = mechanize.Browser()
# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
# Browser options
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
# Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
# Want debugging messages?
br.set_debug_http(True)
br.set_debug_redirects(True)
br.set_debug_responses(True)
# User-Agent (this is cheating, ok?)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
# Open some site, let's pick a random one, the first that pops in mind:
r = br.open('http://translate.google.com/?text=test&sl=en&tl=es')
html = r.read()
match = re.findall(r'verb', html)
print match
Firebug :
GET /?text=test&sl=en&tl=es HTTP/1.1
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Connection keep-alive
Cookie PREF=ID=298b435815ef8553:U=e7dad4baf65f083b:FF=0:LD=en:CR=2:TM=1327516863:LM=1339428154:S=maktYFZEHXXpMDFg; NID=60=U229h4lzOnjpHyidbhgYecCx72Myp_-XHgupW-R_mWtpuOveDdIOO1uLBq-6ltn-ER15ppJryR7yYOYEhkCfUCl45qNz5aymBQ1CGDHS4UcHu2oIDYAHut0ctnlL76eDW3n7kjOWoz5wNH6NMw
Host translate.google.com
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0) Gecko/20100101 Firefox/9.0
脚本:
send: 'GET /?text=test&sl=en&tl=es HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: translate.google.com\r\nConnection: close\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1\r\n\r\n' reply: 'HTTP/1.1 200 OK\r\n' header: Date: Mon, 11 Jun 2012 16:13:42 GMT
header: Expires: Fri, 01 Jan 1990 00:00:00 GMT
header: Cache-Control: no-cache, must-revalidate
header: Pragma: no-cache
header: X-Frame-Options: SAMEORIGIN
header: Content-Type: text/html; charset=UTF-8
header: Content-Language: en
header: Set-Cookie: PREF=ID=6dd42f2264250d7c:TM=1333431222:LM=1339454222:S=k6JXSoGGaAMNmPEo; expires=Wed, 11-Jun-2014 16:13:42 GMT; path=/; domain=.google.com
header: Set-Cookie: NID=60=f8czmR413h3sKUGJUUM4PLKl2O7SUtqfW5hss5O54sRKoErf9wIEU4Wu2WCuHzWTJQ3p1Rj7dQv1B4BBmSMY1tmfus7UZGCYFIKaXoKwklZ9tZsr5vds8vvvFjRdZyevn; expires=Tue, 11-Dec-2012 16:13:42 GMT; path=/; domain=.google.com; HttpOnly
header: P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
header: X-Content-Type-Options: nosniff
header: Server: HTTP server (unknown)
header: X-XSS-Protection: 1; mode=block
header: Connection: close
最佳答案
未找到动词、形容词,因为它们是通过 AJAX 调用加载的。您的 mechanize 浏览器没有 JavaScript。因此它无法执行任何 AJAX。但是,如果您可以查看浏览器的检查器或其他东西,您将看到调用的 header 、URL 和参数。现在剩下要做的就是模仿调用。
我 curl 了它,我得到了一个 JSON 响应:
thrustmaster@thrustmaster:~/Temp$ curl 'http://translate.google.com/translate_a/t?client=t&text=test&hl=en&sl=en&tl=es&multires=1&ssel=0&tsel=0&sc=1' -H 'User-Agent: blah'
[[["prueba","test","",""]],[["noun",["prueba","ensayo","test","examen","an�lisis","criterio","toque","ejercicio","tanteo"],[["prueba",["test","proof","evidence","trial","event","race"]],["ensayo",["test","trial","essay","assay","testing","rehearsal"]],["test",["test"]],["examen",["examination","review","exam","test","inspection","quiz"]],["an�lisis",["analysis","test","review","assay","breakdown"]],["criterio",["criterion","judgment","standard","test","view","yardstick"]],["toque",["touch","stroke","test","knock","blast","chime"]],["ejercicio",["exercise","practice","drill","practicing","test","prosecution"]],["tanteo",["score","scoring","trial","test","try","calculation"]]]],["adjective",["de prueba"],[["de prueba",["test","testing","trial","probationary","corrective"]]]],["verb",["probar","comprobar","ensayar","examinar","poner a prueba","experimentar","someter a prueba","interrogar","hacer investigaciones","justificar","graduar"],[["probar",["test","try","prove","taste","try out","sample"]],["comprobar",["check","test","prove","ascertain","make sure","substantiate"]],["ensayar",["test","try","rehearse","try out","assay","essay"]],["examinar",["examine","consider","review","look at","explore","test"]],["poner a prueba",["test","try","try out","prove","tempt","put through his paces"]],["experimentar",["experience","experiment","undergo","experiment with","feel","test"]],["someter a prueba",["test","try out","touch"]],["interrogar",["question","interrogate","examine","cross-examine","ask","test"]],["hacer investigaciones",["test"]],["justificar",["justify","warrant","substantiate","prove","make good","test"]],["graduar",["graduate","grade","calibrate","time","test"]]]]],"en",,[["prueba",[5],1,0,1000,0,1,0]],[["test",4,,,""],["test",5,[["prueba",1000,1,0],["prueba de",0,1,0],["ensayo",0,1,0],["de prueba",0,1,0],["test",0,1,0]],[[0,4]],"test"]],,,[["en"]],5]thrustmaster@thrustmaster:~/Temp$
现在,可能在您的脚本中,您必须从以下 URL 获取响应:
附注:
正如您所说,如果您计划使用此脚本,这可能是 TOS 问题。在 API 上使用它始终是更好的选择。您所依赖的 HTML 可以随时更改。
关于python - urllib2, Mechanize 返回的结果与浏览器不同 - 还有什么可以欺骗的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10983772/
如有任何帮助,我将不胜感激。我使用 Python 3.4.1 并尝试导入 urllib.request 和 urllib.parse。没有成功。我总是收到: Traceback (most recen
我正在尝试一个教程代码,它从一个网站获取 html 代码并打印出来。我在 ubuntu 上使用 python 3.4.0。代码: import urllib.request page = urllib
根据这个answer几年前给出了一个相同的问题,Javascript 中的 encodeURIComponent(str) 应该等同于 Python 中的 urllib.quote(str, safe
1。弃用问题 在 Python 3.7 中,我使用 urllib.request.urlretrieve(..) 函数从 URL 下载了一个大文件。在文档 ( https://docs.python.
在 python 3 中,导入时出现此错误:没有名为“urllib.request.urlretrieve”的模块; “urllib.request”不是一个包 import urllib impor
import urllib print urllib.urlopen('http://www.reefgeek.com/equipment/Controllers_&_Monitors/Neptune
我在 gooogle colab 中使用来自 parselmouth 的 praat,在导入 from parselmouth.praat import call 时出现此错误 /usr/local/
是否有与 Python 的 urllib.parse.quote() 等效的 JavaScript 函数?和 urllib.parse.unquote() ? 我遇到的最接近的是encodeURI()
这个问题在这里已经有了答案: Importing installed package from script with the same name raises "AttributeError: m
Python 的 urllib.quote 和 urllib.unquote 在 Python 2.6.5 中无法正确处理 Unicode。这就是发生的事情: In [5]: print urllib
这个问题在这里已经有了答案: How to route urllib requests through the TOR network? [duplicate] (3 个回答) 关闭6年前。 示例代码
我正在制作一些简单的 python 帖子脚本,但效果不佳。 有两部分必须登录。 第一次登录使用' http://mybuddy.buddybuddy.co.kr/userinfo/UserInfo.a
我有以下脚本: from currency_converter import CurrencyConverter test = CurrencyConverter('http://www.ecb.eu
我正在编写一个小工具来监控学校的开课情况。 我编写了一个 python 脚本,每隔几分钟就会从每个部门获取当前类(class)的可用性。 该脚本一直正常运行,直到大学网站开始返回以下内容: SIS S
为什么下面的结果会出错? import re from urllib import quote as q s = re.compile(r'[^a-zA-Z0-9.: ^*$@!+_?-]') s.s
我正在开发一个网络爬虫来自动下载巴西网站上的一些文档。并且它使用了一些未知的编码(head 标签中没有定义字符集)。 人们只需付出很少的努力就可以阅读这些文档。但真正的问题是,列出文档的页面使用的链接
我有一个程序,我需要打开许多网页并下载其中的信息。然而,这些信息位于页面中间,需要很长时间才能找到。有没有办法让 urllib 只检索 x 行?或者,如果没有别的事,之后就不加载信息? 我在 Mac
我有一个脚本,使用 Urllib 打开我安装了谷歌分析的网页。我的问题是,为什么如果我执行脚本,GA 上不会显示访问次数? 最佳答案 Google Analytics 脚本是 JavaScript 代
我正在尝试下载航类搜索结果,但我不断收到一个与通过右键单击并手动存储网站获得的文件不同的文件。我已经尝试过 urllib 、 urllib2 以及我在这里找到的每个命令都无济于事。 这是一个 MWE:
我最近用Python(Windows 64位v3.3.1)编写了一个程序,并试图将其移植到D。我遇到的问题是我使用了urllib Python 中的模块,特别是 urllib.request.Requ
我是一名优秀的程序员,十分优秀!