Mag*_*Tun 15 python selenium return definition phantomjs
我想在函数中启动一个具有特定设置(privoxy,Tor,randon用户代理...)的selenium浏览器,然后在我的代码中调用此函数.我在mybrowser.py
里面创建了一个python脚本:
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)
Run Code Online (Sandbox Code Playgroud)
然后我将其导入到另一个脚本中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)
Run Code Online (Sandbox Code Playgroud)
浏览器正在运行 - 我可以访问该页面并使用它进行检索.page_source
.
但IP在第一次和第二次打印之间没有变化.如果我在里面移动函数的内容myscraping.py
(并删除import +函数调用),那么IP就会改变.
为什么?返回浏览器有问题吗?我怎样才能解决这个问题?
实际上,情况有点复杂.当我连接到https://check.torproject.org
之前和之后调用mybrowser.set_new_ip()
和wait of 12 sec
(CF下方的线),由所述第一和第二呼叫之间的网页的变化给出的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)
Run Code Online (Sandbox Code Playgroud)
所以打印的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())
Run Code Online (Sandbox Code Playgroud)
Privoxy配置:在C:\Program Files (x86)\Privoxy\config.txt
,我已经取消注释了这一行(9050是Tor使用的端口):
forward-socks5t / 127.0.0.1:9050
Run Code Online (Sandbox Code Playgroud)
Tor配置:在torcc
,我有这个:
ControlPort 9051
HashedControlPassword : xxxx
Run Code Online (Sandbox Code Playgroud)
这可能是因为 PhantomJS 保留了请求内容的内存缓存。因此,您使用 PhantomJS 浏览器的第一次访问可以获得动态结果,但该结果随后会被缓存,并且每次连续访问都会使用该缓存页面。
此内存缓存导致了CSRF-Token
刷新时未更改等问题,现在我相信这是问题的根本原因。该问题于 2013 年提出并解决,但解决方案是clearMemoryCache
PhantomJSWebPage
类中的方法 。遗憾的是,我们正在处理一个 Seleniumwebdriver.PhantomJS
实例。
因此,除非我正在监督某些事情,否则很难通过 Selenium 的抽象访问此方法。
我认为唯一合适的解决方案是使用另一个没有像 PhantomJS 这样的内存缓存的网络驱动程序。我已经使用 Chrome 对其进行了测试,效果非常好:
103.***.**.***
72.***.***.***
Run Code Online (Sandbox Code Playgroud)
另外,顺便说一句,Selenium 正在逐步淘汰 PhantomJS:
UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
归档时间: |
|
查看次数: |
839 次 |
最近记录: |