26

私が提供した名前の曲の歌詞を見つけるプログラムを Python を使用して作成することを考えています。プロセス全体は、以下のいくつかに要約する必要があると思います。これらは、実行時にプログラムに実行させたいことです。

  • 曲名の入力を促す
  • その名前をコピー
  • Web ブラウザー (Google Chrome など) を開きます。
  • その名前をアドレスバーに貼り付けて、曲に関する情報を見つけます
  • 歌詞のあるページを開く
  • その歌詞をコピー
  • テキスト エディタを実行します (Microsoft Word など)。
  • 歌詞を貼り付けます
  • 曲の名前で新しいテキスト ファイルを保存します。

もちろん、コードを要求しているわけではありません。Python を使用して他のプログラムとやり取りする方法についての概念やアイデアを知りたいだけです。

より具体的に言うと、キツネの例で、Google Chrome のアドレス バーの場所を指摘し、そこに名前を貼り付けるように python に指示する方法を知りたいと思います。または、歌詞をコピーして Microsof Word のシートに貼り付けて保存する方法を python に指示する方法。

私はPythonに関するいくつかの本を読んでいます(私はまだ読んでいます):Byte of python、Learn python the hard way、Python for dummies、Beginning Game Development with Python and Pygame。しかし、私は自分自身で動作するプログラムを作成することだけを (またはほとんど) 学んでいるように見えることがわかりました (自分のプログラムに、自分のコンピューターに既にインストールされている他のプログラムで自分のやりたいことをするように指示することはできません)。

私の質問がどこかばかげているように聞こえることはわかっていますが、それがどのように機能するか、Google Chrome ブラウザーのこの部分がアドレス バーであり、曲の名前を貼り付ける必要があることを Python に認識させる方法を知りたいと思っています。それ。Pythonを別のプログラムと対話させるという全体的な考えは、私には本当に漠然としていて、それを非常に理解したいと思っています。

私の長い質問を読んでくれた皆さん、ありがとう。

ttriet204

4

5 に答える 5

42

あなたが本当に調べていることが、他のアプリとのやり取りの仕方を独学するための良い言い訳であるなら、これは最善の方法ではないかもしれません. Web ブラウザーは厄介で、タイミングが予測できないなどです。つまり、非常に難しいタスクを引き受けたことになります。通常の方法 (サーバーと直接対話し、他のプログラムに触れることなく、テキストファイルを直接、など)。

ただし、他のアプリとやり取りしたい場合は、さまざまなアプローチがあり、対処する必要があるアプリの種類によって適切な方法が異なります。

  • 一部のアプリは、外部から自動化されるように設計されています。Windows では、これはほとんどの場合、COM インターフェースを意味し、通常は IDispatch インターフェースを使用して、pywin32の COM ラッパーを使用できます。ScriptingBridgeMac では、またはappscript;を使用する AppleEvent インターフェイスを意味します。他のプラットフォームでは、普遍的な標準はありません。IE (おそらく Chrome ではない) と Word の両方に、このようなインターフェイスがあります。

  • 一部のアプリには非 GUI インターフェースがあります。これは、 で操作できるコマンド ラインであるpopenか、 でロードできる DLL/SO/DYLIB ですctypes。または、理想的には、他の誰かがすでに Python バインディングを作成しています。

  • 一部のアプリには GUI しかなく、GUI の自動化を回避する方法はありません。これは、Windows で送信する WM_ メッセージを作成するpywin32、Mac でアクセシビリティ API を使用するなどの低pywinautoレベルで行うことができseleniumます。特定のアプリを自動化するために構築されました。

したがって、これは、Chrome のセレンや Word の COM オートメーションから、すべての WM_ メッセージを自分で作成することまで、何でも行うことができます。これが学習演習を意図している場合、問題は、今日、これらのうちどれを学びたいかということです。


COMオートメーションから始めましょう。を使用するpywin32と、ユーザーから GUI を制御したり、メニューやダイアログ ボックスをナビゲートする方法を理解したりする必要なく、アプリケーション独自のスクリプト インターフェイスに直接アクセスできます。これは、「Word マクロ」の記述の最新バージョンです。 Word 内ではなく外部スクリプトであり、VB で記述する必要はありませんが、見た目はかなり似ています。スクリプトの最後の部分は次のようになります。

word = win32com.client.dispatch('Word.Application')
word.Visible = True
doc = word.Documents.Add()
doc.Selection.TypeText(my_string)
doc.SaveAs(r'C:\TestFiles\TestDoc.doc')

Microsoft Word Scriptsを見ると、たくさんの例を見ることができます。ただし、VBScript で記述されていることに気付くかもしれません。チュートリアルを探してみると、それらはすべて VBScript (または古い VB) 用に書かれています。また、ほとんどのアプリのドキュメントは、VBScript (または VB、.NET、さらには低レベルの COM) 向けに書かれています。また、Python から COM オートメーションを使用するために私が知っているすべてのチュートリアル ( Quick Start to Client Side COM and Python など)、COM オートメーションについて既に知っていて、Python からそれを行う方法を知りたいだけの人向けに書かれています。Microsoft がすべての名前を変更し続けているという事実は、検索をさらに困難にしています。OLE オートメーション、ActiveX スクリプト、Windows Scripting House などをグーグルで検索することが、COM オートメーションについて学ぶことに何の関係があると思いますか? そのため、初心者に何をお勧めすればよいかわかりません。すべてのナンセンスを学べば、上記の例と同じくらい簡単だと約束できますが、その最初のハードルを乗り越える方法がわかりません。

とにかく、すべてのアプリケーションが自動化できるわけではありません。場合によっては、たとえそうであったとしても、GUI アクション (ユーザーが画面上でクリックするもの) を記述する方が、アプリのオブジェクト モデルの観点から考えるよりも簡単です。「3 番目の段落を選択する」を GUI 用語で説明するのは難しいですが、「ドキュメント全体を選択する」は簡単です。control-A を押すか、[編集] メニューから [すべて選択] に移動するだけです。GUI の自動化は、COM の自動化よりもはるかに困難です。なぜなら、Windows 自体がユーザー アクションを表すために送信するのと同じメッセージをアプリに送信する必要があるか (たとえば、「メニュー通知」を参照)、さらに悪いことに、「go (32 、4) 左上隅からピクセルをクリックし、マウスを 16 ピクセル下に移動し、もう一度クリックします」と言うと、「[ファイル] メニューを開いて、[新規] をクリックします」となります。

幸いなことに、pywinauto両方の種類の GUI 自動化をまとめて、はるかに簡単にするようなツールがあります。swapyそして、送信したいコマンドを理解するのに役立つツールがあります。Python に慣れていない場合は、 や のようなツールもAutoItあり、少なくともActions使い始めたばかりのときは や を使用するよりも簡単です。このようにすると、スクリプトの最後の部分は次のようになります。swapypywinauto

word.Activate()
word.MenuSelect('File->New')
word.KeyStrokes(my_string)
word.MenuSelect('File->Save As')
word.Dialogs[-1].FindTextField('Filename').Select()
word.KeyStrokes(r'C:\TestFiles\TestDoc.doc')
word.Dialogs[-1].FindButton('OK').Click()

最後に、これらすべてのツールを使用しても、Web ブラウザーを自動化するのは非常に困難です。各 Web ページには、Windows コントロールではなく HTML である独自のメニューやボタンなどがあるためです。「マウスを 12 ピクセル動かす」というレベルまで行きたくない限り、これらを扱うのは非常に困難です。そこで、Windows GUIseleniumをスクリプト化するのと同じ方法で Web GUI をスクリプト化します。pywinauto

于 2013-01-11T23:32:24.300 に答える
15

次のスクリプトは、Automaを使用して、必要なことを正確に実行します (Word 2010 でテスト済み)。

def find_lyrics():
    print 'Please minimize all other open windows, then enter the song:'
    song = raw_input()
    start("Google Chrome")
    # Disable Google's autocompletion and set the language to English:
    google_address = 'google.com/webhp?complete=0&hl=en'
    write(google_address, into="Address")
    press(ENTER)
    write(song + ' lyrics filetype:txt')
    click("I'm Feeling Lucky")
    press(CTRL + 'a', CTRL + 'c')
    press(ALT + F4)
    start("Microsoft Word")
    press(CTRL + 'v')
    press(CTRL + 's')
    click("Desktop")
    write(song + ' lyrics', into="File name")
    click("Save")
    press(ALT + F4)
    print("\nThe lyrics have been saved in file '%s lyrics' "
          "on your desktop." % song)

自分で試してみるには、そのダウンロード ページから Automa.zip をダウンロードし、たとえばc:\Program Files. というフォルダができますAutoma 1.1.2Automa.exeそのフォルダで実行します。上記のコードをコピーし、コンソール ウィンドウを右クリックして Automa に貼り付けます。Enter を 2 回押して、ウィンドウ内の最後の入力を取り除き...、プロンプトに戻ります>>>。開いている他のすべてのウィンドウを閉じて、

>>> find_lyrics()

これにより、必要な手順が実行されます。

Automaは Python ライブラリです: そのように使用するには、次の行を追加する必要があります

from automa.api import *

library.zipをスクリプトの先頭に追加し、Automa のインストール ディレクトリから環境変数にファイルを追加しますPYTHONPATH

他にご不明な点がございましたら、お気軽にお問い合わせください:-)

于 2013-01-13T14:35:54.110 に答える
12

@Matteo Italia のコメントのPython での実装は次のとおりです。

「プログラマーの視点」からアプローチする必要があるときに、「ユーザーの視点」から問題にアプローチしています。ブラウザーを開いたり、テキストをコピーしたり、Word を開いたりする必要はありません。適切な HTTP 要求を実行し、関連する HTML を解析し、テキストを抽出して、Python スクリプト内からファイルに書き込む必要があります。これを行うためのツールはすべて Python で利用できます (特に、urllib2 と BeautifulSoup が必要です)。

#!/usr/bin/env python
import codecs
import json
import sys
import urllib
import urllib2

import bs4  # pip install beautifulsoup4

def extract_lyrics(page):
    """Extract lyrics text from given lyrics.wikia.com html page."""
    soup = bs4.BeautifulSoup(page)
    result = []
    for tag in soup.find('div', 'lyricbox'):
        if isinstance(tag, bs4.NavigableString):
            if not isinstance(tag, bs4.element.Comment):
                result.append(tag)
        elif tag.name == 'br':
            result.append('\n')
    return "".join(result)

# get artist, song to search
artist = raw_input("Enter artist:")
song = raw_input("Enter song:")

# make request
query = urllib.urlencode(dict(artist=artist, song=song, fmt="realjson"))
response = urllib2.urlopen("http://lyrics.wikia.com/api.php?" + query)
data = json.load(response)

if data['lyrics'] != 'Not found':
    # print short lyrics
    print(data['lyrics'])
    # get full lyrics
    lyrics = extract_lyrics(urllib2.urlopen(data['url']))
    # save to file
    filename = "[%s] [%s] lyrics.txt" % (data['artist'], data['song'])
    with codecs.open(filename, 'w', encoding='utf-8') as output_file:
        output_file.write(lyrics)
    print("written '%s'" % filename)
else:
    sys.exit('not found')

$ printf "Queen\nWe are the Champions" | python get-lyrics.py 

出力

会費を支払いました
何度も何度も
私は私の文をやった
しかし、罪を犯したことはありません

そして悪い間違い
いくつか作りました
私は砂を蹴ってもらいました[...]
「[Queen] [We are the Champions] Lyrics.txt」と書かれています
于 2013-01-15T12:42:48.160 に答える
5

本当にブラウザなどを開きたい場合は、seleniumを見てください。しかし、それはあなたの目的にとってはやり過ぎです。Seleniumは、さまざまなブラウザーで Web サイトの外観をテストするためのボタン クリックなどをシミュレートするために使用されます。

あなたが本当にやりたいことは、ブラウザー (または他のプログラム) がフードの下でどのように動作するかを理解することです。つまり、マウスをクリックするか、キーボードで入力するか、ヒットSaveすると、プログラムは舞台裏で何をしますか? Python コードに実行させたいのは、この舞台裏の作業です。

したがって、、または (または、さらには ) を使用urlliburllib2requestsWebページを要求します (URL を Google 検索または歌詞 Web サイトscrapyの php 要求にまとめる方法を学びます)。GETGoogle には、Google 検索を実行するために利用できる検索 APIもあります。

xmlページ リクエストの結果を取得したら、beautifulsoup、 、 などで解析しlxlml、必要な情報を含むリクエスト結果のセクションを見つけます。

歌詞ができたので、最も簡単なことは、テキスト ファイルを開いてそこに歌詞をダンプし、ディスクに書き込むことです。しかし、どうしても MS Word でやり​​たい場合はdoc、メモ帳またはメモ帳++でファイルを開いて、その構造を調べてください。ここで、Python を使用して同様の構造を持つドキュメントを作成します。コンテンツはダウンロードした歌詞になります。
この方法が失敗した場合は、pywinautoなどを調べて、MS Word ドキュメントへのテキストの貼り付けとクリックを自動化できます。Save

引用:OPのコメントからのMatteo Italia、gddc

于 2013-01-11T23:28:58.233 に答える
1

seleniumWeb ブラウザーと対話するために呼び出されたパッケージを調べる必要があります。

于 2013-01-11T23:16:20.130 に答える