使用 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()

这是json文件的一些行,我们可以看到一些文章丢失而其他文章在那里,但很多时候

问题是法律的每一条都应该存在,而且只有一次。在网站上,每篇文章只出现时间。

多谢!

指向网站子页面的链接包含一个会话 ID。看起来请求的响应考虑了该会话ID,其方式不适用于发送多个并发请求。

解决此问题的一种方法是将settings.py中的CONCERRENT_REQUESTS数设置为 1 。当然,使用此设置,抓取需要更长的时间。

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

要防止结果为空,请使用相对XPath(尾随点)并提取所有文本:

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

希望这有帮助。

最新更新