>

함수에서 특정 설정 (privoxy, Tor, randon 사용자 에이전트 ...)으로 셀레늄 브라우저를 시작한 다음이 함수를 내 코드에서 호출하고 싶습니다. 나는 파이썬 스크립트 mybrowser.py 를 만들었습니다.  이 안에 :

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from fake_useragent import UserAgent
from stem import Signal
from stem.control import Controller
class MyBrowserClass:
    def start_browser():
        service_args = [
            '--proxy=127.0.0.1:8118',
            '--proxy-type= http',
            ]
        dcap = dict(DesiredCapabilities.PHANTOMJS)
        dcap["phantomjs.page.settings.userAgent"] = (UserAgent().random)
        browser = webdriver.PhantomJS(service_args = service_args,         desired_capabilities=dcap)
        return browser
    def set_new_ip():
        with Controller.from_port(port=9051) as controller:
            controller.authenticate(password=password) 
            controller.signal(Signal.NEWNYM)

그런 다음 다른 스크립트 myscraping.py 로 가져옵니다.  이 안에 :

import mybrowser
import time
browser= mybrowser.MyBrowserClass.start_browser()
browser.get("https://canihazip.com/s")
print(browser.page_source)
mybrowser.MyBrowserClass.set_new_ip()
time.sleep(12) 
browser.get("https://canihazip.com/s")
print(browser.page_source)

브라우저가 작동 중입니다-페이지에 액세스하여 .page_source 로 검색 할 수 있습니다 .

그러나 IP는 첫 번째 인쇄와 두 번째 인쇄간에 변경되지 않습니다. myscraping.py 내에서 함수의 내용을 옮기면  (가져 오기 + 함수 호출 제거) 그런 다음 IP가 변경됩니다.

왜? 브라우저를 반환하는 데 문제가 있습니까? 이 문제를 어떻게 해결할 수 있습니까?

<시간> 실제로 상황은 조금 더 복잡합니다. https://check.torproject.org 에 연결하면   mybrowser.set_new_ip() 에 전화하기 전과 후에  그리고 wait of 12 sec  (아래 줄 참조) 웹 페이지에서 제공 한 IP는 첫 번째 통화와 두 번째 통화 사이에서 변경됩니다. 그래서 내 IP는 (Tor에 따라) 변경되었지만 https://httpbin.org/ip 는 아닙니다.  또는 icanhazip.com  IP의 변화를 감지합니다.

...
browser.get("https://canihazip.com/s")
print(browser.page_source)
browser.get("https://check.torproject.org/")
print(browser.find_element_by_xpath('//div[@class="content"]').text )
mybrowser.set_new_ip()
time.sleep(12) 
browser.get("https://check.torproject.org/")
print(browser.find_element_by_xpath('//div[@class="content"]').text )
browser.get("https://canihazip.com/s")
print(browser.page_source)

인쇄 된 IP는 다음과 같습니다 :

42.38.215.198 (canihazip before mybrowser.set_new_ip() )
42.38.215.198  (check.torproject before mybrowser.set_new_ip() )
106.184.130.30  (check.torproject after mybrowser.set_new_ip() )
42.38.215.198 (canihazip after  mybrowser.set_new_ip())

<시간>

Privoxy 구성 : C:\Program Files (x86)\Privoxy\config.txt , 나는이 줄의 주석을 해제했습니다 (9050은 Tor가 사용하는 포트입니다) :

forward-socks5t   /               127.0.0.1:9050

토어 구성 : torcc , 나는 이것을 가지고있다 :

ControlPort 9051
HashedControlPassword : xxxx


  • 답변 # 1

    이것은 PhantomJS가 요청 된 컨텐츠의메모리 캐시를 유지하기 때문에아마입니다. 따라서 PhantomJS 브라우저를 사용한 첫 번째 방문은 동적 결과를 가져올 수 있지만 결과는 캐시되고 연속 된 각 방문은 해당 캐시 된 페이지를 사용합니다.

    메모리 캐시CSRF-Token 와 같은 문제를 일으켰습니다. 새로 고침시 변경되지 않으며 문제의 근본 원인이라고 생각합니다. 이 문제는 2013 년에 제시되어 해결되었지만 해결책은 clearMemoryCache 입니다. , PhantomJS의 WebPage 에서 발견  수업. 슬프게도, 우리는 셀레늄 webdriver.PhantomJS 를 다루고 있습니다  인스턴스.

    따라서 내가 감독하지 않는 한 Selenium의 추상화를 통해이 방법에 액세스하는 것은 어렵습니다.

    PhantomJS와 같은메모리 캐시가없는 다른 웹 드라이버를 사용하는 것이 적절하다고 생각합니다. Chrome을 사용하여 테스트했으며 완벽하게 작동합니다.

    103.***.**.***
    72.***.***.***
    
    

    또한, Selenium은 PhantomJS를 단계적으로 폐지하고 있습니다 :

    와이즈 비즈 와이즈 비즈

  • 답변 # 2

    새로운 님이 있는지 확인해야 할 수도 있습니다.

    is_newnym_available-토르가 현재 NEWNYM 신호를 수락하면 true

    UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead

  • 이전 android - api에 대한 구글 인근 연결 액세스
  • 다음 node.js - js 서버 대 웹팩 대 계획