복붙노트

[PYTHON] Python으로 구동되는 PhantomJS / Selenium의 CSS / 기타 리소스 다운로드 방지

PYTHON

Python으로 구동되는 PhantomJS / Selenium의 CSS / 기타 리소스 다운로드 방지

CSS / 다른 리소스의 다운로드를 방지하여 Python에서 Selenium / PhantomJS 웹 스크래퍼 속도를 높이려고합니다. 다운로드가 필요한 것은 img src와 alt 태그뿐입니다. 이 코드를 찾았습니다.

page.onResourceRequested = function(requestData, request) {
    if ((/http:\/\/.+?\.css/gi).test(requestData['url']) || requestData['Content-Type'] == 'text/css') {
        console.log('The url of the request is matching. Aborting: ' + requestData['url']);
        request.abort();
    }
};

via : 어떤 종류의 리소스를 건너 뛰도록 PhantomJS를 제어하려면 어떻게해야합니까?

어떻게 / 어디서 Python으로 구동되는 Selenium에서이 코드를 구현할 수 있습니까? 아니면 CSS / 다른 리소스를 다운로드하지 못하도록하는 또 다른 방법이 있습니까?

참고 : 저는 이미 다음을 통해 service_args 변수를 편집하여 이미지 다운로드를 방지하는 방법을 찾았습니다.

파이썬 webdriver에서 phantomjs / ghostdriver에 대한 프록시를 설정하려면 어떻게해야합니까?

python에 Selenium이있는 PhantomJS 1.8. 이미지를 차단하는 방법?

그러나 service_args는 CSS와 같은 리소스로 나를 도와 줄 수 없습니다. 감사!

해결법

  1. ==============================

    1."watsonmw"라는 대담한 젊은 영혼은 최근에 Ghostdriver (Phantom.js가 Selenium과 인터페이스하기 위해 사용하는 기능)에 추가하여 onResourceRequested와 같은 페이지 객체가 필요한 Phantom.js API 호출에 액세스 할 수있게했습니다.

    "watsonmw"라는 대담한 젊은 영혼은 최근에 Ghostdriver (Phantom.js가 Selenium과 인터페이스하기 위해 사용하는 기능)에 추가하여 onResourceRequested와 같은 페이지 객체가 필요한 Phantom.js API 호출에 액세스 할 수있게했습니다.

    해결책을 얻으려면 소스에서 빌드를 고려하십시오 (개발자는 "근대 컴퓨터에서 4 개의 병렬 컴파일 작업으로 약 30 분이 소요됩니다"). 그리고 위에 링크 된 패치를 통합하십시오.

    그렇다면이 (테스트되지 않은) 파이썬 코드는 개념 증명으로 작동해야합니다.

    from selenium import webdriver
    driver = webdriver.PhantomJS('phantomjs')
    
    # hack while the python interface lags
    driver.command_executor._commands['executePhantomScript'] = ('POST', '/session/$sessionId/phantom/execute')
    
    driver.execute('executePhantomScript', {'script': '''
    page.onResourceRequested = function(requestData, request) {
        // ...
    }
    ''', 'args': []})
    

    그때까지만 변수를 찾을 수 없습니다 : 페이지 예외가 발생합니다.

    행운을 빕니다! Javascript 환경에서 작업하고, 도마뱀을 몰며, 프록시를 만드는 것과 같은 많은 훌륭한 대안이 있습니다.

  2. ==============================

    2.윌의 대답이 나를 따라 잡았어. (감사합니다!)

    윌의 대답이 나를 따라 잡았어. (감사합니다!)

    현재 PhantomJS (1.9.8)에는 이미 watsonmw의 패치가 포함 된 Ghostdriver 1.1.0이 포함되어 있습니다.

    최신 PhantomJS를 다운로드하고 다음을 수행해야합니다 (sudo가 필요할 수도 있음).

    ln -s path/to/bin/phantomjs  /usr/local/share/phantomjs
    ln -s path/to/bin/phantomjs  /usr/local/bin/phantomjs
    ln -s path/to/bin/phantomjs  /usr/bin/phantomjs
    

    그리고 이것을 시도하십시오 :

    from selenium import webdriver
    driver = webdriver.PhantomJS('phantomjs')
    
    # hack while the python interface lags
    driver.command_executor._commands['executePhantomScript'] = ('POST', '/session/$sessionId/phantom/execute')
    
    driver.execute('executePhantomScript', {'script': '''
        var page = this; // won't work otherwise
        page.onResourceRequested = function(requestData, request) {
        // ...
    }
    ''', 'args': []})
    
  3. ==============================

    3.제안 된 솔루션이 나에게 도움이되지 않았지만이 솔루션은 작동합니다 (driver.execute_script 사용).

    제안 된 솔루션이 나에게 도움이되지 않았지만이 솔루션은 작동합니다 (driver.execute_script 사용).

    driver.command_executor._commands['executePhantomScript'] = ('POST', '/session/$sessionId/phantom/execute')
    
    driver.execute_script('''
        this.onResourceRequested = function(request, net) {
            console.log('REQUEST ' + request.url);
        };
    ''')
    
  4. from https://stackoverflow.com/questions/19099070/prevent-css-other-resource-download-in-phantomjs-selenium-driven-by-python by cc-by-sa and MIT license