簡體   English   中英

從第二次開始,用戶在使用 Flask 構建的網站上提交表單后,無法成功執行 python 網頁抓取腳本

[英]Unable to execute python web scraping script successfully after user submits a form on a website built with Flask from the second time onwards

使用 Flask 和 Python,我有一個在 localhost 上運行的網站,它允許用戶選擇特定月份來下載報告。 根據選定的月份,我將導入我的網絡抓取文件,該文件從另一個網站檢索數據(需要登錄)。 我的網頁抓取腳本使用 Mechanize。

這是單擊下載按鈕后導入我的網絡抓取文件 (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 %}

我遇到的問題是當我想進一步下載時,即第一次下載后,我回到辦公室頁面並再次下載報告。 第二次嘗試時,將顯示成功消息,但沒有下載任何內容。

在我的網頁抓取腳本中,使用 mechanize 和 cookiejar,一開始我有這幾行代碼:

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

然后我繼續進行網絡抓取。

在我的終端(或命令提示符)上運行網絡抓取文件時,即使我第二次或第三次運行該腳本,該腳本也可以毫無問題地執行。 所以我認為這可能是網站代碼的問題。

任何建議將不勝感激! 我嘗試了解決問題的不同方法,例如改用返回重定向,或嘗試清除 cookiejar 中的 cookie。 到目前為止都沒有工作,或者我可能錯誤地使用了這些方法。

先感謝您!

一旦您的 Flask 應用程序啟動,它只會導入每個包一次。 這意味着當它第二次運行import webscrape時,它會說“好吧,我之前已經導入了它,所以不需要采取進一步的行動……”然后移動到下一行,在不實際啟動腳本的情況下渲染模板。

從這個意義上說,Python 中的import與其他語言的require不同(例如 PHP;順便說一下,它更接近 PHP 中的require_once )。

解決方案是使您的刮刀成為一個對象( class )並在每次需要時實例化它。 然后將導入移動到文件的頂部,並在if request.method=='POST'創建一個新的網絡爬蟲實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM