【发布时间】:2017-04-20 16:11:27
【问题描述】:
所以我有一个scrapy蜘蛛如下:
class CoursesSpider(scrapy.Spider):
name = "courses"
start_urls = [
'http://example.com'
]
def parse(self, response):
for subject in response.css('subject'):
subject_name = subject.css('subject::text').extract_first().strip()
subject_link = subject.css('subject::attr(href)').extract_first().strip()
subject_id = subject.css('subject::attr(id)').extract_first().strip()
if subject_link is not None:
subject_data = scrapy.Request(subject_link, callback=self.parse_course)
yield {
'subject_name': subject_name,
'subject_link': subject_link,
'subject_id': subject_id,
'subject_data': subject_data,
}
def parse_course(self, response):
subject_id = response.css('::attr(id)').extract_first().strip()
for course in response.css('course'):
course_name = course.css('course::text').extract_first().strip()
course_link = course.css('course::attr(href)').extract_first().strip()
course_id = course.css('course::attr(id)').extract_first().strip()
if course_link is not None:
course_data = scrapy.Request(course_link, callback=self.parse_class)
yield {
'course_name': course_name,
'course_link': course_link,
'course_id': subject_id + " " + course_id,
'course_data': course_data,
}
def parse_class(self, response):
course_id = response.css('::attr(id)').extract_first().strip()
for section in response.css('section'):
section_name = section.css('section::text').extract_first().strip()
section_link = section.css('section::attr(href)').extract_first().strip()
yield {
'section_name': section_name,
'section_link': section_link,
'course_id': course_id,
}
我想得到一个具有如下树结构的输出 json 文件:
{"subject_id": "...", "subject_name": "...", "subject_link": "...", "subject_data":
{"course_id": "...", "course_link": "...", "course_name": "...", "course_data":
{"course_id": "...", "section_link": "...", "section_name": "..."}
}
}
但是我只得到这个:
{"subject_id": "...", "subject_data": "<Request GET http://example.com/something>", "subject_name": "...", "subject_link": "..."}
据我了解,这是因为收益代码尚未执行。我将如何调用完全调用所有请求的“scrapy crawl courses -o courses.json”?如果开箱即用不可能做到这一点,我自己怎么能做到这一点?我以后可以在 python 文件中导入 json 并以某种方式运行 http://example.com/something> 和以下的吗?
我知道有很多代码,但应该澄清一下。 感谢您的帮助!
【问题讨论】:
标签: python json scrapy yield scrapy-spider