如何使用scrapy从主脚本中获取被删除的项目?

时间:2016-07-04 15:13:47

标签: python scrapy

我希望在主脚本中获取已删除项目的列表,而不是使用scrapy shell。

我知道我定义的类parse中有一个方法FooSpider,此方法返回Item列表。 Scrapy框架调用此方法。但是,我怎么能自己获得这个返回的列表呢?

我发现了很多这方面的帖子,但我不明白他们在说些什么。

作为上下文,我在这里放置官方示例代码

import scrapy

from tutorial.items import DmozItem

class DmozSpider(scrapy.Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/",
    ]

    def parse(self, response):
        for href in response.css("ul.directory.dir-col > li > a::attr('href')"):
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse_dir_contents)

    def parse_dir_contents(self, response):
        result = []
        for sel in response.xpath('//ul/li'):
            item = DmozItem()
            item['title'] = sel.xpath('a/text()').extract()
            item['link'] = sel.xpath('a/@href').extract()
            item['desc'] = sel.xpath('text()').extract()
            result.append(item)

        return result

如何从resultmain.py等主要python脚本返回run.py

if __name__ == "__main__":
    ...
    result = xxxx()
    for item in result:
        print item

有人可以提供一个代码片段,我从某个地方返回list吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

这是一个示例,您如何使用管道收集列表中的所有项目:

let real = new Float32Array([ /* lots of numbers */ ]);
let imag = new Float32Array([ /* lots of numbers */ ]);
let wave = ctx.createPeriodicWave(real, imag);

let o = ctx.createOscillator();
o.setPeriodicWave(wave);
o.frequency.value = /* ? */;

您可以从here获得createPeriodicWave,也可以使用自己的蜘蛛网。在我的网页上使用示例输出:

#!/usr/bin/python3

# Scrapy API imports
import scrapy
from scrapy.crawler import CrawlerProcess

# your spider
from FollowAllSpider import FollowAllSpider

# list to collect all items
items = []

# pipeline to fill the items list
class ItemCollectorPipeline(object):
    def __init__(self):
        self.ids_seen = set()

    def process_item(self, item, spider):
        items.append(item)

# create a crawler process with the specified settings
process = CrawlerProcess({
    'USER_AGENT': 'scrapy',
    'LOG_LEVEL': 'INFO',
    'ITEM_PIPELINES': { '__main__.ItemCollectorPipeline': 100 }
})

# start the spider
process.crawl(FollowAllSpider)
process.start()

# print the items
for item in items:
    print("url: " + item['url'])

答案 1 :(得分:0)

如果您想要的是使用/ process / transform或存储项目,您应该查看Item Pipeline并且通常的scrapy抓取就可以了。