我正在寻找一种在scrapyd中设置作业的方法,该方法在本地创建文件,然后在下一次爬网时覆盖其内容,而不是附加文件。 据我所知,仅使用scrapy我可以使用此命令
scrapy crawl myspider -t json --nolog -o - > "/path/to/json/my.json"
但是似乎没有办法在scrapyd或curl命令行(我用来设置scrapyd)中设置这些参数。
答案 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()