2016-02-02 4 views
0

У меня проблема, я хочу проанализировать веб-сайт и просканировать ссылки каждой статьи, но проблема в том, что Scrapy не сканирует все ссылки и не сканирует некоторые из них случайное число раз.Parse Document with Scrapy

import scrapy 

from tutorial.items import GouvItem 

class GouvSpider(scrapy.Spider): 

    name = "gouv" 

    allowed_domains = ["legifrance.gouv.fr"] 

    start_urls = [ 

     "http://www.legifrance.gouv.fr/affichCode.do?cidTexte=LEGITEXT000006069577&dateTexte=20160128" 

     ] 

    def parse(self, response): 
     for href in response.xpath('//span/a/@href'): 
      url = response.urljoin(href.extract()) 
      yield scrapy.Request(url, callback=self.parse_article) 

    def parse_article(self, response): 
     for art in response.xpath("//div[@class='corpsArt']"): 
      item = GouvItem() 
      item['article'] = art.xpath('p/text()').extract() 
      yield item 




#And this is the GouvItem : 

import scrapy 

class GouvItem(scrapy.Item): 
    title1 = scrapy.Field() 
    title2 = scrapy.Field() 
    title3 = scrapy.Field() 
    title4 = scrapy.Field() 
    title5 = scrapy.Field() 
    title6 = scrapy.Field() 
    link = scrapy.Field() 
    article = scrapy.Field() 

This is some lines of the json file and we can see that some articles missing and others are there but many times

Проблема заключается в том, что каждая статья закона должна быть там, и только один раз. На веб-сайте каждая статья появляется только раз.

Большое спасибо!

+2

Пожалуйста, отредактируйте ваше сообщение и вставьте здесь свой код, чтобы люди могли скопировать его в свои редакторы. –

+1

Включите определение для 'GouvItem', тоже –

+0

ну ... Я просто понимаю, что я, если я выполню один и тот же сценарий два раз, оба результата не совпадают ... Я не понимаю, что ... –

ответ

0

Ссылки на подстраницы веб-сайта содержат идентификатор сеанса. Похоже, что ответ на запрос учитывает этот SessionID таким образом, который плохо работает при отправке нескольких параллельных запросов.

Один из способов исправить это, чтобы установить число CONCERRENT_REQUESTS в settings.py на 1. Скремблирование займет больше времени с этой настройкой.

Другим подходом было бы управлять запросами вручную со списком. См. Это answer на SO.

Для предотвращения пустых результатов используйте относительный XPath (завершающую точку) и извлечь весь текст:

item['article'] = art.xpath('.//text()').extract() 

Надеется, что это помогает.

+0

Большое вам спасибо! Кажется, что он делает что-то лучше, но законы не в правильном порядке. Это означает, что искатель принимает весь текст ul/li, а затем все ul/li/ul/li и т. Д.? Я собираюсь протестировать всю страницу, чтобы понять. –

+0

Это работает !!!!! Огромное спасибо !!! Я получил все! Единственная проблема, которую я имею сейчас, это тот факт, что законы все еще не в правильном порядке ... У вас есть идея об этом? –

+0

Сохраните текст раздела статьи в качестве дополнительного поля к вашему элементу. Затем вы можете отсортировать полученный json-файл этим полем. Я понятия не имею, как это можно сделать непосредственно с помощью scrapy - Извините! –