Сделать перезаписывать файлы scrapyd - PullRequest
0 голосов
/ 03 декабря 2018

Я ищу способ настроить задание в scrapyd, который создает файл локально, а затем перезаписывает его содержимое при следующем сканировании, а не добавляет его.Насколько я знаю, используя только scrapy, я мог бы использовать эту команду

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

, но, похоже, нет способа установить эти аргументы в scrapyd или в командной строке curl (которую я использую для настройки scrapyd).

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Как вы спланируете паука, используя ScrapyD?через крона?или что?

У меня есть 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()
0 голосов
/ 03 декабря 2018

Вы можете создать свое собственное хранилище кормов.Расширьте scopy FileFeedStorage, перезапишите метод open, чтобы вернуть файл в режиме записи (scrapy's 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).

...