繁体   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