Python 停止抓取相同的URL

Python 停止抓取相同的URL,python,web-scraping,web-crawler,scrapy,duplication,Python,Web Scraping,Web Crawler,Scrapy,Duplication,我已经编写了一个基本的Scrapy spider来抓取一个运行良好的网站,而不是它不想停止的事实,即它不断地重新访问相同的URL并返回相同的内容-我总是不得不停止它。我怀疑它会一遍又一遍地浏览相同的URL。有没有一条规则可以阻止这一切?还是我还有别的事要做?也许吧 蜘蛛网如下: class LsbuSpider(CrawlSpider): name = "lsbu6" allowed_domains = ["lsbu.ac.uk"] start_urls = [ "http://www.

我已经编写了一个基本的Scrapy spider来抓取一个运行良好的网站,而不是它不想停止的事实,即它不断地重新访问相同的URL并返回相同的内容-我总是不得不停止它。我怀疑它会一遍又一遍地浏览相同的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'
如有任何关于停止其连续运行的帮助/指导/指示,将不胜感激

因为我是个新手;任何关于整理代码的评论都会很有帮助(或者链接到好的说明)


谢谢

您的设计使爬行成圆形。例如,有一个页面,打开时包含指向“”的链接,而该页面又包含指向第一个页面的链接。因此,您会无限期地兜圈子

为了克服这个问题,您需要创建更好的规则,消除循环引用。
另外,您定义了两个相同的规则,这是不需要的。如果您希望
遵循
,则始终可以将其放在同一规则上,您不需要新规则。

默认情况下,DupeFilter处于启用状态:并且它基于请求url

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

我测试的简化蜘蛛:

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

你是对的,默认情况下它应该过滤重复项。在设置中设置
DUPEFILTER\u DEBUG=True
,查看它发生了什么。我尝试了你的建议,但没有改变任何内容。我根据你的信息进行了进一步的阅读和web搜索,并在我的pipeline.py和settings.py中添加了一些代码。现在我得到了一个error,所以我会问一个新问题,因为我无法解决这个问题-严格遵循Scrapy文档!!!你有哪个版本的Scrapy?很抱歉回复太慢-不在了。有趣的是,当我将
return
更改为
yield
Scrapy时,Scrapy告诉我它正在过滤重复链接,但是唯一的问题是,
项目
没有被刮伤!
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