Как я могу автоматически добавлять оповещения Google, используя Python Mechanize - PullRequest
2 голосов
/ 26 августа 2011

Мне известно о Python API для продажи здесь (http://oktaykilic.com/my-projects/google-alerts-api-python/),, но я бы хотел понять, почему то, как я это делаю сейчас, не работает.

Вот что у меня есть:

class GAlerts():

def __init__(self, uName = 'USERNAME', passWord = 'PASSWORD'):

    self.uName = uName
    self.passWord = passWord

def addAlert(self):

    self.cj = mechanize.CookieJar()
    loginURL = 'https://www.google.com/accounts/ServiceLogin?hl=en&service=alerts&continue=http://www.google.com/alerts'
    alertsURL = 'http://www.google.com/alerts'

    #log into google
    initialRequest = mechanize.Request(loginURL)
    response = mechanize.urlopen(initialRequest)

    #put in form info
    forms = ClientForm.ParseResponse(response, backwards_compat=False)
    forms[0]['Email'] = self.uName
    forms[0]['Passwd'] = self.passWord

    #click form and get cookies
    request2 = forms[0].click()
    response2 = mechanize.urlopen(request2)
    self.cj.extract_cookies(response, initialRequest)


    #now go to alerts page with cookies
    request3 = mechanize.Request(alertsURL)
    self.cj.add_cookie_header(request3)
    response3 = mechanize.urlopen(request3)

    #parse forms on this page
    formsAdd = ClientForm.ParseResponse(response3, backwards_compat=False)
    formsAdd[0]['q'] = 'Hines Ward'

    #click it and submit
    request4 = formsAdd[0].click()
    self.cj.add_cookie_header(request4)
    response4 = mechanize.urlopen(request4)
    print response4.read()


myAlerter = GAlerts()
myAlerter.addAlert()

Насколько я могу судить, он успешно входит в систему и попадает на домашнюю страницу добавления оповещений, но когда я ввожу запрос и нажимаю кнопку "Отправить", он отправляет меня на страницу с надписью "Пожалуйста, введите действительный адрес электронной почты". ». Я пропускаю какую-то аутентификацию? Я также не понимаю, как изменить значения в пользовательских выпадающих меню Google? Есть идеи?

Спасибо

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

Mechanize не обрабатывает JavaScript, и эти выпадающие меню - JS.Если вы хотите автоматизировать работу с JavaScript, я предлагаю использовать Selenium, который также имеет привязки Python.

http://seleniumhq.org/

2 голосов
/ 26 августа 2011

Настраиваемые раскрывающиеся меню создаются с использованием JavaScript, поэтому правильным решением будет выяснить параметры URL-адреса и затем попытаться воспроизвести их (это может быть причиной того, что сейчас это не работает должным образом - вы пропуская обязательные параметры URL, которые обычно устанавливаются JavaScript при посещении сайта в браузере).

Ленивое решение - использовать библиотеку galerts, похоже, она делает именно то, что вам нужно.

Несколько советов по будущим проектам, связанным с mechanize (или очисткой экрана в целом):

  • Используйте Fiddler , чрезвычайно полезный инструмент отладки HTTP. Он захватывает HTTP-трафик из большинства браузеров и позволяет вам видеть, что именно запрашивает ваш браузер. Затем вы можете создать желаемый запрос вручную, и в случае, если он не работает, вам просто нужно сравнить. Такие инструменты, как Firebug или Инструменты разработчика Google Chrome также пригодятся, особенно для большого количества асинхронных запросов. (Вы должны вызвать set_proxies на объекте вашего браузера, чтобы использовать его с Fiddler, см. документацию)
  • Для целей отладки сделайте что-то вроде for f in self.forms(): print f. Здесь показаны все формы, распознанные на странице, вместе с их именем.
  • Обработка печенья повторяется, так что - сюрприз! - есть простой способ автоматизировать это. Просто сделайте это в конструкторе вашего браузера: self.set_cookiejar(cookielib.CookieJar()). Это автоматически отслеживает файлы cookie.
  • Я давно полагаюсь на пользовательские парсинги, такие как BeautifulSoup (и до сих пор использую его для некоторых особых случаев), но в большинстве случаев самый быстрый подход к просмотру веб-экрана - это использование XPath (например, , lxml имеет очень хорошую реализацию).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...