停止 Scrapy 抓取相同的 URL
Stop Scrapy crawling the same URLs
我写了一个基本的 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'
任何关于停止它的帮助/指导/指示运行将不胜感激...
因为我是新手;任何关于整理代码的评论也会有所帮助(或指向好的指导的链接)。
谢谢...
您的设计使爬行在原地打转。例如,有一个页面 http://www.lsbu.ac.uk/business-and-partners/business, which when opened contains the link to "http://www.lsbu.ac.uk/business-and-partners/partners,该页面再次包含第一个页面的 link。就这样一直在兜圈子。
为了克服这个问题,您需要创建更好的规则,消除循环引用。
而且,您定义了两个相同的规则,这是不需要的。如果你想要 follow
你总是可以把它放在同一条规则上,你不需要新的规则。
DupeFilter 默认启用:http://doc.scrapy.org/en/latest/topics/settings.html#dupefilter-class 并且它基于请求 url。
我在没有任何自定义配置的新香草 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
我写了一个基本的 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'
任何关于停止它的帮助/指导/指示运行将不胜感激...
因为我是新手;任何关于整理代码的评论也会有所帮助(或指向好的指导的链接)。
谢谢...
您的设计使爬行在原地打转。例如,有一个页面 http://www.lsbu.ac.uk/business-and-partners/business, which when opened contains the link to "http://www.lsbu.ac.uk/business-and-partners/partners,该页面再次包含第一个页面的 link。就这样一直在兜圈子。
为了克服这个问题,您需要创建更好的规则,消除循环引用。
而且,您定义了两个相同的规则,这是不需要的。如果你想要 follow
你总是可以把它放在同一条规则上,你不需要新的规则。
DupeFilter 默认启用:http://doc.scrapy.org/en/latest/topics/settings.html#dupefilter-class 并且它基于请求 url。
我在没有任何自定义配置的新香草 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