2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 09:24 
Заслуженный участник
Аватара пользователя


20/08/14
6305
Нужно написать программу, которая заходит на сайт - да вот хоть на этот: http://phys.org, копирует все заголовки (только заголовки) и сохраняет ведущие на них ссылки.

Мой бэкграунд. Единственный язык, который я знаю - это C# (когда-то чуть-чуть знал паскаль и фортран, но эти годы давно прошли, да и писать нужно будет не на них явно). Несколько лет писал программы, довольно большие. Двадцать тысяч строк - не предел. Так что весь этот объектно-ориентированный зверинец - классы, наследование, полиморфизм и т.д. - я знаю и понимаю.

Беда в том, что про интернет и веб-технологии я не знаю ничего вообще. Предел моей компетентости - умение набивать в командной строке ping и tracert. Никогда не требовалось знать больше, а вот теперь потребовалось. Так что, возможно, мне стоит для начала подучить матчасть, но на это я готов только в ограниченном объеме - на шестисотстраничные фолианты времени нет. Или, может, достаточно найти в C# какой-нибудь стандартный класс и почитать к нему документацию? Если там будет написано "метод устанавливает связь с сайтом по введенному URL", "метод ищет заголовки", "метод сохраняет ссылки", то написать нужный код не составит труда. А вот если нельзя обойтись без всяких неведомых для меня терминов - что ж, придется их узнать. Тогда подскажите хорошую книжку.

В общем, посоветуйте что-нибудь.

 Профиль  
                  
 
 Re: Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 10:10 


15/11/15
561
А куда сохранять нужно ссылки? На компьютер пользователя? Если так, то достаточно простенького консольного приложения на java. Подключаете библиотеку jsoup, а она уже:
Anton_Peplov в сообщении #1241500 писал(а):
"метод устанавливает связь с сайтом по введенному URL", "метод ищет заголовки", "метод сохраняет ссылки",

Код займёт 5-10 строчек :) ещё может есть версия jsoup под си шарп.

 Профиль  
                  
 
 Re: Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 10:14 
Аватара пользователя


31/12/13
148
Ищите что-то типа perl parse page links или на питоне.
Вот решение на перле со stackoverflow
Используется синтаксис Perl
my $mech = WWW::Mechanize->new();
$mech->get( $some_url );
my @links = $mech->links();
for my $link ( @links ) {
    printf "%s, %s\n", $link->text, $link->url;
}

 Профиль  
                  
 
 Re: Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 10:21 
Заслуженный участник


04/03/09
862
Во многих языках, сишарпе в том числе, есть библиотеки для парсинга html. Собственно, гуглится по запросу "c sharp html parsing". Сам я C# толком не знаю, так что по конкретным библиотекам плюсы-минусы подсказать не могу. Необходимая матчасть - знание html и умение найти в коде веб-страницы нужные вам заголовки, ссылки и т.п.

 Профиль  
                  
 
 Re: Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 10:42 
Заслуженный участник
Аватара пользователя


20/08/14
6305
gevaraweb в сообщении #1241513 писал(а):
А куда сохранять нужно ссылки? На компьютер пользователя?
Да.

 Профиль  
                  
 
 Re: Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 11:05 
Заслуженный участник


06/07/11
5579
кран.набрать.грамота
Как альтернативу jsoup и аналогам могу предложить Selenium Webdriver. Некоторые вещи он умеет лучше (например, мне не удалось научить jsoup логиниться и хранить куки, а на java форумах на вопрос "как" отвечали "ой, возьмите лучше Selenium").
Еще желательно знать основы XQuery (это язык запросов к данным в формате XML) и/или что такое CSS Selector. Эти штуки обычно поддерживаются библиотеками парсинга HTML и позволяют довольно просто указать местоположение искомой строки.
Еще стоит знать, что HTML в общем случае не является валидным XML. Это тоже поможет сохранить немного нервов.

 Профиль  
                  
 
 Re: Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 11:18 
Заслуженный участник
Аватара пользователя


06/10/08
6297
Anton_Peplov в сообщении #1241500 писал(а):
Нужно написать программу, которая заходит на сайт - да вот хоть на этот: http://phys.org, копирует все заголовки (только заголовки) и сохраняет ведущие на них ссылки.
В данном конкретном случае я бы не стал парсить HTML, у них есть RSS-лента: https://phys.org/rss-feed/
У RSS жесткая структура, оттуда заголовки и ссылки гораздо легче достать, чем подбирать нужный селектор в HTML.
Библиотеки для работы с XML есть везде. Можно еще сделать простое XSLT-преобразование:
Код:
xaositect@hive:~/Temp$ cat tmp.xslt
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='text'/>
<xsl:template match="/rss/channel">
  <xsl:for-each select="item">
    <xsl:value-of select="title"/>
    <xsl:text>&#xD;&#xA;</xsl:text>
    <xsl:text>&#x9;</xsl:text>
    <xsl:value-of select="link"/>
    <xsl:text>&#xD;&#xA;</xsl:text>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

xaositect@hive:~/Temp$ curl https://phys.org/rss-feed/ | xsltproc tmp.xslt -
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 23795    0 23795    0     0      5      0 --:--:--  1:11:35 --:--:-- 41382

Facts about the US solar eclipse on August 21
        https://phys.org/news/2017-08-facts-solar-eclipse-august.html
In Lebanon, salt producers fear craft is drying up
        https://phys.org/news/2017-08-lebanon-salt-craft.html
Of demons and dragons - the history of solar eclipses
        https://phys.org/news/2017-08-demons-dragons-history-solar.html
First eclipse in 99 years to sweep North America
        https://phys.org/news/2017-08-eclipse-years-north-america.html
<skip>

 Профиль  
                  
 
 Re: Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 17:04 
Заслуженный участник


09/08/09
3438
С.Петербург
Anton_Peplov,
если Вам ближе c#, то подход, предложенный Xaositect, может быть реализован примерно так:
код: [ скачать ] [ спрятать ]
Используется синтаксис C#
  1. using System.IO;
  2. using System.Xml;
  3. using System.Xml.Xsl;
  4.  
  5. namespace ParseRss
  6. {
  7.     class Program
  8.     {
  9.         const string xsl = @"
  10.            <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
  11.            <xsl:output method='text' />
  12.            <xsl:template match='/rss/channel' >
  13.               <xsl:for-each select='item' >
  14.                  <xsl:value-of select='title' />
  15.                  <xsl:text>&#xD;&#xA;</xsl:text>
  16.                <xsl:text>&#x9;</xsl:text>
  17.                <xsl:value-of select='link'/>
  18.                <xsl:text>&#xD;&#xA;</xsl:text>
  19.              </xsl:for-each>
  20.            </xsl:template>
  21.            </xsl:stylesheet>
  22.        ";
  23.         static void Main(string[] args)
  24.         {
  25.             XslCompiledTransform xct = new XslCompiledTransform();
  26.             xct.Load(XmlReader.Create(new StringReader(xsl)));
  27.             xct.Transform(@"https://phys.org/rss-feed/", @"c:\Temp\result1.txt");
  28.         }
  29.     }
  30. }
  31.  

Если же RSS-канала нет, придется парсить HTML вручную. Понять структуру HTML можно просмотрев код страницы в браузере.

Для загрузки документа по протоколу HTTP обычно используется метод WebClient.DownloadString.

В результате загрузки мы получаем HTML-строку размером ~200Kb, которую теперь надо каким-то образом распарсить на предмет добывания ссылок и их описаний. Парсить HTML можно какой-нибудь библиотекой (как уже упоминалось выше), а можно - вручную с использованием регулярных выражений.

В частности, в случае https://phys.org/ "хорошие" ссылки выглядят примерно так:
Код:
<a href="https://phys.org/news/2017-08-collagen-cartilage-tissues-liquid-crystals.html">Collagen in cartilage tissues behaves like liquid crystals in a smart phone screen</a>
Т.е. URL содержит подстроку '/news/', и содержимое тега <a> не содержит вложенных тегов.

код: [ скачать ] [ спрятать ]
Используется синтаксис C#
  1. using System;
  2. using System.Net;
  3. using System.Text.RegularExpressions;
  4.  
  5. namespace ParsePhysOrg
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             string html = new WebClient().DownloadString("https://phys.org/");
  12.             string re = @"<a\s+href=""([^"">]+/news/[^"">]+)""\s*>\s*([^<]+)\s*</a>";
  13.             MatchCollection matches = Regex.Matches(html, re);
  14.             foreach (Match match in matches) {
  15.                 Console.WriteLine($"{match.Groups[1]}: {match.Groups[2]}");
  16.             }
  17.         }
  18.     }
  19. }


Код:
Women may bear the brunt of climate change's impacts
        https://phys.org/news/2017-08-women-brunt-climate-impacts.html
Researchers find monkey brain structure that decides if viewed objects are new or unidentified
        https://medicalxpress.com/news/2017-08-monkey-brain-viewed-unidentified.html
Bio-inspired materials give boost to regenerative medicine
        https://medicalxpress.com/news/2017-08-bio-inspired-materials-boost-regenerative-medicine.html
Evidence found of white dwarf remnant after supernova
        https://phys.org/news/2017-08-evidence-white-dwarf-remnant-supernova.html
Industrial "edge cities" have helped China grow
        https://phys.org/news/2017-08-industrial-edge-cities-china.html
Scientists improve brown dwarf weather forecasts
        https://phys.org/news/2017-08-scientists-brown-dwarf-weather.html
Histone 1, the guardian of genome stability
        https://phys.org/news/2017-08-histone-guardian-genome-stability.html
...

(Отказ от ответственности)

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

 Профиль  
                  
 
 Re: Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 19:46 


03/10/06
794
Maslov в сообщении #1241602 писал(а):
В частности, в случае https://phys.org/ "хорошие" ссылки выглядят примерно так: Код:

<a href="https://phys.org/news/2017-08-collagen-cartilage-tissues-liquid-crystals.html">Collagen in cartilage tissues behaves like liquid crystals in a smart phone screen</a>
Т.е. URL содержит подстроку '/news/', и содержимое тега <a> не содержит вложенных тегов.

Важно, что окамляют эти ссылки тэги к примеру <h3>...</h3>. h и некая цифра как раз и говорят, что это заголовки (headers).

 Профиль  
                  
 
 Re: Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 20:13 
Заслуженный участник


16/02/13
3613
Владивосток
yk2ru в сообщении #1241656 писал(а):
Важно
В данном случае как раз не важно: не окаймляют.

 Профиль  
                  
 
 Re: Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 21:05 
Заслуженный участник
Аватара пользователя


16/07/14
3855
Москва
Консоль есть? Если да, то в качестве костыля можно сделать
Используется синтаксис Bash
curl https://phys.org/ | sed -n 's@^ *<h3><a href="\([^"]*\)">\(.*\)</a></h3>@\1\t\2@p'

(ну либо поправить регулярку, если нужен другой шаблон)

(Литература по теме)

Изображение

 Профиль  
                  
 
 Re: Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 21:32 
Заслуженный участник


16/02/13
3613
Владивосток
iifat в сообщении #1241667 писал(а):
не окаймляют
Виноват. Не заметил. Окаймляют.

 Профиль  
                  
 
 Re: Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 21:57 
Заслуженный участник
Аватара пользователя


20/08/14
6305
Спасибо!

 Профиль  
                  
 
 Re: Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 22:12 


03/10/06
794
Добавлю кода на delphi, так как приходилось парсить html, в конкретном случае находились таблицы.
Код:
    pn := SearchBuf(pn, (pr-pn), 1, 8, '<table', [soDown]);
    if(pn=nil)then exit;
    pk := SearchBuf(pn, (pr-pn), 1, 8, '</table>', [soDown]);
    if(pk=nil)then exit; inc(pk, 8);

pn - указатель на начало буфера, pr - на конец, тип PAnsiChar. Получаем pn - указатель на начало таблицы, pk - на конец. Table заменить на h3 и зациклить, exit на break заменить. 1 и 8 - это условно на какой позиции находится последнее найденное слово и какой оно длины, то есть поиск реально начинается с 9 символа в указанном случае.

 Профиль  
                  
 
 Re: Программа для простейшей работы с сайтами: что нужно знать?
Сообщение18.08.2017, 22:24 
Заслуженный участник
Аватара пользователя


27/04/09
27145
Для C# ещё есть Fizzler + HTMLAgilityPack, я уже не помню точно, что каждый компонент делает, но упомянутые rockclimber селекторы они позволяют использовать, и это действительно упрощает дело при извлечении чего-то из HTML (пользовался один раз, но могу при желании переоткрыть старый код и рассказать).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Модераторы: Toucan, maxal, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group