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
相关产品推荐
相关产品推荐

