【问题标题】:scrapy python pass start_urls from spider to pipelinescrapy python将start_urls从蜘蛛传递到管道
【发布时间】:2017-09-29 11:34:15
【问题描述】:

我想将 start_urls 从我的蜘蛛传递到 Mysql 管道。

我该怎么做?

这是我的 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)

这是我的 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]

更新

这是我尝试过的另一种方式,但如果我有 100 个请求...它将创建表 100 次...

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

    ...

在这个表中,我试图只添加 1 次我正在抓取的表的日期......基本上我正在使用 start_urls 并将其传递给 allowed_domain 然后将其传递给 tbl_name(用于 mysql 表名)

【问题讨论】:

  • 你不能在你的初始化中这样做。但在你的process_item。因为管道是在进程之前初始化的
  • 它在 process_item 中工作,但它会在每个请求中调用它...所以如果我有 100 个请求...它将尝试创建该表 100 次...我只想要1次
  • 我有更新问题

标签: python scrapy


【解决方案1】:

我发现我需要在 管道 中创建另一个函数

def open_spider(self, spider):

这会获取您在蜘蛛中的所有参数,并在管道中使用它们

【讨论】:

    猜你喜欢
    • 2013-08-04
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    相关资源
    最近更新 更多