Scrapy产生一个Request,在回调中解析,但使用原始函数中的info

时间:2017-07-19 20:47:12

标签: python callback scrapy scrapy-spider

所以我试图在scrapy中测试一些网页,我的想法是产生一个满足条件的URL的请求,计算页面上某些项目的数量,然后在原始条件内返回True / False根据...

这是一些显示我的意思的代码:

def filter_categories:
    if condition:
        test = yield Request(url=link, callback = self.test_page, dont_filter=True)
        return (test, None)

def test_page(self, link):
    ... parse the response...
    return True/False depending

我已经尝试过在请求中传递一个项目,但无论在调用test_page之前触发返回行是什么......

所以我想我的问题是有没有办法以同步的方式将数据传回filter_categories方法,以便我可以使用test_page的结果来返回我的测试是否满足?

欢迎任何其他想法。

3 个答案:

答案 0 :(得分:2)

看一下inline_requests包,这可以让你实现这个目标。

其他解决方案是不坚持从原始方法(在您的案例中为filter_categories)返回结果,而是使用request chainingmeta请求属性并返回结果链中的最后一个解析方法(在您的情况下为test_page)。

答案 1 :(得分:0)

如果我理解你的错误:您希望yield scrapy.Request指向具有True条件的网址。我对吗?这里有一些例子:

def parse(self, response):
    if self.test_page(response):
        item = Item()
        item['url'] = 'xpath or css'
        yield item
    if condition:
        yield Request(url=new_link, callback = self.parse, dont_filter=True)


def test_page(self, link):
    ... parse the response...
    return True/False depending

如果您提供更多信息,我会尝试更多帮助。

这是我代码的一部分

 def parse(self, response):
        if 'tag' in response.url:
            return self.parse_tag(response)
        if 'company' in response.url:
            return self.parse_company(response)

    def parse_tag(self, response):
        try:
            news_list = response.xpath("..//div[contains(@class, 'block block-thumb ')]")
            company = response.meta['company']
            for i in news_list:
                item = Item()
                item['date'] = i.xpath("./div/div/time/@datetime").extract_first()
                item['title'] = i.xpath("./div/h2/a/text()").extract_first()
                item['description'] = i.xpath("./div/p//text()").extract_first()
                item['url'] = i.xpath("./div/h2/a/@href").extract_first()

                item.update(self.get_common_items(company))

                item['post_id'] = response.meta['post_id']

                if item['title']:
                    yield scrapy.Request(item['url'], callback=self.parse_tags, meta={'item': item})

            has_next = response.xpath("//div[contains(@class, 'river-nav')]//li[contains(@class, 'next')]/a/@href").extract_first()
            if has_next:
                next_url = 'https://example.com' + has_next + '/'
                yield scrapy.Request(next_url, callback=self.parse_tag,
                                     meta=response.meta)

def parse_tags(self, response):
    item = response.meta['item']
    item['tags'] = response.xpath(".//div[@class='accordion recirc-accordion']//ul//li[not(contains(@class, 'active'))]//a/text()").extract()

    yield item

答案 2 :(得分:0)

您可以使用:

response.meta 反应体 函数获得

重构蜘蛛