2014-03-27 3 views
0

Scrapy를 사용하여 물건을 얻고 데이터베이스에 저장하고 싶습니다. MySQL 또는 Python을 사용하기 전에이 작업을하지 않는 이유에 대한 도움을 받으려하지 마십시오. 여기 Python MySQL 데이터베이스에 추가

내 코드입니다 :

from __future__ import print_function 
from metacritic.items import MetacriticItem 
from mysql.connector import errorcode 
import mysql.connector 
import json 

class MetacriticPipeline(object): 

DB_NAME = 'metacritic' 

TABLES = {} 
TABLES['titles'] = (
    "CREATE TABLE `titles` (" 
    " `name` varchar (14) NOT NULL," 
    " PRIMARY KEY (`emp_no`)" 
    ") ENGINE=InnoDB") 

cnx = mysql.connector.connect(user='root', password = 'andy') 
cursor = cnx.cursor() 

def process_item(self, item, spider): 
    if item['title']: 
     return item 

class JsonWriterPipeline(object): 

def __init__(self): 
    self.file = open('items.jl', 'wb') 

def process_item(self, item, spider): 
    line = json.dumps(dict(item)) + "\n" 
    self.file.write(line) 
    return item 

class WriteToDatabasePipeline(object): 

def create_database(cursor): 
    try: 
     cursor.execute(
      "CREATE DATABASE {} DEFAULT CHARACTER SET 'utf8'".format(DB_NAME)) 
    except mysql.connector.Error as err: 
     print("Failed creating database: {}".format(err)) 
     exit(1) 

try: 
    cnx.database = DB_NAME 
except mysql.connector.Error as err: 
    if err.errno == errorcode.ER_BAD_DB_ERROR: 
     create_database(cursor) 
     cnx.database = DB_NAME 
    else: 
     print(err) 
     exit(1) 
내가 그것을 실행하려고하면 내가 CMD에서이 오류를 받고 있어요

:

File "metacritic\pipelines.py", line 46, in WriteToDatabasePipeline 
cnx.database = DB_NAME 
NameError: name 'DB_NAME' is not defined 

이 왜 어떤 생각? DB_NAME이 정의 된 것처럼 보입니다. 난 지금 데이터베이스를 만들고 나중에 테이블에 추가하려고합니다. 당신은 MetacriticPipeline 클래스 내부 DB_NAME을 정의

답변

1

어떤 도움 감사합니다, (scrapy 설정에 이상 이동) 스크립트의 상단에 이동 :

from __future__ import print_function 
from metacritic.items import MetacriticItem 
from mysql.connector import errorcode 
import mysql.connector 
import json 

DB_NAME = 'metacritic' 

class MetacriticPipeline(object): 
    ... 
+0

awesome great thanks. – AndyOHart

1

DB_NAME이 클래스 MetacriticPipeline에 정의되어, 확인 글로벌 또는이 작업을 수행하십시오 :

cnx.database = MetacriticPipeline.DB_NAME 
+0

감사합니다. alecxe의 대답은 내가 그의 대답을 받아 들여야 할 것입니다 그래서 나는 대답했다, 나는 당신을 어쨌든 upvoted :) – AndyOHart

관련 문제