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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:25:26