1

Python を使用して特定のタスクを自動化することに興味があります。具体的には、Python を使用して Web サイトと対話し、ページから特定の情報を取得する、要求を行う (POST データと応答を読み取る)、ファイルのダウンロードとアップロードなどのタスクを実行したいと考えています。これまでのところ、urllib2 を使用してページから HTML を取得するために Python を使用することしかできませんでした。次に試したのは、ページにリクエストを送信することでした。何度か試みましたが、すべて失敗しました。

    >>> import urllib2
    >>> import urllib
    >>> url = "http://www.stackoverflow.com/"
    >>> values = {}
    >>> values["input"] = "foo"
    >>> data = urllib.urlencode(values)
    >>> request = urllib2.Request(url + "search/", data)
    >>> response = urllib2.urlopen(request)
    >>> html = response.read()
    >>> print html

これまでのところ、フィールドと入力の名前で辞書を作成し、それを urllib.urllencode(values) でエンコードする必要があることを理解しています。次に、urllib2.Request(theUrlRecomingTheRequest, data, headers) を使用してリクエストを作成する必要があります。これは、URL が指定されている場合は GET のみですが、データが指定されている場合は POST し、プログラムを偽装できるヘッダーを指定できます。 Firefox や IE などの一般的なブラウザ。次に、オブジェクトのようなファイルを返す urllib2.urlopen(request) で応答を取得し、その結果、read() を実行できます。私が理解しているように、ハンドラー (Cookie、リダイレクト、認証などを処理できる) を受け取り、.addheaders("User-Agent", "") を使用してヘッダーを追加できる urllib2.build_opener() を使用することもできます。最終的にはこれらすべてを実行できるようになりたい (そして理解できるようになりたい) のですが、まず、フォームを送信してもらいたいだけです。Python との対話型セッションからの上記のコードで、正しい手順に従ったでしょうか? (スタックオーバーフローのフロントページの検索フィールドに「foo」の検索を入力しようとしていました。)

4

2 に答える 2

7

urllib2 の代わりに requests使用すると、作業が楽になります。リクエスト API を使用した例を次に示します。

import requests
r=requests.post("http://www.stackoverflow.com/search/",data={'input':'foo'})
print r.text
于 2012-04-27T19:58:08.180 に答える
0

GETメソッドを使用して検索結果を取得したいだけの場合は、FORMのhtmlコードを調べることができます。 <form id="search" action="/search" method="get" autocomplete="off"> <div> <input autocomplete="off" name="q" class="textbox" placeholder="search" tabindex="1" type="text" maxlength="140" size="28" value="foo" style="width: 200px; max-width: 200px; "> </div> </form>

アクションは「/search」です。入力名は「q」なので、リクエストのURLはhttps://stackoverflow.com/search?q=fooになります。

したがって、urllib2を使用して上記のURLを開くだけで機能します。

urllib2が追加するので、「ユーザーエージェント」のようなリクエストヘッダーについて心配する必要はありませんが、明示的に設定することができます。

これを機能させるには、「input」を「q」に変更し、リクエストで「data」パラメータを使用しないようにする必要があります。そうしないと、GET以外のPOSTが使用され、プログラムは次のようになります。

import urllib2
import urllib
url = "http://www.stackoverflow.com/"
values = {}
values["q"] = "foo"
data = urllib.urlencode(values)
request = urllib2.Request(url + "search" +"?"+ data)
response = urllib2.urlopen(request)
html = response.read()
print html

enter code here
于 2012-04-26T23:38:00.037 に答える