【发布时间】:2017-03-14 23:59:22
【问题描述】:
我想编写尽可能可重用的网络爬虫。我会把它写在 Selenium + PhantomJS 上。 PhantomJS 将使用一个 IP 池(代理)。有大量免费代理,for example。
我如何在运行时为特定 URL 选择最佳代理?“最好”是指不会被目标资源阻塞的最快代理。
解决方法
我在 Heroku 上部署了我最简单的应用程序。该应用程序提供一些 html 内容。我使用了不同的代理(响应时间 151.252.120.177:8080(参见下面的代码),并注意到它们中的大多数无法在 15 秒超时内解析最简单的 html。其中一些(甚至更慢)在一秒钟内检索到内容。 为什么有些代理无法访问我的内容?他们被 Heroku 列入黑名单了吗?
DesiredCapabilities caps = new DesiredCapabilities();
caps.setJavascriptEnabled(true);
caps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, "drivers/phantomjs");
ArrayList<String> cliArgsCap = new ArrayList<String>();
cliArgsCap.add("--proxy=151.252.120.177:8080");
cliArgsCap.add("--proxy-type=socks");
caps.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, cliArgsCap);
WebDriver driver = new PhantomJSDriver(caps);
driver.get(REMOTE_URL);
WebDriverWait wait = new WebDriverWait(driver, 15);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.className("btn-success")));
element.click();
driver.quit();
【问题讨论】:
-
是的,他们很有可能被列入黑名单。关于选择最好的,我想说您可以自己存储每个代理/域的等待时间,然后根据您自己的数据选择最有益的。我真的没有看到其他方式。
-
也许选择地理上更接近的那个?但是当然,如果该代理被禁止,那将毫无用处。另一种选择是使用一些付费系统,例如
crawlera或proxymesh
标签: java heroku proxy web-scraping phantomjs