Scrapy:yield form请求打印无?

时间:2016-12-16 08:21:38

标签: python web scrapy scrapy-spider scrapy-splash

我正在写蜘蛛废弃网站:

第一个网址www.parenturl.com调用解析函数,从那里我已经提取了网址www.childurl.com,我有一个回调到parse2函数,它返回dict。

问题1)我需要将dict值存储在mysql数据库中,其中包含我在解析函数中从父url中提取的其他7个值? (response_url打印无)

def parse(self, response):
    for i in range(0,2):
        url = response.xpath('//*[@id="response"]').extract()
        response_url=yield SplashFormRequest(url,method='GET',callback=self.parse2)
        print response_url # prints None

def parse2(self, response):
    dict = {'url': response.url}
    return dict

2 个答案:

答案 0 :(得分:1)

你不能把一个yield调用等同于一个变量,因为它就像一个回调函数。

尝试删除它

def parse(self, response):
    self.results = []
    for i in range(0,2):
        url = response.xpath('//*[@id="response"]').extract()
        request = SplashFormRequest(url,method='GET',callback=self.parse2)
        yield request
    print self.results

def parse2(self, response):
    # print response here !
    dict = {'url': response.url}
    self.results.append(dict)

答案 1 :(得分:1)

将第二个回调的结果存储在蜘蛛对象上然后打印它并不能保证因为scrapy的asynchronous nature而起作用。相反,您可以尝试passing additional data to callback functions,例如:

def parse(self, response):
    for i in range(0, 2):
        item = ...  # extract some information
        url = ...  # construct URL
        yield SplashFormRequest(url, callback=self.parse2, meta={'item': item})

def parse2(self, response):
    item = response.meta['item']  # get data from previous parsing method
    item.update({'key': 'value'})  # add more information
    print item  # do something with the "complete" item
    return item