2017-09-21 8 views
2

foo.com을 크롤링하고 있다고 상상해보십시오. 가야 scrapy 원하는 내가 scrapy을 부탁 치료는 하나의 깊이만을 가진 외부 링크를 따릅니다

foo.com/hello 
foo.com/contact 
bar.com 
holla.com 

모든 내부 링크뿐만 아니라 외부 링크에 대해 하나의 깊이를 크롤링하는 등 : foo.com 자체에 여러 가지 내부 링크를 가지고 있으며,이 같은 일부 외부 링크가 bar.com 또는 holla.com에 이르지 만, bar.com 내의 다른 링크로 이동하기를 원하지 않습니다.

이 가능합니까? 이 경우에 대한 설정은 무엇입니까?

감사합니다.

답변

1

당신은 CrawlSpider 클래스에 거미를 기반으로하고 Rule에 전달할 것을 구현 process_links 방법 Rule의를 사용할 수 있습니다. 이 방법은 원치 않는 링크가 따라 오기 전에이를 필터링합니다.

process_links은 USING 각 응답에서 추출한 각 링크에서 요구 될 것이다 (이 경우 그 이름이 스파이더 객체의 메소드를 사용한다)를 호출하거나 문자열 다음 documentation 출발지 지정한 link_extractor. 이것은 주로 필터링 목적으로 사용됩니다.

0

내장 된 솔루션이 아니지만 직접 재귀를 방해해야한다고 생각합니다. 당신은 거미에 도메인의 배열 (집합)을 유지하고 간섭하거나 무시함으로써 쉽게 그 일을 할 수 있습니다. 정렬의

뭔가를해야만이 :

from urllib.parse import urlparse 

self.track = set() 

... 
domain = tracktraurlparse(response.url).netloc 
x.add(domain) 
if len(x) > MAX_RECURSION: 
    x.remove(domain) 
    # raise StopIteration (# if you're within a generator) 
    return None 
0

나는 콜백 함수에 인수를 전달하여 해결책을 발견했다. url이 내부 링크 인 경우 플래그를 true로 설정하고 (그렇지 않으면 false) 플래그가 false를 반환하면 (외부 링크) 크롤러가 새 링크를 추출하지 않습니다. 여기 내 샘플 코드 :

class BrokenLinksSpider(CrawlSpider): 
name = test 
start_urls = "your_url" 

def parse(self, response): 
    flag = response.meta.get('flag') 
    if flag or flag==None: 
     extractor = LinkExtractor(deny_domains="") 
     links = extractor.extract_links(response) 
     for link in links: 
      if link.url[:8]=="your_url": 
       new_request = Request(link.url, callback=self.parse,meta={'flag': True}) 
      else: 
       new_request = Request(link.url, callback=self.parse,meta={'flag': False}) 
      yield new_request