制作抓破的覆盖文件

时间:2018-12-03 08:38:12

标签: curl scrapy scrapyd

我正在寻找一种在scrapyd中设置作业的方法,该方法在本地创建文件,然后在下一次爬网时覆盖其内容,而不是附加文件。 据我所知,仅使用scrapy我可以使用此命令

scrapy crawl myspider -t json --nolog -o - > "/path/to/json/my.json"

但是似乎没有办法在scrapyd或curl命令行(我用来设置scrapyd)中设置这些参数。

2 个答案:

答案 0 :(得分:0)

您可以创建自己的供稿存储。扩展scrapy的FileFeedStorage,覆盖open方法以写模式返回文件(scrapy的FileFeedStorage返回附加模式的文件)。

import os

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.extensions.feedexport import FileFeedStorage

class QuotesSpider(CrawlSpider):
    name = 'toscrape.com'
    start_urls = ['http://quotes.toscrape.com/']

    rules = (
        Rule(LinkExtractor(('quotes.toscrape.com/page/',)), callback='parsePage', follow=True),
    )

    custom_settings = {
        'FEED_STORAGES': {
            'file': 'myspider.MyFileFeedStorage'
        },
        'FEED_URI': 'file:///my/valid/file/path/out.json'
    }

    def parsePage(self, response):
        return ({
            'quote': quote.xpath('.//span[@class="text"]/text()').extract_first(),
            'author': quote.xpath('.//small[@class="author"]/text()').extract_first(), 
        } for quote in response.xpath('//div[@class="quote"]'))

class MyFileFeedStorage(FileFeedStorage):

    def open(self, spider):
        dirname = os.path.dirname(self.path)
        if dirname and not os.path.exists(dirname):
            os.makedirs(dirname)
        return open(self.path, 'wb')

如果您多次运行scrapy runspider myspider.py,您将看到每次都重新创建输出文件(假设您的脚本名为myspider.py)。

答案 1 :(得分:0)

您如何使用ScrapyD训练蜘蛛?通过Cron?还是什么?

我有2个想法,

1)在将命令发送到scrapyd之前手动清空文件

echo "" > /path/to/json/my.json && curl http://localhost:6800/schedule.json

这将首先清除my.json的内容,然后再安排蜘蛛程序。

2)在蜘蛛内,只需

open("/path/to/json/my.json", 'w').close()