Scrapy Linkextractor duplicando (?)

Tengo el rastreador implementado como a continuación.

Está funcionando e iría a través de sitios regulados bajo el link extractor .

Básicamente, lo que estoy tratando de hacer es extraer información de diferentes lugares en la página:

– href y text () bajo la clase ‘news’ (si existe)

– url de la imagen bajo la clase ‘think block’ (si existe)

Tengo tres problemas para mi scrapy:

1) duplicador de linkextractor

Parece que va a duplicar la página procesada. (Reviso contra el archivo de exportación y encontré que el mismo ~ .img apareció muchas veces, aunque casi no es posible)

Y el hecho es que, para cada página del sitio web, hay hipervínculos en la parte inferior que facilitan que los usuarios se dirijan al tema en el que están interesados, mientras que mi objective es extraer información de la página del tema (aquí aparece el título de varios pasajes bajo el título mismo tema) y las imágenes encontradas en la página de un pasaje (puede llegar a la página del pasaje haciendo clic en el título del pasaje que se encuentra en la página del tema).

Sospecho que el extractor de enlaces repetirá la misma página en este caso.

(tal vez resolver con depth_limit?)

2) Mejorar parse_item

Creo que no es muy eficiente para parse_item . ¿Cómo podría mejorarlo? Necesito extraer información de diferentes lugares en la web (seguro que solo se extrae si existe). Además, parece que el parse_item solo podría progresar en HkejImage pero no en HkejItem (de nuevo lo verifiqué con el archivo de salida). ¿Cómo debo abordar esto?

3) Necesito las arañas para poder leer chino.

Estoy rastreando un sitio en HK y sería esencial poder leer chino.

El sitio:

http://www1.hkej.com/dailynews/headline/article/1105148/IMF%E5%82%B3%E4%BF%83%E4%B8%AD%E5%9C%8B%E9%80%80% E5% 87% BA% E6% 95% 91% E5% B8% 82

Mientras pertenezca a “dailynews”, eso es lo que quiero.

 from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.selector import Selector from scrapy.http import Request, FormRequest from scrapy.contrib.linkextractors import LinkExtractor import items class EconjournalSpider(CrawlSpider): name = "econJournal" allowed_domains = ["hkej.com"] login_page = 'http://www.hkej.com/template/registration/jsp/login.jsp' start_urls = 'http://www.hkej.com/dailynews' rules=(Rule(LinkExtractor(allow=('dailynews', ),unique=True), callback='parse_item', follow =True), ) def start_requests(self): yield Request( url=self.login_page, callback=self.login, dont_filter=True ) # name column def login(self, response): return FormRequest.from_response(response, formdata={'name': 'users', 'password': 'my password'}, callback=self.check_login_response) def check_login_response(self, response): """Check the response returned by a login request to see if we are successfully logged in. """ if "username" in response.body: self.log("\n\n\nSuccessfully logged in. Let's start crawling!\n\n\n") return Request(url=self.start_urls) else: self.log("\n\n\nYou are not logged in.\n\n\n") # Something went wrong, we couldn't log in, so nothing happens def parse_item(self, response): hxs = Selector(response) news=hxs.xpath("//div[@class='news']") images=hxs.xpath('//p') for image in images: allimages=items.HKejImage() allimages['image'] = image.xpath('a/img[not(@data-original)]/@src').extract() yield allimages for new in news: allnews = items.HKejItem() allnews['news_title']=new.xpath('h2/@text()').extract() allnews['news_url'] = new.xpath('h2/@href').extract() yield allnews 

Muchas gracias y agradecería cualquier ayuda!

Primero, para establecer la configuración, configúrela en el archivo settings.py o puede especificar el parámetro custom_settings en la araña, como:

 custom_settings = { 'DEPTH_LIMIT': 3, } 

Luego, debes asegurarte de que la araña esté alcanzando el método parse_item (lo cual creo que no, no ha probado aún). Y tampoco puede especificar la callback y follow parámetros en una regla, porque no funcionan juntos.

Primero elimine el follow de su regla, o agregue otra regla, para verificar qué enlaces seguir y qué enlaces devolver como elementos.

En segundo lugar, en tu método parse_item , parse_item xpath incorrecto. Para obtener todas las imágenes, quizás puedas usar algo como:

 images=hxs.xpath('//img') 

y luego para obtener la url de la imagen:

 allimages['image'] = image.xpath('./@src').extract() 

Para las noticias, parece que esto podría funcionar:

 allnews['news_title']=new.xpath('.//a/text()').extract() allnews['news_url'] = new.xpath('.//a/@href').extract() 

Ahora, como y entiendo su problema, esto no es un error de Linkextractor duplicating , sino solo especificaciones de reglas deficientes, también asegúrese de tener xpath válido , ya que su pregunta no indicó que necesitaba la corrección de xpath.