1

Flask と Python を使用して、ユーザーがレポートをダウンロードする特定の月を選択できる localhost で実行されている Web サイトを持っています。選択した月に基づいて、別の Web サイトからデータを取得する Web スクレイピング ファイルをインポートします (ログインが必要です)。私の Web スクレイピング スクリプトは Mechanize を使用しています。

これは、ダウンロード ボタンがクリックされた後に私の Web スクレイピング ファイル (webscrape.py) がインポートされるコードの一部です (選択は office.html で行われます)。

@app.route('/office/', methods=['GET','POST'])
def office():
    form=reportDownload()
    if request.method=='POST':
        import webscrape
        return render_template('office.html', success=True)
    elif request.method=='GET':
        return render_template('office.html', form=form)

render_template メソッドでは、success=True が引数として渡されるため、私の office.html スクリプトは成功メッセージを表示します。そうでない場合 (GET 要求の場合)、ユーザー選択用のフォームを表示します。これがoffice.htmlの私のスクリプトです:

{% extends "layout.html" %}
{% block content %}
  <h2>Office</h2>
  {% if success %}
    <p>Report was downloaded successfully!</p>
  {% else %}
    <form action="{{ url_for('office') }}" method="POST">
      <table width="70%" align="center" cellpadding="20">
      <tr>
        <td align="right"><p>Download report for: </p></td>
        <td align="center"><p>Location</p>
                  {{form.location}}</td>
        <td align="center"><p>Month</p> 
                             {{form.month}}  </td>
        <td align="center"><p>Year</p>   
                             {{form.year}}  </td>
      </tr>
      <tr>
        <td></td>
        <td></td>
        <td></td>
        <td align="center">{{form.submit}} </td>
      </tr>
    </table>
   </form>
   {% endif %}
{% endblock %}

私が抱えている問題は、さらにダウンロードしたいときです。つまり、初めてダウンロードした後、オフィスのページに戻ってレポートを再度ダウンロードします。2 回目の試行では、成功メッセージが表示されますが、何もダウンロードされません。

mechanize と cookiejar を使用する私の Web スクレイピング スクリプトでは、最初に次の数行のコードがあります。

  br = mechanize.Browser()
  cj = cookielib.LWPCookieJar()
  br.set_cookiejar(cj)

そして、Webスクレイピングを進めます。

ターミナル (またはコマンド プロンプト) で Web スクレイピング ファイルを実行すると、スクリプトを 2 回または 3 回実行しても問題なく実行されます。そのため、ウェブサイトのコードに問題がある可能性があると思います。

どんな提案でも大歓迎です!代わりにリターンリダイレクトを使用するか、cookiejar の Cookie をクリアしようとするなど、問題を解決するさまざまな方法を試しました。これまでのところ何も機能していないか、メソッドを間違って使用している可能性があります。

前もって感謝します!

4

1 に答える 1

1

Flask アプリが開始されると、各パッケージは 1 回だけインポートされます。つまりimport webscrape、2 回目に実行すると、「まあ、以前にインポートしたので、これ以上のアクションを実行する必要はありません...」と表示され、次の行に移動して、実際にスクリプトを開始せずにテンプレートをレンダリングします。

その意味importで、Python は他の言語と同じではありませんrequire(PHP など。ちなみに、PHP の方が近いでしょうrequire_once)。

解決策は、スクレーパーをオブジェクト ( class) にして、必要になるたびにインスタンス化することです。次に、インポートをファイルの先頭に移動し、その中にif request.method=='POST'Web スクレイパーの新しいインスタンスを作成します。

于 2014-12-18T11:18:39.977 に答える