Ich möchte die start_urls von meiner Spinne an die Mysqlpipeline übergeben.scrapy python pass start_urls von Spinne zu Pipeline
Wie kann ich das tun?
Dies ist Teil meiner spider.py
def __init__(self, *args, **kwargs):
urls = kwargs.pop('urls', [])
if urls:
self.start_urls = urls.split(',')
self.logger.info(self.start_urls)
url = "".join(urls)
self.allowed_domains = [url.split('/')[-1]]
super(SeekerSpider, self).__init__(*args, **kwargs)
und das ist mein pipeline.py
class MySQLPipeline(object):
def __init__(self):
...
# get the url from the spiders
start_url = SeekerSpider.start_urls # not working
url = "".join(start_url).split('/')[-1]
self.tablename = url.split('.')[0]
UPDATE
Dies ist ein weiterer Weg ist, ich versucht, aber wenn ich 100 Anfragen haben ... es wird die Tabelle 100 mal ...
pipeline.py
class MySQLPipeline(object):
def __init__(self):
...
def process_item(self, item, spider):
tbl_name = item['tbl_name']
general_table = """ CREATE TABLE IF NOT EXISTS CrawledTables
(id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
Name VARCHAR(100) NOT NULL,
Date VARCHAR(100) NOT NULL,
PRIMARY KEY (id), UNIQUE KEY (NAME))
ENGINE=Innodb DEFAULT CHARSET=utf8 """
insert_table = """ INSERT INTO CrawledTables (Name,Date) VALUES(%s,%s)"""
self.cursor.execute(general_table)
crawled_date = datetime.datetime.now().strftime("%y/%m/%d-%H:%M")
self.cursor.execute(insert_table, (tbl_name,
str(crawled_date)))
...
spider.py
def __init__(self, *args, **kwargs):
urls = kwargs.pop('urls', [])
if urls:
self.start_urls = urls.split(',')
self.logger.info(self.start_urls)
url = "".join(urls)
self.allowed_domains = [url.split('/')[-1]]
super(SeekerSpider, self).__init__(*args, **kwargs)
self.date = datetime.datetime.now().strftime("%y_%m_%d_%H_%M")
self.dmn = "".join(self.allowed_domains).replace(".", "_")
tablename = urls.split('/')[-1]
table_name = tablename.split('.')[0]
newname = table_name[:1].upper() + table_name[1:]
date = datetime.datetime.now().strftime("%y_%m_%d_%H_%M")
self.tbl_name = newname + "_" + date
def parse_page(self, response):
item = CrawlerItem()
item['tbl_name'] = self.tbl_name
...
Dabei erstellen Tabelle Ich versuche, nur 1 mal die Tabelle, die ich mit dem Datum kriechen hinzufügen ... im Grunde nehme ich die start_urls und übergibt es an die allowed_domain und geben sie dann an den tbl_name (für den Namen mysql Tabelle)
Sie können das nicht in Ihrem init. aber in deinem 'process_item'. Da Pipelines vor dem Prozess initialisiert werden –
funktioniert es in der ** process_item **, aber es ruft es jede Anfrage ... also wenn ich 100 Anfragen habe ... wird es versuchen, diese Tabelle 100 mal zu erstellen ... und ich nur will 1 mal – Omega
Ich habe die Frage aktualisieren – Omega