【问题标题】:Prevent duplicate rows in mysql database防止mysql数据库中的重复行
【发布时间】:2020-06-11 19:55:59
【问题描述】:

我编写代码从 ebay.com 上抓取汽车信息(名称、品牌、型号、传输、年份、价格)数据并保存在 Mysql 中。

我希望如果一行的所有(标题,品牌,型号,...)项目都与另一行相似,然后避免将此数据插入 Mysql,只有当所有行的项目都相似时(不要抑制插入如果只有标题或型号等相同)。

我创建的数据库和表非常简单(我是初学者),如果需要我可以删除数据库并创建一个新的

代码:

import requests
from bs4 import BeautifulSoup
import re
import mysql.connector

conn = mysql.connector.connect(user='root', password='1234', 
host='127.0.0.1', database='web_scraping')
cursor = conn.cursor()
url = 'https://www.ebay.com/b/Cars-Trucks/6001?_fsrp=0&_sacat=6001&LH_BIN=1&LH_ItemCondition=3000%7C1000%7C2500&rt=nc&_stpos=951 25&Model%2520Year=2020%7C2019%7C2018%7C2017%7C2016%7C2015'
res = requests.get(url)
soup = BeautifulSoup(res.text, 'html.parser')
ebay_cars = soup.find_all('li', class_='s-item')
for car_info in ebay_cars:
    title_div = car_info.find('div', class_='s-item__wrapper clearfix')
    title_sub_div = title_div.find('div', class_='s-item__info clearfix')
    title_p = title_sub_div.find('span', class_='s-item__price')
    title_tag = title_sub_div.find('a', class_='s-item__link')
    title_maker = title_sub_div.find('span', class_='s-item__dynamic s- 
    item__dynamicAttributes1')
    title_model = title_sub_div.find('span', class_='s-item__dynamic s- 
    item__dynamicAttributes2')
    title_trans = title_sub_div.find('span', class_='s-item__dynamic s- 
    item__dynamicAttributes3')



    name_of_car = re.sub(r'\d{4}', '', title_tag.text)
    maker_of_car = re.sub(r'Make: ','', title_maker.text)
    model_of_car = re.sub(r'Model: ', '', title_model.text)
    try:
        if title_trans.text.startswith(r'Transmission: '):
            trans_of_car = re.sub(r'Transmission: ', '', title_trans.text)
        else:
            trans_of_car = ''
    except AttributeError:
        trans_of_car = ''
    year_of_car = re.findall(r'\d{4}', title_tag.text)
    year_of_car = ''.join(str(x) for x in year_of_car)

    price_of_car = title_p.text
    print(name_of_car ,trans_of_car )
    sql = 'INSERT INTO car_info(Title, Maker, Model, Transmission, Year, 
    Price) VALUES (%s, %s, %s, %s, %s, %s)'
    cursor.execute(sql , (name_of_car, maker_of_car, model_of_car, 
    trans_of_car, year_of_car, price_of_car))



conn.commit()
conn.close()

【问题讨论】:

  • INSERT IGNORE...下的手册

标签: python mysql web-scraping


【解决方案1】:

您可以尝试将mysql表的列设置为唯一的,这样就不会允许插入多余的数据

CREATE TABLE TABLE1(
  col1 varchar(20),
  col2 varchar(20),
  col3 varchar(20),
  col4 varchar(20),
  CONSTRAINT uc UNIQUE (col1,col2,col3,col4)
 );

希望这会有所帮助:-)

【讨论】:

  • 我希望行中所有插入的数据(包括标题、品牌、型号、变速箱、年份、价格)都相似,然后阻止插入该数据,因为某些标题或型号或汽车制造商相似
  • @nishida 只是将所有列设为唯一,因为 mysql 将在插入之前检查整个记录,如果相同,则不会插入我认为如果不是,这将有所帮助,请不要犹豫再问
【解决方案2】:

在 MySQL 中试试这个:

ALTER TABLE car_info
ADD CONSTRAINT unique_car
UNIQUE (title, maker, model, transmission, year, price)

您只需执行一次,无需重新创建表。只需将其复制并粘贴到控制台中即可。

如果不清楚,请随时寻求更多帮助!

【讨论】:

  • 嗨,谢谢,显示此错误:mysql.connector.errors.IntegrityError: 1062 (23000): Duplicate entry ' Ford Mustang Shelby Signature Edition-Ford-Mustang-Automatic-20' for key 'ebaycar .unique_car'
  • 这不是你想要的吗?它说它阻止您添加条目,因为它已经存在。
【解决方案3】:

这不是直接回答你的问题,但我还不能评论...... 我建议您查看 SQLAlchemy,这是一个 python 库,可以更轻松地使用 sql 数据库。例如,您可以在模型生成器中给出参数 unique=True 。 有关 SQLAlchemy,请参见此处:https://www.sqlalchemy.org/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    相关资源
    最近更新 更多