2016-02-02 65 views
0

我有一个问题,我想解析一个网站并从中抓取每篇文章的链接,但问题是Scrapy不抓取所有链接并随机抓取其中一些链接。用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。它看起来像一个请求的响应考虑到sessionID的方式,不适合与scrapy发送多个并发请求。

解决此问题的一种方法是将settings.py中的CONCERRENT_REQUESTS的数量设置为1。使用此设置刮刮花的时间会更长。

另一种方法是用列表手动控制请求。在SO上看到这个answer

为了防止空结果使用相对XPath(后点),并提取所有文字:

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

希望这有助于。

+0

非常感谢!似乎要做得更好,但法律并不正确。这意味着爬虫采取所有ul/li文本,然后所有ul/li/ul/li等?我要测试整个页面以了解。 –

+0

It Works !!!!!非常感谢 !!!我得到了一切!我现在唯一的问题是,法律仍然没有正确的顺序......你有什么想法吗? –

+0

将文章部分文本另存为项目的其他字段。然后,您可以按照该字段对生成的json文件进行排序。我不知道如何直接用scrapy完成 - 对不起! –