java-fetch-http/

Продолжаем разбираться в тонкостях использования очень занятного и широко используемого языка программирования Java, который, как мы выяснили, хочешь не хочешь, а знать приходится . Сегодня я намерен попробовать решить с его помощью типичную задачу «скачать страничку из интернета и выдрать данные из нее регулярными выражениями». Если вы посмотрите мои доисторические посты с меткой «Perl» , то обнаружите, что возникают такие задачи сплошь и рядом.

JDK включает в себя классы, позволяющие ходить в интернеты по HTTP , и вроде как они даже способны на такие нетривиальные вещи, как смену User-Agent . Но в настоящих, больших, Java-приложениях все же не рекомендуется их использовать ну хотя бы в силу малой гибкости. Поэтому в рамках данной конкретной заметки мы воспользуемся HTTP-клиентом для Java от компании Apache . Кроме того, нам понадобится несколько дополнительных пакетов того же производителя:

<dependencies >
<dependency >
<groupId > org.apache.httpcomponents </groupId >
<artifactId > httpclient </artifactId >
<version > 4.3.3 </version >
</dependency >
<dependency >
<groupId > org.apache.commons </groupId >
<artifactId > commons-io </artifactId >
<version > 1.3.2 </version >
</dependency >
<dependency >
<groupId > org.apache.commons </groupId >
<artifactId > commons-lang3 </artifactId >
<version > 3.3.2 </version >
</dependency >
</dependencies >

Поскольку новую интересную задачку я придумать не смог, попробуем тупо переписать программу, получающую список наиболее популярных постов за месяц в блоге, который вы сейчас читаете. Ранее такая программа была написана мной на Scala . Я до сих пор использую ее для генерации кода виджета, который вы можете наблюдать в меню сайта. Заодно сравним код на Java с аналогичным кодом на Scala.

Код основного метода:

private static void process ( String domainStr,
String dateStr,
String numberStr ) throws IOException {
String s = getUrl ( «http://www.liveinternet.ru/stat/» + domainStr +
«/pages.html?date=» + dateStr +
«&period=month&total=yes&per_page=100» ) ;
ArrayList < Pair < String , Integer > > pages =
parseLiveinternatStat ( domainStr, s ) ;
int maxNumber = Integer . parseInt ( numberStr ) ;
int currentNumber = 0 ;
System . out . println ( «<ul>» ) ;
for ( Pair < String , Integer > p : pages ) {
String url = p. getLeft ( ) ;
int views = p. getRight ( ) ;
String title = getPageTitle ( url ) ;
String end = ending ( views ) ;
System . out . printf ( «<li><a href= » %s «» >%s</a> %d просмотр%s «» +
«»за месяц</a></li> n «» urltitleviews

EnglishRussianUkrainian