0
선택적 로그인으로 재귀 webspider를 구축 중입니다. json 설정 파일을 통해 대부분의 설정을 동적으로 만들고 싶습니다.치료 InitSpider : __init__에 규칙을 설정 하시겠습니까?
내 __init__
함수에서이 파일을 읽고 모든 변수를 채우려 고 시도하지만 Rules
과 작동하지 않습니다.
class CrawlpySpider(InitSpider):
...
#----------------------------------------------------------------------
def __init__(self, *args, **kwargs):
"""Constructor: overwrite parent __init__ function"""
# Call parent init
super(CrawlpySpider, self).__init__(*args, **kwargs)
# Get command line arg provided configuration param
config_file = kwargs.get('config')
# Validate configuration file parameter
if not config_file:
logging.error('Missing argument "-a config"')
logging.error('Usage: scrapy crawl crawlpy -a config=/path/to/config.json')
self.abort = True
# Check if it is actually a file
elif not os.path.isfile(config_file):
logging.error('Specified config file does not exist')
logging.error('Not found in: "' + config_file + '"')
self.abort = True
# All good, read config
else:
# Load json config
fpointer = open(config_file)
data = fpointer.read()
fpointer.close()
# convert JSON to dict
config = json.loads(data)
# config['rules'] is simply a string array which looks like this:
# config['rules'] = [
# 'password',
# 'reset',
# 'delete',
# 'disable',
# 'drop',
# 'logout',
# ]
CrawlpySpider.rules = (
Rule(
LinkExtractor(
allow_domains=(self.allowed_domains),
unique=True,
deny=tuple(config['rules'])
),
callback='parse',
follow=False
),
)
Scrapy 여전히 config['rules']
에 존재하기 때문에 또한 logout
페이지 히트 페이지를 크롤링합니다. 따라서 지정된 페이지가 거부되지 않습니다. 내가 여기서 무엇을 놓치고 있니?
업데이트 : 이미 __init__
내부 CrawlpySpider.rules = ...
뿐만 아니라 self.rules = ...
를 설정하여 시도
. 두 변형 모두 작동하지 않습니다.
- 거미 :
InitSpider
- 규칙 : 크롤 전에
LinkExtractor
- :
를 크롤링하기 전에 로그인을하는 것은 나는 심지어 내 parse
기능에 그것을 거부하려고
# Dive deeper?
# The nesting depth is now handled via a custom middle-ware (middlewares.py)
#if curr_depth < self.max_depth or self.max_depth == 0:
links = LinkExtractor().extract_links(response)
for link in links:
for ignore in self.ignores:
if (ignore not in link.url) and (ignore.lower() not in link.url.lower()) and link.url.find(ignore) == -1:
yield Request(link.url, meta={'depth': curr_depth+1, 'referer': response.url})
나는 그것을 시도해도 작동하지 않았다. 나는 그 정보를 내 질문에 추가했다. – cytopia
InitSpider는'_compile_rules'와 같은 것을 가지고 있지 않습니다 (CrawlSpider와 마찬가지입니다). 분명히 InitSpider는 Spider에서 상속하는 것만 큼 규칙조차 갖고 있지 않은 것처럼 보입니다. CrawlSpider는이 모든 것을 구현합니다. – cytopia