Как собрать информацию с другого сайта? - PullRequest
1 голос
/ 21 мая 2019

Моя идея заключается в создании веб-сайта, на котором пользователи будут находить информацию с разных сайтов, на которые они зарегистрированы. Эта информация будет скопирована в нашу базу данных с этих сайтов, когда они предоставят учетные данные для входа. Вся идея в том, чтобы облегчить им доступ к тому, что они хотят, в одном месте / месте, и это будет наш сайт.

Вероятно, лучшим способом для чего-то подобного было бы использование платформы Selen или какого-либо подобного инструмента веб-автоматизации, но, поскольку у меня нет опыта программирования, я открыт для всех предложений и советов.

Как вы думаете, возможно ли это сделать и можно ли это сделать через веб-приложение (с нашего собственного сервера), или пользователям все равно нужно будет установить какое-то настольное приложение? Единственная причина, по которой я могу подумать о том, чтобы выполнить очистку с рабочего стола, заключается в том, что некоторые сайты могут блокировать его, если большая часть трафика поступает с одного IP-адреса.

1 Ответ

0 голосов
/ 21 мая 2019

Определенно, есть пара способов, чтобы описать то, что вы описали, поэтому я рассмотрю два из них, которые, как мне кажется, лучше всего подойдут для вашего сценария


Селен

Итак, вы упомянули выше селен, который, безусловно, является хорошей, надежной средой веб-автоматизации, однако, чтобы использовать ее для нескольких сайтов, у вас может возникнуть небольшая проблема, связанная с необходимостью добавления определенного метода с разными локаторами для каждого отдельного сайта для вход в систему, навигация и разбор сайта для получения информации.

например. Для одного сайта ваш код селена может быть

public void LoginSiteA(){
FirefoxDriver fd = new FirefoxDriver();
fd.get(SiteUrlA);
WebElement Username = fd.findElement(By.Id("Unique-ID-1"));
WebElement Password = fd.findElement(By.ID("Unique-ID-2"));
//Set Text on WebElements and submit
}

И это будет работать довольно хорошо, к сожалению, локаторы «Unique-Id» для идентификации каждого элемента могут (и, скорее всего, будут) различаться для разных веб-сайтов, и вам потребуется отдельный набор локаторов для каждого веб-сайта, который вы хотите поддержка, которая бы очень быстро запуталась. Что подводит меня ко второму методу


Загрузка исходного HTML-кода

Вторым вариантом очистки страницы может быть загрузка исходного кода HTML непосредственно с сайта, и это будет работать хорошо:

  • Вы можете выполнить аутентификацию через запрос http
  • Это было бы очень общим для нескольких веб-сайтов, так как локаторы не нужны
  • Обычно это происходит быстрее, чем селен, так как не требуется отображать веб-страницу

То, как вы можете делать это на Java, может быть таким:

Итак, прежде всего, если сайт должен войти в систему, вам нужно будет выполнить аутентификацию, я рекомендую проверить этот сайт здесь для ускоренного курса по крайней мере для аутентификации NTLM, однако каждый сайт может отличаться в методах аутентификации, и вам может потребоваться добавить поддержку для каждого протокола аутентификации по мере их появления.

Используя приведенный ниже код, вы можете затем ввести имя пользователя и пароль, а также URL-адрес, и, надеюсь, если все будет работать хорошо, вы можете получить исходный HTML-код сайта и проанализировать его для любых потребностей.

static final String kuser = "username"; // your account name
    static final String kpass = password; // retrieve password for your account 

    static class MyAuthenticator extends Authenticator {
        public PasswordAuthentication getPasswordAuthentication() {
            // I haven't checked getRequestingScheme() here, since for NTLM
            // and Negotiate, the usrname and password are all the same.
            System.err.println("Feeding username and password for " + getRequestingScheme());
            return (new PasswordAuthentication(kuser, kpass.toCharArray()));
        }
    }

    public static void main(String[] args) throws Exception {
        Authenticator.setDefault(new MyAuthenticator());
        URL url = new URL(args[0]);
        InputStream ins = url.openConnection().getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
        String str;
        while((str = reader.readLine()) != null)
            System.out.println(str);
    }

Что касается опасений, связанных с большим объемом трафика, поступающего из одного источника, вы можете связаться с сайтами, на которые вы будете заходить, с вашей службой, чтобы узнать, 1) согласны ли они с этим и 2) потенциально могут внести в белый список ваш IP-адрес службы для увеличения пропускной способности, поскольку вы сказали, что служба может работать на компьютерах ваших клиентов, однако это может вызвать дополнительные трудности.

Если есть что-то еще, с чем я могу помочь, пожалуйста, дайте мне знать:)

-Джеймс

...