现有可运行爬虫如何从All_Round表取轮次ID插入Scraping_Score表
解决方案
前置操作
首先需要先给Scraping_Score表新增关联轮次ID的字段,执行以下SQL:
ALTER TABLE Scraping_Score ADD COLUMN ID_Round INTEGER;
代码修正
你的实现思路整体是正确的,只需要修正两处cursor.execute的写法以及结果取值逻辑即可:
1. 轮次ID查询部分修正
原代码中你用cursor.lastrowid是错误的,这个方法仅用于获取INSERT操作生成的自增主键ID,查询操作需要用fetchone()拿结果。
if 'event__round' in classes: current_round = PremierLeague.text.split(" ")[-1] # 仅保留轮次数字 # 替换原有注释的查询代码 # 查询对应轮次的ID_Round,参数用?做占位符,传入转换为整数的轮次编号 cursor.execute("SELECT ID_Round FROM All_Round WHERE Number_Round = ?", (int(current_round),)) # 取出查询结果的第一个值就是目标ID query_res = cursor.fetchone() if not query_res: # 异常处理:如果查不到对应轮次,可根据自己的需求调整逻辑,比如跳过、抛错 raise ValueError(f"未找到轮次{current_round}对应的ID") current_round_ID = query_res[0]
2. 赛事数据插入部分修正
插入语句需要补全所有要写入的字段和对应的值,不能只写ID_Round:
# 替换原有注释的插入代码 cursor.execute(''' INSERT INTO Scraping_Score (current_round, date, time, team_home, team_away, score_home, score_away, ID_Round) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ''', ( int(current_round), date, time, team_home.text, team_away.text, int(score_home.text), int(score_away.text), current_round_ID )) # 注意如果你的数据库连接没有开启自动提交,需要执行提交操作,可根据情况选择单条提交或者所有数据爬取完统一提交 # conn.commit()
注意事项
- 传递参数的元组如果只有一个元素,必须加末尾的逗号,比如
(int(current_round),),否则Python会识别为单个变量而非元组,触发参数数量不匹配的报错 - 如果你的
All_Round表存储了多个赛事的轮次,需要在查询的WHERE条件中补充ID_Tournment = 对应赛事ID的过滤条件,避免查错其他赛事的轮次ID - 所有数值类型的字段写入前最好做类型转换,避免字符串类型写入整数字段出现异常
内容的提问来源于stack exchange,提问作者Erling Olsen
相关产品推荐
相关产品推荐

