2

ここ (http://oktaykilic.com/my-projects/google-alerts-api-python/) で Python API が販売されていることは知っていますが、なぜ現在の方法を採用しているのかを理解したいと思います。動作していません。

これが私がこれまでに持っているものです:

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 のカスタム ドロップダウン メニューの値を変更する方法もわかりません。何か案は?

ありがとう

4

2 に答える 2

2

カスタム ドロップダウン メニューは JavaScript を使用して作成されるため、適切な解決策は、URL パラメーターを把握してから再現することです (これが、現在期待どおりに機能しない理由である可能性があります。必要な URL を省略しています)。ブラウザでサイトにアクセスしたときに JavaScript によって通常設定されるパラメータ)。

怠惰な解決策は、galertsライブラリを使用することです。必要なことを正確に行うようです。

mechanize(または一般的なスクリーン スクレイピング) を含む将来のプロジェクトのためのいくつかのヒント:

  • 非常に便利な HTTP デバッグ ツールであるFiddlerを使用します。ほとんどのブラウザからの HTTP トラフィックをキャプチャし、ブラウザが何を要求しているかを正確に確認できます。その後、目的のリクエストを手動で作成できます。うまくいかない場合は、比較するだけです。Firebug やGoogle Chrome の開発者ツールなどのツールも、特に大量の非同期リクエストの場合に便利です。set_proxies( Fiddler で使用するには、ブラウザー オブジェクトを呼び出す必要があります。ドキュメントを参照してください)
  • デバッグ目的で、次のようにしfor f in self.forms(): print fます。これにより、ページ上で認識されたすべてのフォームが機械化され、その名前とともに表示されます。
  • Cookie の処理は繰り返し行われるため、驚きです。- 自動化する簡単な方法があります。ブラウザ クラス コンストラクタでこれを行うだけですself.set_cookiejar(cookielib.CookieJar())。これにより、Cookie が自動的に追跡されます。
  • 私は長い間、BeautifulSoup のようなカスタム パースに依存してきました (そして、いくつかの特殊なケースでは今でもそれを使用しています) が、ほとんどの場合、Web スクリーン スクレイピングの最速のアプローチはXPathを使用することです(たとえば、lxml非常に優れた実装があります)。
于 2011-08-26T02:58:52.793 に答える
2

Mechanize は JavaScript を処理せず、ドロップダウン メニューは JS です。JavaScript が関係する自動化を行いたい場合は、Python バインディングも備えた Selenium を使用することをお勧めします。

http://seleniumhq.org/

于 2011-08-26T07:01:35.337 に答える