Python爬虫数据插入MySQL列错位问题求助(附代码)
问题原因及解决方案
核心问题:无序集合导致数据顺序错乱
你代码里用了all_details = {company_name, skills, job_desc, job_link, salary_scale},集合是无序的数据结构,转成元组后元素顺序完全随机,和INSERT语句中(company_name, skills, job_desc, job_link, salary_scale)的固定列顺序不匹配,这是数据错位的根本原因。
其他次要问题
- 循环内重复创建、关闭数据库连接,效率极低且易引发异常
- 每次循环执行
executemany,job_list不断累加旧数据,会导致重复插入多条相同记录 - 数据库和表的创建语句未做存在性判断,重复运行会报错
修改后的完整代码
import requests from bs4 import BeautifulSoup import csv import mysql.connector # 初始化数据库连接(仅执行一次) try: db = mysql.connector.connect( host='localhost', user='root', password='Maxesafrica2' ) cursor = db.cursor() # 仅当数据库不存在时创建 cursor.execute("CREATE DATABASE IF NOT EXISTS jobberman_db") print("Connection to MYSQL Established!") except mysql.connector.Error as err: print(f"Database connection error: {err}") exit() # 连接到指定数据库 db = mysql.connector.connect( host='localhost', user='root', password='Maxesafrica2', database='jobberman_db' ) print("Connected to Database!") cursor = db.cursor() # 创建表(仅当表不存在时创建) mysql_create_table_query = """CREATE TABLE IF NOT EXISTS jobberman_tbl ( company_name VARCHAR(3000) NOT NULL, skills VARCHAR(3000) NOT NULL, job_desc VARCHAR(3000), job_link VARCHAR(3000), salary_scale VARCHAR(3000) )""" cursor.execute(mysql_create_table_query) # 抓取网页数据 html_text = requests.get('https://www.jobberman.com/jobs/hospitality-leisure').text soup = BeautifulSoup(html_text, 'lxml') jobs = soup.find_all('div', class_='mx-5 md:mx-0 flex flex-wrap col-span-1 mb-5 bg-white rounded-lg border border-gray-300 hover:border-gray-400 focus-within:ring-2 focus-within:ring-offset-2 focus-within:ring-gray-500') job_list = [] with open('jobberman.csv', 'w+', newline='', encoding='utf-8') as f: header = ['company name', 'skills', 'job desc', 'job link', 'salary scale'] writer = csv.writer(f) writer.writerow(header) for job in jobs: # 提取数据,去除多余空白字符 company_name = job.find('p', class_='text-sm text-brand-linked').text.strip() skills = job.find('p', class_='text-lg font-medium break-words text-brand-linked').text.strip() job_desc = job.find('p', class_='text-sm font-normal text-gray-700 md:text-gray-500 md:pl-5').text.strip() job_link = job.a['href'] salary_scale1 = job.find('span', class_='mr-1') salary_scale = salary_scale1.text.strip() if salary_scale1 else 'Not Mentioned' # 写入CSV writer.writerow([company_name, skills, job_desc, job_link, salary_scale]) # 用有序元组存储,保证与插入列顺序一致 all_details = (company_name, skills, job_desc, job_link, salary_scale) job_list.append(all_details) # 批量插入数据库(仅执行一次) insert_query = """INSERT INTO jobberman_tbl (company_name, skills, job_desc, job_link, salary_scale) VALUES (%s, %s, %s, %s, %s)""" try: cursor.executemany(insert_query, job_list) db.commit() print(f"Successfully inserted {cursor.rowcount} records") except mysql.connector.Error as err: print(f"Insert error: {err}") db.rollback() # 关闭连接 cursor.close() db.close() print('Done!')
关键修改点
- 替换无序集合为有序元组,确保数据顺序与INSERT语句的列顺序完全匹配
- 将数据库连接、批量插入操作移到循环外部,避免重复连接和重复插入
- 添加
IF NOT EXISTS判断,防止重复创建数据库/表报错 - 用
.strip()清理文本中的多余空格、换行符,提升数据整洁度 - 增加异常捕获,处理数据库操作可能出现的错误
额外检查项
若修改后仍存在错位,需验证BeautifulSoup选择器是否匹配正确:
- 打开目标网页右键检查元素,确认
company_name对应的p标签类名确实是text-sm text-brand-linked - 同理确认
skills的标签类名是否正确,网站可能更新样式导致选择器失效
内容的提问来源于stack exchange,提问作者Miracle
相关产品推荐
相关产品推荐

