2012-07-31 6 views
1

인덱스 페이지의 데이터 또는 정보를 기반으로 특정 페이지를 크롤링하기 위해 스파이더를 작성하려고합니다. 그런 다음 결과를 데이터베이스에 저장하십시오.인덱스 페이지 정보를 기반으로 웹 페이지를 크롤링하는 방법

예를 들어, stackoverflow.com/questions/tagged/scrapy를 크롤링하고 싶다고 가정 해 봅시다. 질문이 내 데이터베이스에 없으면 색인 페이지를 통해 갈 것입니다. 데이터베이스로 이동 한 다음 질문 링크를 클릭하고 해당 페이지를 크롤링합니다.

질문이 이미 데이터베이스에 있지만 답변 수가 데이터베이스의 것보다 큰 경우 : 해당 페이지를 다시 크롤링하십시오.

질문이 이미 데이터베이스에 있고 응답 카운터가 같은 경우 :이 질문을 무시하십시오.

현재 색인 페이지에서 모든 링크와 답변 개수 (이 예)를 얻을 수 있습니다. 하지만 거미가 대답 수에 대한 질문 페이지베이스 링크를 따르는 방법을 모르겠습니다.

두 스파이더 대신 하나의 스파이더를 사용하는 방법이 있습니다. 하나의 스파이더가 색인 페이지에서 모든 링크를 가져 와서 데이터를 데이터베이스와 비교하고 json 또는 csv 파일을 내 보낸 다음 전달합니다 다른 스파이더에게 질문 페이지를 크롤링 하시겠습니까?

답변

0

그냥 BaseSpider를 사용하십시오. 그렇게하면 모든 논리를 근근이 살아가는 콘텐츠에 의존하게 만들 수 있습니다. BaseSpider는 스크래핑 프로세스를보다 강력하게 제어하므로 개인적으로 선호합니다.

from scrapy.selector import HtmlXPathSelector 
from scrapy.spider import BaseSpider 
from scrapy.http import Request 
from myproject.items import MyItem 

class StackOverflow(BaseSpider): 
    name = 'stackoverflow.com' 
    allowed_domains = ['stackoverflow.com'] 
    start_urls = ['http://stackoverflow.com/questions'] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 

     for question in hxs.select('//question-xpath'): 
      question_url = question.select('./question-url') 
      answer_count = question.select('./answer-count-xpath') 
      # you'll have to write the xpaths and db logic yourself 
      if get_db_answer_count(question_url) != answer_count[0]: 
       yield Request(question_url, callback = self.parse_question) 

    def parse_question(self, response): 
     insert_question_and_answers_into_db 
     pass 
+0

스파이더가 실행 중일 때 start_urls 목록에 동적으로 URL을 추가 할 수 있습니까? 귀하의 예에서는 거미가 첫 번째 질문 페이지를 긁기 시작하지만 두 번째 페이지로 이어지지 않습니다. 첫 페이지를 긁어 내서 start_urls 기반에 두 번째 페이지를 추가 할 수 있습니까? 예를 들어, 첫 번째 페이지의 마지막 질문이 내 데이터베이스에없는 경우, 두 번째 페이지에서 내가 긁어 모으지 않은 새로운 질문이있을 수 있습니다. 그래서 두 번째 페이지로 가서 확인해야합니다. 스파이더가 실행되는 동안 어떻게 start_urls에 새 URL을 추가 할 수 있습니까? – user1499532

0

이것은 CrawlSpider과 규칙이 수행하는 것입니다 (예제를 꼭 확인하십시오). 먼저 인덱스 사이트에서 정보를 얻을 수 있습니다 (접근 방법 계산에 대한 해답은 다소 잘못되었습니다 : 사용자가 게시물을 삭제하고 새 게시물이 추가 된 경우) 정보를 얻으려면 각 하위 페이지를 결정하거나 아니.

간단히 말하기 : 색인 페이지에서 거미를 사용하고 질문에 답하십시오. 질문이 있으면 정보를 얻고 싶으면 drop/ignore the question을 확인하십시오.

+0

감사 :

거미는 다음과 같이 (이것은 의사 코드의 이상이다) 보일 것입니다. 대답의 수를 세는 것은 하나의 예일뿐입니다. 하지만 나는 데이터베이스의 스크랩 된 데이터와 함께 응답 수 (이 예에서는)를 저장하고 싶습니다. 규칙을 사용하여 내 문제는 단지 링크 패턴을 확인한다는 것입니다. 색인 페이지의 특정 데이터에 대한 링크 기반을 따르는 거미를 구축하려고합니다. 내 stackoverflow 예제를 계속하려면 질문에 user1499532가 물으면 다음 링크를 따르십시오. else : drop/ignore. – user1499532

+0

규칙으로는 수행 할 수 없지만 Scrapy로는 다른 기법으로 수행 할 수 있습니다. 사이트 (응답)를 수신하고 처리할지 여부를 결정하는 파이프 라인을 만들 수 있습니다. 또 다른 방법은 항목을 만들기 전에 확인하는 것입니다. 거미 자신이 이것을 결정할 수는 없지만, 사용할 수있는 메커니즘 중 하나입니다. – DrColossos

관련 문제