You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask实现CSV上传后登录爬取:代码位置与上传无响应排查

解决Flask CSV上传关联与登录爬取整合问题

1. 先修复前端表单关联问题

你的upload_page.html表单必须正确指向后端处理路由,并且设置正确的编码类型,否则文件无法上传,点击按钮无响应。修改表单代码如下:

<!-- upload_page.html -->
<form action="/upload" method="POST" enctype="multipart/form-data">
    <input type="file" name="csv_file" accept=".csv">
    <button type="submit">上传并爬取</button>
</form>
  • action="/upload":指定表单提交到后端的/upload路由
  • method="POST":必须用POST方法处理文件上传
  • enctype="multipart/form-data":上传文件时必须设置这个属性,否则后端无法读取文件

2. 后端代码结构与放置位置

所有核心逻辑(路由、上传处理、登录、爬取)可以放在同一个Flask主文件(比如app.py)里,也可以把登录、爬取封装成单独的函数/模块再导入。下面是完整的示例结构:

主文件app.py示例

from flask import Flask, render_template, request
import csv
import requests
from bs4 import BeautifulSoup  # 根据你的爬取需求替换库

app = Flask(__name__)
# 若需处理大文件,可设置上传大小限制(示例:16MB)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

# 复用你已有的登录逻辑,用Session保持登录状态
def login_to_target():
    session = requests.Session()
    # 替换为目标网站的登录地址和参数
    login_url = "https://目标网站登录接口"
    login_payload = {
        "username": "你的账号",
        "password": "你的密码"
    }
    response = session.post(login_url, data=login_payload)
    # 验证登录是否成功(根据目标网站返回内容调整判断逻辑)
    if "登录成功标识" in response.text:
        return session
    raise Exception("登录失败,请检查账号密码或登录接口")

# 单个URL爬取逻辑
def crawl_single_url(session, target_url):
    response = session.get(target_url)
    # 替换为你的数据提取逻辑
    soup = BeautifulSoup(response.text, "html.parser")
    page_title = soup.title.string if soup.title else "无标题"
    return {"url": target_url, "content": page_title}

# 渲染上传页面的路由
@app.route('/')
def show_upload_page():
    return render_template('upload_page.html')

# 处理CSV上传与爬取的核心路由
@app.route('/upload', methods=['POST'])
def handle_upload():
    # 检查文件是否存在
    if 'csv_file' not in request.files:
        return "未选择文件", 400
    file = request.files['csv_file']
    if file.filename == '' or not file.filename.endswith('.csv'):
        return "仅支持上传CSV格式文件", 400
    
    # 读取CSV中的URL列表
    urls = []
    csv_reader = csv.reader(file.stream)
    next(csv_reader)  # 跳过表头(若无表头则删除此行)
    for row in csv_reader:
        if row:
            urls.append(row[0].strip())
    
    # 执行登录并批量爬取
    try:
        login_session = login_to_target()
    except Exception as e:
        return f"登录失败:{str(e)}", 500
    
    crawl_results = []
    for url in urls:
        try:
            result = crawl_single_url(login_session, url)
            crawl_results.append(result)
        except Exception as e:
            crawl_results.append({"url": url, "error": str(e)})
    
    # 返回爬取结果页面(需提前创建results.html模板)
    return render_template('results.html', results=crawl_results)

if __name__ == '__main__':
    app.run(debug=True)

代码放置说明

  • 登录函数:封装为login_to_target,返回requests.Session对象,确保爬取时复用已登录会话,维持登录状态。
  • 爬取函数:封装为crawl_single_url,专注单个页面的数据提取,接收登录会话和目标URL作为参数。
  • 路由逻辑:/路由负责渲染上传页面,/upload路由处理文件上传、CSV解析、登录调用、批量爬取全流程。

3. 上传无响应的常见排查点

  • 前端表单action路径与后端路由@app.route('/upload')不一致:检查路径拼写是否完全匹配。
  • 未设置enctype="multipart/form-data":缺少该属性会导致后端无法读取上传文件。
  • 后端未开启调试模式:运行app.run(debug=True),控制台会输出具体错误信息,便于定位问题。
  • CSV文件格式错误:确保URL在CSV的同一列,无空行或格式混乱。

4. 结果展示模板示例(可选)

创建templates/results.html展示爬取结果:

<h1>爬取结果</h1>
<table border="1">
    <tr>
        <th>目标URL</th>
        <th>提取内容</th>
        <th>错误信息</th>
    </tr>
    {% for item in results %}
    <tr>
        <td>{{ item.url }}</td>
        <td>{{ item.content if item.content else '' }}</td>
        <td>{{ item.error if item.error else '无错误' }}</td>
    </tr>
    {% endfor %}
</table>

内容的提问来源于stack exchange,提问作者leeteerah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:28:39