2016-03-09 4 views
1

Я очень новичок в Scrapy, и мне не удается заставить функцию обратного вызова работать. Мне удается получить все URL-адреса, и мне удается следить за ними в функции обратного вызова, но когда я получаю результат, я получаю несколько результатов несколько раз, и многие из результатов отсутствуют. В чем проблема?Функция обратного вызова Scrapy возвращает тот же результат несколько раз

import scrapy 

from kexcrawler.items import KexcrawlerItem 

class KexSpider(scrapy.Spider): 
    name = 'kex' 
    allowed_domains = ["kth.diva-portal.org"] 
    start_urls = ['http://kth.diva-portal.org/smash/resultList.jsf?dswid=-855&language=en&searchType=RESEARCH&query=&af=%5B%5D&aq=%5B%5B%5D%5D&aq2=%5B%5B%7B%22dateIssued%22%3A%7B%22from%22%3A%222015%22%2C%22to%22%3A%222015%22%7D%7D%2C%7B%22organisationId%22%3A%225956%22%2C%22organisationId-Xtra%22%3Atrue%7D%2C%7B%22publicationTypeCode%22%3A%5B%22article%22%5D%7D%2C%7B%22contentTypeCode%22%3A%5B%22refereed%22%5D%7D%5D%5D&aqe=%5B%5D&noOfRows=250&sortOrder=author_sort_asc&onlyFullText=false&sf=all'] 

def parse(self, response): 
    for href in response.xpath('//li[@class="ui-datalist-item"]/div[@class="searchItem borderColor"]/a/@href'): 
     url = response.urljoin(href.extract()) 
     yield scrapy.Request(url, callback=self.parse_dir_contents) 

def parse_dir_contents(self, response): 
    item = KexcrawlerItem() 
    item['report'] = response.xpath('//div[@class="toSplitVertically"]/div[@id="innerEastCenter"]/span[@class="displayFields"]/span[@class="subTitle"]/text()').extract() 
     yield item 

Это первые строки результата:

{"report": ["On Multiple Reconnection ", "-Lines and Tripolar Perturbations of Strong Guide Magnetic Fields"]}, 
{"report": ["Four-Component Relativistic Calculations in Solution with the Polarizable Continuum Model of Solvation: Theory, Implementation, and Application to the Group 16 Dihydrides H2X (X = O, S, Se, Te, Po)"]}, 
{"report": ["On Multiple Reconnection ", "-Lines and Tripolar Perturbations of Strong Guide Magnetic Fields"]}, 
{"report": ["Comparing Vocal Fold Contact Criteria Derived From Audio and Electroglottographic Signals"]}, 
{"report": ["Four-Component Relativistic Calculations in Solution with the Polarizable Continuum Model of Solvation: Theory, Implementation, and Application to the Group 16 Dihydrides H2X (X = O, S, Se, Te, Po)"]}, 
{"report": ["Four-Component Relativistic Calculations in Solution with the Polarizable Continuum Model of Solvation: Theory, Implementation, and Application to the Group 16 Dihydrides H2X (X = O, S, Se, Te, Po)"]}, 
{"report": ["On Multiple Reconnection ", "-Lines and Tripolar Perturbations of Strong Guide Magnetic Fields"]}, 
{"report": ["Four-Component Relativistic Calculations in Solution with the Polarizable Continuum Model of Solvation: Theory, Implementation, and Application to the Group 16 Dihydrides H2X (X = O, S, Se, Te, Po)"]}, 
{"report": ["Dynamic message-passing approach for kinetic spin models with reversible dynamics"]}, 
{"report": ["RNA editing of non-coding RNA and its role in gene regulation"]}, 
{"report": ["Security monitor inlining and certification for multithreaded Java"]}, 
{"report": ["Security monitor inlining and certification for multithreaded Java"]}, 
{"report": ["On the electron dynamics during island coalescence in asymmetric magnetic reconnection"]}, 
{"report": ["On the electron dynamics during island coalescence in asymmetric magnetic reconnection"]}, 
{"report": ["On the electron dynamics during island coalescence in asymmetric magnetic reconnection"]}, 
{"report": ["On the electron dynamics during island coalescence in asymmetric magnetic reconnection"]}, 
+0

Я уверен, что вы никогда не должны переопределять метод 'parse' в' scrapy' - вот где большая часть его реализации – gtlambert

+0

@gtlambert это не так, вам нужно переопределить метод parse, потому что это запись точка зрения. Что вы имеете в виду при использовании 'LinkExtractor': в этом случае вы не должны переопределять метод' parse', потому что он имеет реализацию по умолчанию, которая требуется (или вы можете реализовать ее самостоятельно, но в этом случае вам не понадобится встроенная функция, в экстракторном двигателе). – GHajba

+0

@ Agnes вы просмотрели URL-адреса, которые ваш метод 'parse' подает на новые запросы? Scrapy не фильтрует результаты, чтобы они отличались, но загруженные URL-адреса. Если вы закончите с некоторым параметром сеанса в URL-адресах, вы можете получить несколько результатов. Если вы хотите отфильтровать результаты, создайте специализированный экспортер элементов, который отмечает уже экспортированные элементы и фильтрует их. – GHajba

ответ

0

я пытался повторить свою ошибку и не смогла. Все URL-адреса были отличными. Я зарегистрировал каждый элемент на уровне INFO и подавил все ниже этого и нашел, что каждый отчет также уникален. Я отменил ваш вызов доходности, потому что он бросил мне ошибку и определил ваш класс товаров с одним полем. Если вы скопировали и вставили это непосредственно с терминала, то я предполагаю, что это был продукт печати, а не журнал, что заставляет меня думать, что, возможно, у вас есть несколько вызовов печати, которые вызываются в разное время. Попробуйте записать файлы где-нибудь и посмотреть, есть ли дубликаты. Чтобы проверить, были ли URL уникальными, я извлек элементы из вашего xpath в список, называемый elem, затем: print len(elem) b = set() for e in elem: b.add(e) print len(b) Вы можете попробовать создать глобальный список элементов, а затем добавить функцию spider_closed, которая будет вызываться автоматически при ее закрытии, а затем сделать то же самое в этом списке. Наборы содержат только уникальные элементы, если есть несоответствие, то вы фактически создаете дубликаты.

Смежные вопросы