В моем items.py
:
class NewAdsItem(Item):
AdId = Field()
DateR = Field()
AdURL = Field()
В моем pipelines.py
:
import sqlite3
from scrapy.conf import settings
con = None
class DbPipeline(object):
def __init__(self):
self.setupDBCon()
self.createTables()
def setupDBCon(self):
# This is NOT OK!
# I want to get the items already HERE!
dbfile = settings.get('SQLITE_FILE')
self.con = sqlite3.connect(dbfile)
self.cur = self.con.cursor()
def createTables(self):
# OR optionally HERE.
self.createDbTable()
...
def process_item(self, item, spider):
self.storeInDb(item)
return item
def storeInDb(self, item):
# This is OK, I CAN get the items in here, using:
# item.keys() and/or item.values()
sql = "INSERT INTO {0} ({1}) VALUES ({2})".format(self.dbtable, ','.join(item.keys()), ','.join(['?'] * len(item.keys())) )
...
Как я могу получить имена списков элементов (например, «AdId» и т. д.) из items.py до выполнения process_item()
(в pipelines.py)?
Я использую scrapy runspider myspider.py
для выполнения.
Я уже пытался добавить "предмет" и/или "паук" подобным образом def setupDBCon(self, item)
, но это не сработало и привело к следующему результату: TypeError: setupDBCon() missing 1 required positional argument: 'item'
ОБНОВЛЕНИЕ: 08.10.2018
Результат (А):
Частично следуя решению @granitosaurus, я обнаружил, что могу получить элемент keys в виде списка:
- Добавление (а):
from adbot.items import NewAdsItem
к моему основному коду паука. - Добавление (b):
ikeys = NewAdsItem.fields.keys()
в указанном выше классе. - Затем я мог получить доступ к ключам из моего
pipelines.py
через:
def open_spider(self, spider):
self.ikeys = list(spider.ikeys)
print("Keys in pipelines: \t%s" % ",".join(self.ikeys) )
#self.createDbTable(ikeys)
Однако у этого метода было 2 проблемы:
Мне не удалось получить список ikeys в папку
createDbTable()
. (Я продолжал получать сообщения об отсутствующих аргументах то здесь, то там.)Список ikeys (полученный) был переупорядочен и не сохранил порядок элементов, как в items.py, что частично разрушило цель. Я до сих пор не понимаю, почему они не по порядку, когда во всех документах говорится, что Python3 должен сохранять порядок диктов, списков и т. Д. В то же время при использовании
process_item()
и получении элементов через:item.keys()
их порядок остается неизменным.
Результат (Б):
В конце концов, это оказалось слишком трудоемким и сложным для исправления (A), поэтому я просто импортировал соответствующий items.py
класс в свой pipelines.py
и использовал элемент list как глобальную переменную, например:
def createDbTable(self):
self.ikeys = NewAdsItem.fields.keys()
print("Keys in creatDbTable: \t%s" % ",".join(self.ikeys) )
...
В этом случае я просто решил признать, что полученный список похоже отсортирован по алфавиту, и решил проблему, просто изменив имена ключей. (Мошенничество!)
Это разочаровывает, потому что код уродлив и искажен. Любые лучшие предложения будут высоко оценены.