Python Scrapy LinkExtractor-限制每个URL爬网的页面数
我试图限制Scrapy中爬行蜘蛛中每个URL的爬行页面数。我有一个开始的URL列表,我想设置一个在每个URL页面被抓取的数量限制。一旦达到限制,爬行器应移动到下一个开始url 我知道有深度限制参数的设置,但这不是我要找的 任何帮助都是有用的 以下是我目前拥有的代码:Python Scrapy LinkExtractor-限制每个URL爬网的页面数,python,web-crawler,scrapy,limit,Python,Web Crawler,Scrapy,Limit,我试图限制Scrapy中爬行蜘蛛中每个URL的爬行页面数。我有一个开始的URL列表,我想设置一个在每个URL页面被抓取的数量限制。一旦达到限制,爬行器应移动到下一个开始url 我知道有深度限制参数的设置,但这不是我要找的 任何帮助都是有用的 以下是我目前拥有的代码: class MySpider(CrawlSpider): name = 'test' allowed_domains = domainvarwebsite start_urls = httpvarwebsit
class MySpider(CrawlSpider):
name = 'test'
allowed_domains = domainvarwebsite
start_urls = httpvarwebsite
rules = [Rule(LinkExtractor(),
callback='parse_item',
follow=True)
]
def parse_item(self, response):
#here I parse and yield the items I am interested in.
编辑
我已经尝试实现了这一点,但是我得到了异常。语法错误:无效语法(filter\u domain.py,第20行)
。你知道发生了什么事吗
再次感谢
过滤域.py
import urlparse
from collections import defaultdict
from scrapy.exceptions import IgnoreRequest
class FilterDomainbyLimitMiddleware(object):
def __init__(self, domains_to_filter):
self.domains_to_filter = domains_to_filter
self.counter = defaultdict(int)
@classmethod
def from_crawler(cls, crawler):
settings = crawler.settings
spider_name = crawler.spider.name
max_to_filter = settings.get('MAX_TO_FILTER')
o = cls(max_to_filter)
return o
def process_request(self, request, spider):
parsed_url = urlparse.urlparse(request.url)
(LINE 20:) if self.counter.get(parsed_url.netloc, 0) < self.max_to_filter[parsed_url.netloc]):
self.counter[parsed_url.netloc] += 1
else:
raise IgnoreRequest()
MAX_TO_FILTER = 30
DOWNLOADER_MIDDLEWARES = {
'myproject.filter_domain.FilterDomainbyLimitMiddleware' :400,
}
Scrapy不直接提供此功能,但您可以创建一个自定义中间件,如下所示:
import urlparse
from collections import defaultdict
from scrapy.exceptions import IgnoreRequest
class FilterDomainbyLimitMiddleware(object):
def __init__(self, domains_to_filter):
self.domains_to_filter = domains_to_filter
self.counter = defaultdict(int)
@classmethod
def from_crawler(cls, crawler):
settings = crawler.settings
spider_name = crawler.spider.name
domains_to_filter = settings.get('DOMAINS_TO_FILTER')
o = cls(domains_to_filter)
return o
def process_request(self, request, spider):
parsed_url = urlparse.urlparse(request.url)
if parsed_url.netloc in self.domains_to_filter:
if self.counter.get(parsed_url.netloc, 0) < self.domains_to_filter[parsed_url.netloc]):
self.counter[parsed_url.netloc] += 1
else:
raise IgnoreRequest()
只接受来自该域的5个请求。还记得在指定的设置中启用中间件Great!我如何修改您的代码以设置固定数量的请求,无论它是哪个域?所以我只需要在settings.py上写一个MAX_REQUESTS=5?如果进程中的请求我试图修改它,但出现错误,请删除第一个。我已经编辑了我的问题,将我正在使用的当前代码放入其中。在第20行的“:”之前有一个行首“)”。
DOMAINS_TO_FILTER = {
'mydomain': 5
}