我正在寻找一种方法来保存python变量中的蜘蛛输出,而不是将其保存在json
文件中并在程序中将其读回。
import scrapy
from scrapy.crawler import CrawlerProcess
class TestSpider(scrapy.Spider):
name = 'test'
start_urls = ['https://www.wikipedia.org']
def parse(self, response):
yield {
'text' : response.css(".jsl10n.localized-slogan::text").extract_first()
}
if __name__ == "__main__":
os.remove('result.json')
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'FEED_FORMAT': 'json',
'FEED_URI': 'result.json'
})
process.crawl(TestSpider)
process.start()
我想避免以下步骤并直接读取值而不是先将其保存在磁盘上
with io.open('result.json', encoding='utf-8') as json_data:
d = json.load(json_data)
text = d[0]['text']
答案 0 :(得分:1)
我最终使用global
变量来存储解决了我的目的的输出。
import scrapy
from scrapy.crawler import CrawlerProcess
outputResponse = {}
class TestSpider(scrapy.Spider):
name = 'test'
start_urls = ['https://www.wikipedia.org']
def parse(self, response):
global outputResponse
outputResponse['text'] = response.css(".jsl10n.localized-slogan::text").extract_first()
if __name__ == "__main__":
os.remove('result.json')
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
})
process.crawl(TestSpider)
process.start()
答案 1 :(得分:0)
您还可以将对象传递到Spider中并进行更改,如下所示:
class TestSpider(scrapy.Spider):
name = 'test'
start_urls = ['https://www.wikipedia.org']
def parse(self, response):
self.outputResponse['text'] = response.css(".jsl10n.localized-slogan::text").extract_first()
if __name__ == "__main__":
os.remove('result.json')
outputResponse = {}
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
})
process.crawl(TestSpider, outputResponse=outputResponse)
process.start()
之所以可行,是因为传递给Spider构造函数的每个命名参数都作为属性分配给实例,这就是为什么您可以在self.outputResponse
方法内使用parse
并可以访问外部对象。