Как я могу перебирать результаты поиска на сайте и собирать метаданные? - PullRequest
1 голос
/ 04 июля 2019

У меня есть задание, которое требует от меня перебора результатов поиска на веб-сайте, представляющих собой ссылки на журналы, для сбора ссылки на каждый журнал и других метаданных (авторов, даты и т. Д.) И их вывода в a. TXT-файл, использующий по крайней мере Java и Apache HTTPClient, но без веб-сканеров Вот сайт: https://www.cochranelibrary.com/cdsr/reviews/topics. Я должен выбрать любую из показанных категорий и собрать вышеупомянутые данные для каждой из ссылок журнала в этой категории.

Ниже приведен фрагмент кода, который я нашел в Интернете для сбора сущности HTTP и тела ответа через Apache HTTPClient. Программа, с которой я сталкиваюсь, использует простой URL-адрес, такой как google.com, работает нормально и отображает исходный код страницы для последующего анализа. Тем не менее, страница, которую мне нужно использовать, полна волшебства JavaScript и не сотрудничает. Каждая страница результатов поиска заканчивается конечной точкой "/ search". С помощью инструментов веб-разработчика моего браузера мне удалось найти прямую ссылку на
текущую страницу результатов я просматриваю:

https://www.cochranelibrary.com/en/search?p_p_id=scolarissearchresultsportlet_WAR_scolarissearchresults&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_count=1&_scolarissearchresultsportlet_WAR_scolarissearchresults_displayText=Allergy+%26+intolerance&_scolarissearchresultsportlet_WAR_scolarissearchresults_searchText=Allergy+%26+intolerance&_scolarissearchresultsportlet_WAR_scolarissearchresults_searchType=basic&_scolarissearchresultsportlet_WAR_scolarissearchresults_facetQueryField=topic_id&_scolarissearchresultsportlet_WAR_scolarissearchresults_searchBy=13&_scolarissearchresultsportlet_WAR_scolarissearchresults_facetDisplayName=Allergy+%26+intolerance&_scolarissearchresultsportlet_WAR_scolarissearchresults_facetQueryTerm=z1506030924307755598196034641807&_scolarissearchresultsportlet_WAR_scolarissearchresults_facetCategory=Topics

Однако, при попытке использовать это возвращает ошибку 419, которая, по-видимому, является некоторой проблемой несанкционированного доступа / токена. Так что на данный момент это моя основная проблема, я просто не могу «импортировать» результаты поиска по категориям, чтобы даже попытаться выполнить итерацию для сбора необходимых данных.

public static void main(String[] args) throws IOException
{
  String url = "http://www.google.com";
  CloseableHttpClient httpclient = HttpClients.createDefault();

  try
  {
    HttpGet httpget = new HttpGet(url);
    httpget.addHeader("User-Agent",USER_AGENT);

    System.out.println("Executing request " + httpget.getRequestLine());

    ResponseHandler<String> responseHandler = new ResponseHandler<String>()
    {
      public String handleResponse(final HttpResponse response) throws IOException
      {
        int status = response.getStatusLine().getStatusCode();
        if (status >= 200 && status < 300)
        {
          HttpEntity entity = response.getEntity();
          return entity != null ? EntityUtils.toString(entity) : null;
        }
        else
        { throw new ClientProtocolException("Unexpected response status: " + status); }
      }
    };

    String responseBody = httpclient.execute(httpget, responseHandler);
    System.out.println("----------------------------------------");
    System.out.println(responseBody);

  }
  finally
  { httpclient.close(); }
}

UPDATE Поэтому я немного консолидировал код после просмотра документов Apache HTTPClient, чтобы было проще работать и тестировать:

public class App
{
    public static void main(String[] args) throws URISyntaxException
    {
      // Builds the URI
      URI uri = new URIBuilder()
          .setScheme("https")
          .setHost("www.cochranelibrary.com")
          .setPath("/")
          .build();

      // Uses Fluent API to execute GET request with uri
      try
      { System.out.println(Request.Get(uri).execute().returnContent().asString()); }
      catch (IOException e)
      { e.printStackTrace(); }
    }
}

Однако этот конкретный домен продолжает вызывать у меня проблемы. Просто попытка получить с www.cochranelibrary.com возвращает ошибку 419. Я подумал, что это может быть что-то с протоколом HTTPS, но тестирование на https://www.httpvshttps.com возвращает отлично. Я заблудился относительно того, почему этот конкретный домен упрямый.

...