我不明白这是什么问题。我想构建一个网络刮板,用于刮擦亚马逊并将价格和名称输入数据库。但是由于某种原因,它告诉我列和值不匹配。我的数据库中确实有另外一列称为“ timestamp”,我会在其中自动输入时间,但这是由数据库处理的。我正在使用MariaDB。一位朋友说我也可以将MySQL API用于MariaDB。
P.S。 preis =价格,来自德国,有时会在英语和德语之间切换,以防万一有人想知道。
setProp
错误消息:
import requests, time, csv, pymysql
from bs4 import BeautifulSoup as bs
#URL = input("URL")
URL = "https://www.amazon.de/gp/product/B075FTXF15/ref=crt_ewc_img_bw_3?ie=UTF8&psc=1&smid=A24FLB4J0NZBNT"
def SOUPIT (tempURL):
URL = tempURL
page = requests.get(URL,headers={"User-Agent":"Defined"})
soup = bs(page.content, "html.parser")
raw_price = soup.find(id="priceblock_ourprice").get_text()
price = raw_price[:-2]
raw_name = soup.find(id="productTitle").get_text()
name = raw_name.strip()
for i in range(0,len(name)-1):
if name[i] == "(":
name = name[:i]
break
data = [name, price, time.strftime("%H:%M:%S"), time.strftime("%d.%m.%Y")]
return(data)
data = SOUPIT(URL)
while True:
data = SOUPIT(URL)
db = pymysql.connect("localhost", "root", "root", "test")
cursor = db.cursor()
if (data == None):
break
print("break")
else:
name = data[0]
preis = data[1]
sql = """INSERT INTO amazon_preise (Name, Preis) VALUES ('{}',{})""".format(name,preis)
cursor.execute(sql)
db.commit()
print("success")
print(data)
time.sleep(60)
答案 0 :(得分:0)
该问题至少部分是由使用字符串格式将值插入SQL语句引起的。
以下是抓取的数据:
>>> data = ['Sweatshirt Alien VS. Predator Z100088', '32,99', '14:08:43', '08.09.2019']
>>> name, preis, *_ = data
让我们创建SQL语句
>>> sql = """INSERT INTO amazon_preise (Name, Preis) VALUES ('{}',{})""".format(name,preis)
并显示它:
>>> sql
"INSERT INTO amazon_preise (Name, Preis) VALUES ('Sweatshirt Alien VS. Predator Z100088',32,99)"
请注意,VALUES
子句包含三个逗号分隔的值;这是因为该网页以德国风格显示货币,即用逗号将美分与欧元分开。插值到SQL语句时
preis
变成两个值,而不是一个。
解决此问题的正确方法是将preis
从字符串转换为浮点数或小数,并使用参数替换而不是字符串格式对值进行插值。
>>> fpreis = float(preis.replace(',', '.'))
>>> sql = """INSERT INTO amazon_preise (Name, Preis) VALUES (%s, %s)"""
>>> cursor.execute(sql, (name, fpreis))