2013-09-30 2 views
3

Я соскабливаю веб-страницу с информацией о курсе. На странице также есть ссылки на страницы оценки, по одному на каждый год, так что есть 1-to-N отношения. У меня есть метод для анализа главной страницы и метода для анализа страницы оценки. Первый метод вызывает второй метод для каждой найденной ссылки.Scrapy - слияние результатов с 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 

ответ

3

Есть много подходов, вот некоторые из них:

  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 
    
Смежные вопросы