【问题标题】:Stop Scrapy crawling the same URLs停止 Scrapy 抓取相同的 URL
【发布时间】:2015-07-05 03:53:01
【问题描述】:

我编写了一个基本的 Scrapy 蜘蛛来抓取一个似乎运行良好的网站,除了它不想停止的事实,即它不断重新访问相同的 url 并返回相同的内容 - 我总是最终有阻止它。我怀疑它会一遍又一遍地遍历相同的网址。有什么规则可以阻止这种情况吗?或者我还有什么需要做的吗?也许是中间件?

蜘蛛如下:

class LsbuSpider(CrawlSpider):
name = "lsbu6"
allowed_domains = ["lsbu.ac.uk"]
start_urls = [
    "http://www.lsbu.ac.uk"
]
rules = [
    Rule(SgmlLinkExtractor(allow=['lsbu.ac.uk/business-and-partners/.+']), callback='parse_item', follow=True),
]

def parse_item(self, response):
    join = Join()
    sel = Selector(response)
    bits = sel.xpath('//*')
    scraped_bits = []            
    for bit in bits:
        scraped_bit = LsbuItem()
        scraped_bit['title'] = scraped_bit.xpath('//title/text()').extract()
        scraped_bit['desc'] = join(bit.xpath('//*[@id="main_content_main_column"]//text()').extract()).strip()
        scraped_bits.append(scraped_bit)

    return scraped_bits

我的settings.py 文件如下所示

BOT_NAME = 'lsbu6'
DUPEFILTER_CLASS = 'scrapy.dupefilter.RFPDupeFilter'
DUPEFILTER_DEBUG = True
SPIDER_MODULES = ['lsbu.spiders']
NEWSPIDER_MODULE = 'lsbu.spiders'

任何关于停止它连续运行的帮助/指导/说明将不胜感激......

因为我是新手;任何整理代码的 cmets 也会有所帮助(或链接到良好的指令)。

谢谢...

【问题讨论】:

    标签: python web-scraping web-crawler scrapy duplication


    【解决方案1】:

    DupeFilter 默认启用:http://doc.scrapy.org/en/latest/topics/settings.html#dupefilter-class,它基于请求 url。

    我在一个新的 vanilla scrapy 项目中尝试了您的蜘蛛的简化版本,没有任何自定义配置。 dupefilter 工作,并且在几次请求后爬行停止。我会说你的设置或你的scrapy版本有问题。我建议你升级到scrapy 1.0,以确保:)

    $ pip install scrapy --pre
    

    我测试的简化蜘蛛:

    from scrapy.spiders import CrawlSpider
    from scrapy.linkextractors import LinkExtractor
    from scrapy import Item, Field
    from scrapy.spiders import Rule 
    
    class LsbuItem(Item):
        title = Field()
        url = Field()
    
    class LsbuSpider(CrawlSpider):
        name = "lsbu6"
        allowed_domains = ["lsbu.ac.uk"]
    
        start_urls = [
            "http://www.lsbu.ac.uk"
        ]    
    
        rules = [
            Rule(LinkExtractor(allow=['lsbu.ac.uk/business-and-partners/.+']), callback='parse_item', follow=True),
        ]    
    
        def parse_item(self, response):
            scraped_bit = LsbuItem()
            scraped_bit['url'] = response.url
            yield scraped_bit
    

    【讨论】:

      【解决方案2】:

      您的设计使爬行绕圈子。例如,有一个页面http://www.lsbu.ac.uk/business-and-partners/business,打开时包含指向“http://www.lsbu.ac.uk/business-and-partners/partners”的链接,而该页面又包含指向第一个页面的链接。因此,您会无限循环。

      为了克服这个问题,您需要创建更好的规则,消除循环引用。 而且,您定义了两个相同的规则,这不是必需的。如果您想要follow,您可以随时将它放在相同的规则上,您不需要新规则。

      【讨论】:

      • 你是对的,它应该默认过滤重复项。在设置中设置DUPEFILTER_DEBUG=True,看看它发生了什么。
      • 我尝试了您的建议,但没有任何改变。我根据您的信息做了一些进一步的阅读和网络搜索,并在我的 pipeline.py 和 settings.py 中添加了一些代码。现在我遇到了一个错误,所以会问一个新的问题,因为我无法解决这个问题 - 按照 Scrapy 文档进行操作!!!
      • 你有哪个版本的scrapy?
      • 抱歉回复慢 - 不在。我正在使用 Scrapy 0.24.5
      • 有趣的是,当我将 return 更改为 yield 时,Scrapy 告诉我它正在过滤掉重复的链接,但唯一的问题是 items 没有被刮掉!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      相关资源
      最近更新 更多