2014 dxdy logo

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

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




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


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

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

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

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

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


15/11/15
1100
А куда сохранять нужно ссылки? На компьютер пользователя? Если так, то достаточно простенького консольного приложения на 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
917
Во многих языках, сишарпе в том числе, есть библиотеки для парсинга html. Собственно, гуглится по запросу "c sharp html parsing". Сам я C# толком не знаю, так что по конкретным библиотекам плюсы-минусы подсказать не могу. Необходимая матчасть - знание html и умение найти в коде веб-страницы нужные вам заголовки, ссылки и т.п.

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


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

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


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

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


06/10/08
6422
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
826
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
4214
Владивосток
yk2ru в сообщении #1241656 писал(а):
Важно
В данном случае как раз не важно: не окаймляют.

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


16/07/14
9416
Цюрих
Консоль есть? Если да, то в качестве костыля можно сделать
Используется синтаксис 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
4214
Владивосток
iifat в сообщении #1241667 писал(а):
не окаймляют
Виноват. Не заметил. Окаймляют.

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


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

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


03/10/06
826
Добавлю кода на 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
28128
Для C# ещё есть Fizzler + HTMLAgilityPack, я уже не помню точно, что каждый компонент делает, но упомянутые rockclimber селекторы они позволяют использовать, и это действительно упрощает дело при извлечении чего-то из HTML (пользовался один раз, но могу при желании переоткрыть старый код и рассказать).

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

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



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

Сейчас этот форум просматривают: granit201z


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

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