urllib2, механизм не возвращается так же, как браузер - что еще подделать?

Я пытаюсь создать сценарий (чисто в учебных целях) для перевода заданного слова с помощью нескольких разных словарей. Я прошел через два, используя urllib2 и beautifulsoup для получения и анализа переводов, а затем перешел к переводчику Google.

Я быстро обнаружил, что он возвращает 403 запрещенную ошибку. Добавление пользовательского агента дает перевод, но перевод только одного слова. Чтобы проиллюстрировать это, перейдите на страницу http://translate.google.com/?text=test&sl=en&tl=es, и вы получите как перевод (в классе под названием "hps"), так и список глаголов, существительных и прилагательных. Но используйте сценарий ниже, и HTML будет другим, с возвращением только основного перевода, а в

span id=result_box

Глаголов, существительных и т. Д. Не найти.

Во время этого процесса, немного погуглил, я узнал, что теперь есть API, причем не бесплатный. Я не собираюсь публиковать какой-либо возможный сценарий или использовать его для нарушения каких-либо TOS, но теперь меня больше всего заинтриговало, почему разница между браузером и urllib и т. Д.

Для этого я попробовал чистый urllib2 с пользовательскими агентами и механизировать - как показано ниже. Итак, мой вопрос - помимо пользовательского агента, что еще отличает браузер от скрипта Python? Я пробовал использовать firebug, но у меня ничего не выскочило (хоть я и новичок с этим). Спасибо!

изменить: заголовки запросов от firebug и мой скрипт приведены ниже.

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 'ответ:' HTTP / 1.1 Заголовок 200 OK \ r \ n ': Дата: Пн, 11 июня 2012 г., 16:13:42 GMT

заголовок: Срок действия истекает: Fri, 01 Jan 1990 00:00:00 GMT

заголовок: Cache-Control: no-cache, must-revalidate

заголовок: Pragma: no-cache

заголовок: X-Frame-Options: SAMEORIGIN

заголовок: Content-Type: text / html; charset = UTF-8

заголовок: Content-Language: en

заголовок: Set-Cookie: PREF = ID = 6dd42f2264250d7c: TM = 1333431222: LM = 1339454222: S = k6JXSoGGaAMNmPEo; expires = среда, 11 июня 2014 г., 16:13:42 GMT; путь = /; domain = .google.com

Заголовок: Set-Cookie: NID = 60 = f8czmR413h3sKUGJUUM4PLKl2O7SUtqfW5hss5O54sRKoErf9wIEU4Wu2WCuHzWTJQ3p1Rj7dQv1B4BBmSMY1tmfcwrvgv5; expires = Вт, 11 декабря 2012 г. 16:13:42 GMT; путь = /; домен = .google.com; HttpOnly

header: P3P: CP = "Это не политика P3P! См. http://www.google.com/support/accounts/bin/answer.py?hl=ru&answer=151657 для получения дополнительной информации".

заголовок: X-Content-Type-Options: nosniff

заголовок: Сервер: HTTP-сервер (неизвестно)

заголовок: X-XSS-Protection: 1; режим = блок

заголовок: Подключение: закрыть


person commentator8    schedule 11.06.2012    source источник


Ответы (1)


Глаголы и прилагательные не обнаруживаются, потому что они загружаются через вызов AJAX. В вашем браузере Mechanize нет javascript. Следовательно, он не может использовать AJAX. Однако, если бы вы могли заглянуть в инспектор своего браузера или что-то в этом роде, вы бы увидели заголовки, URL-адрес и параметры вызова. Все, что остается делать сейчас, - это имитировать призыв.

Я скрутил его и получил ответ в формате 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:

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

PS:

Как вы сказали, это может быть проблема TOS, если вы планируете использовать этот скрипт. Это всегда лучший выбор для использования в API. HTML, на который вы полагаетесь, может измениться в любое время.

person UltraInstinct    schedule 11.06.2012
comment
Огромное спасибо! Здесь есть какие-нибудь простые способы загрузить страницу вместе с AJAX и т.д., как браузер, через python? - person commentator8; 11.06.2012
comment
Когда-то использовал его в качестве инструмента тестирования веб-приложения, но у меня сложилось впечатление, что он предназначен в основном для тестирования графического интерфейса. - person commentator8; 12.06.2012
comment
@Thrustmaster Эти официальные API платные. Это неприемлемо. Я не занимаюсь бизнесом, я обычный пользователь, использующий интерфейс командной строки вместо веб-браузера. Но кого волнуют меньшинства, верно ... - person rr-; 08.04.2015