3

我正在抓取一个包含课程信息的网页。该页面还包含指向评估页面的链接,每年一个,因此存在1 对 N 的关系。我有一个解析主页的方法和一个解析评估页面的方法。第一个方法为找到的每个链接调用第二个方法。

我的问题是,我应该在哪里返回 Item 对象?

def parse_course(self, response):
    hxs = HtmlXPathSelector(response)
    main_div = select_single(hxs, '//div[@class = "CourseViewer"]/div[@id = "pagecontents"]')
    course = CourseItem()
    # here I scrape basic info about the item
    self.process_heading(main_div, course)
    grades_table = select_single(hxs, '//td[@class = "ContentMain"]//table[contains(tr/td/b/text(), "Grades")]')
    grade_links = grades_table.select('tr[2]/td[2]/a/@href').extract()
    for link in grade_links:
        yield Request(link, callback = self.parse_grade_dist_page, meta = {'course' : course})

def parse_grade_dist_page(self, response):
    course = response.meta['course']
    # scrape additional data and store it in CourseItem
4

1 回答 1

4

方法有很多,这里有几个:

  1. 您可以跟踪提出的请求并在最后一次请求时返回项目。这可能很难,因为您必须在请求失败时处理这种情况。

  2. 您可以以线性方式一个接一个地执行每个请求。此外,您必须处理请求失败并继续处理其他请求的情况。

  3. 您可以使用scrapy-inline-requests

    @inline_requests
    def parse_course(self, response):
    
        # ...
    
        for link in grade_links:
            try:
                response = yield Request(link)
            except Exception as e:
                # handle the exception here
                pass
            else:
                # extract the data here
                pass
    
         # at the end yield the item
    
于 2013-10-01T03:24:31.943 回答