在每次运行时为PhantomJs使用相同的会话

Efe*_*Efe 11 c# java selenium phantomjs selenium-webdriver

我正在抓取一个安全的网站,每当我重新启动我的爬虫应用程序时都会阻止我(我需要将IP更改为技巧).我在Chrome驱动程序中使用默认用户配置文件解决了这个问题(我现在正在使用C#,但如果需要我可以切换到java):

ChromeOptions options = new ChromeOptions();
options.AddArguments($"user-data-dir=C:/Users/{Environment.UserName}/AppData/Local/Google/Chrome/User Data/Default");
Run Code Online (Sandbox Code Playgroud)

它会保存所有会话和cookie,并在重新启动应用程序时恢复它们.一切都按预期工作.

现在,由于某些原因,我需要将我的webdriver更改为PhantomJS.

我的问题如何使用PhantomJS使这种情况成为可能:登录帐户(如gmail或facebook),关闭我的应用程序和驱动程序,在下次运行应用程序和驱动程序时发现自己已登录.换句话说,如何在每次运行时为PhantomJS使用相同的会话?

尝试1(在C#中):

在做了一些搜索之后,我发现这可以使用PhantomJS中的本地存储和cookie文件参数来完成.现在问题是本地存储路径总是空的并且没有保存(我导航到多个站点但仍然是空的),因此,我不能使用先前执行的会话.我设置本地存储和cookie文件的代码很简单,如下所示:

PhantomJSDriverService service = PhantomJSDriverService.CreateDefaultService();
service.LocalStoragePath = Application.StartupPath + "\\default";
service.CookiesFile = Application.StartupPath + "\\default\\Cookies";
IWebDriver driver = new PhantomJSDriver(service);
Run Code Online (Sandbox Code Playgroud)

我的做法有什么问题?

尝试2(在C#中):

根据@SiKing的回答和评论讨论,我改为下面的代码(使用AddArgument),但目录仍为空:

string localStoragePath = Path.Combine(Path.GetTempPath(),"PhantomLocalStorage-");

if (!Directory.Exists(localStoragePath))
{
    Directory.CreateDirectory(localStoragePath);
}

PhantomJSDriverService service = PhantomJSDriverService.CreateDefaultService();
service.AddArgument("--local-storage-quota=5000");
service.AddArgument("--local-storage-path=" + localStoragePath);
IWebDriver driver = new PhantomJSDriver(service);
Run Code Online (Sandbox Code Playgroud)

试试3(在java中):

目录仍为空:

DesiredCapabilities capabilities = DesiredCapabilities.phantomjs();
List<String> cliArgs = new ArrayList<String>();
Path local_storage_path = Paths.get(System.getProperty("java.io.tmpdir") + "PhantomLocalStorage-");
if (Files.notExists(local_storage_path)) {
    try {
        Files.createDirectory(local_storage_path);
    }
    catch (IOException e) {
        JOptionPane.showConfirmDialog(null, "Can Not Create Path");
    }
}
cliArgs.add("--local-storage-quota=5000");
cliArgs.add("--local-storage-path=" + local_storage_path.toString());
capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, cliArgs);
WebDriver driver = new PhantomJSDriver(capabilities);
Run Code Online (Sandbox Code Playgroud)

SiK*_*ing 4

PhantomJS 默认情况下启动时没有本地存储;请参阅此讨论

为了通过 Selenium 启用本地存储,我使用了以下 Java 代码。抱歉,我已经很久没有使用 C# 了,但我相信 C# 绑定有类似的方法可用。

DesiredCapabilities capabilities = DesiredCapabilities.phantomjs();
// Phantom options can only be set from CLI
List<String> cliArgs = new ArrayList<String>();
cliArgs.add("--local-storage-quota=5000");
Path local_storage_path = Files.createTempDirectory("PhantomLocalStorage-");
cliArgs.add("--local-storage-path=" + local_storage_path.toString());
capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, cliArgs);
WebDriver driver = new PhantomJSDriver(capabilities);
Run Code Online (Sandbox Code Playgroud)

请注意,local_storage_path完成后不会被删除。如果您需要的话,您可以按照这篇文章设置一个钩子。但我怀疑 C# 中的这部分与 Java 会有很大不同。