停止Scrapy抓取相同的网址

时间:2015-04-26 20:29:05

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

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

蜘蛛如下:

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'

任何关于阻止它连续运行的帮助/指导/指导都将非常感激......

因为我是这个的新手;任何关于整理代码的评论也会有所帮助(或指向良好教学的链接)。

谢谢...

2 个答案:

答案 0 :(得分:3)

默认情况下启用DupeFilter:http://doc.scrapy.org/en/latest/topics/settings.html#dupefilter-class并且它基于请求网址。

我在一个新的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

答案 1 :(得分:1)

您的设计会使抓取进入圈内。例如,有一个页面http://www.lsbu.ac.uk/business-and-partners/business,在打开时包含指向" http://www.lsbu.ac.uk/business-and-partners/partners的链接,并且该页面再次包含指向第一个的链接。因此,你无限期地进入圈子。

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