2013-07-21 11 views
1

죄송합니다. 질문이 바보 인 경우 죄송하지만 아직 답변을 찾을 수 없습니다.치료의 응답 개체가 완료되지 않았습니다

나는 "scrapy 쉘"명령을 사용하여 웹 사이트에서 데이터를 추출하는 스크립트를 준비하기 위해 노력하고 다음 URL (예 : "http://www.testsite.com/data_to_extract")를 입력하는 웹 브라우저를 사용하여

  • 을, 나는 데이터를 얻을 추출 할. 이 페이지는 정적 데이터 + 동적 데이터를 포함합니다.

  • "scrapy shell http://www.testsite.com/data_to_extract"명령을 사용하여 명령 ("view (response)")을 실행하면 웹 브라우저에 동적 데이터가 아닌 정적 데이터가 표시됩니다.

내가 의심하는 바는 웹 서버가 먼저 정적 데이터를 처리 한 다음 페이지의 동적 데이터를 채 웁니다. 나는 이것이 웹 페이지에서 자바 스크립트를 통해 관리되는 것 같아요.

내 이해가 정확하다면, 결과가 돌아 오기 전에 치료가 조금씩 기다려야 할 필요가 있습니다.

누군가 나를 도와 줄 수 있습니까?

감사합니다.

+0

Scrapy는 브라우저의 "소스보기"명령에서 볼 수있는 것을 제공 할 것이며 브라우저 창에서 해석 한 내용이 아닌 것을 제공 할 것입니다. Scrapy는 자바 스크립트를 이해하지 못하므로 AJAX 호출이 아니고 jQuery 마술도 없다 ... 그래서 동적 인 데이터는 없다. 브라우저 개발자 도구에서 네트워크 활동을 살펴보고 새로운 Scrapy Request()를 사용하여 Javascript/AJAX 호출을 모방하여 추가 컨텐츠를 가져올 수 있지만 Scrapy를 사용하여 실제 브라우저를 모방하기가 어려울 수 있습니다. –

+0

https : //github.com/scrapinghub/scrapyjs –

답변

0

다음은 다운로드 핸들러 미들웨어에서 selenium 및 phantomjs headless webdriver를 사용하는 작동 예제입니다.

class JsDownload(object): 

@check_spider_middleware 
def process_request(self, request, spider): 
    driver = webdriver.PhantomJS(executable_path='D:\phantomjs.exe') 
    driver.get(request.url) 
    return HtmlResponse(request.url, encoding='utf-8', body=driver.page_source.encode('utf-8')) 

는 나는이 래퍼를 구현하므로 사용할 미들웨어 다른 거미를 말할 수있는 능력을 원 :

def check_spider_middleware(method): 
@functools.wraps(method) 
def wrapper(self, request, spider): 
    msg = '%%s %s middleware step' % (self.__class__.__name__,) 
    if self.__class__ in spider.middleware: 
     spider.log(msg % 'executing', level=log.DEBUG) 
     return method(self, request, spider) 
    else: 
     spider.log(msg % 'skipping', level=log.DEBUG) 
     return None 

return wrapper 

settings.py : 모든 거미를 작동하는 랩퍼

DOWNLOADER_MIDDLEWARES = {'MyProj.middleware.MiddleWareModule.MiddleWareClass': 500} 

해야 최소한 :

middleware = set([]) 
당신은 (거미) 요청 콜백이 구현 수도 있지만, 다음 HTTP 요청이 두 번 발생 될 수

middleware = set([MyProj.middleware.ModuleName.ClassName]) 

: 10

는 미들웨어를 포함합니다. 이것은 완전한 증거 솔루션은 아니지만 .ready()에로드되는 내용에 적용됩니다. 셀레늄을 읽는 데 시간을 할애하면 페이지 소스를 저장하기 전에 특정 이벤트가 트리거 될 때까지 기다릴 수 있습니다.

또 다른 예 : https://github.com/scrapinghub/scrapyjs

건배!

관련 문제