2017-09-29 1 views
2

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)

+0

Sie können das nicht in Ihrem init. aber in deinem 'process_item'. Da Pipelines vor dem Prozess initialisiert werden –

+0

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

+0

Ich habe die Frage aktualisieren – Omega

Antwort

3

ich, dass ich

def open_spider(self, spider): 

eine andere Funktion in der Pipeline erstellen müssen gefunden und dies dauert die ganze Argumente, die Sie in Ihrer Spinne haben und Sie verwenden sie in der Pipeline

Verwandte Themen