Создание "Web-пауков" в Linux

Простые программные агенты типа spider и scraper для сбора Интернет-контента

Web-паук (Web spider) – это программный агент, который обходит Интернет с целью сбора, фильтрации и, возможно, агрегирования информации для потенциальных пользователей. Используя распространенные языки подготовки сценариев и встроенные в них наборы Web-модулей, вы сможете легко создавать Web-пауков различного назначения. В этой статье показано, как в среде Linux® создаются агенты типа spider и scraper, позволяющие просмотреть какой-либо Web-сайт и собрать нужную информацию (в данном случае – данные о курсовой стоимости акций)

M. Тим Джонс, инженер-консультант, Emulex

M. Тим Джонс (M. Tim Jones) является архитектором встраиваимого программного обеспечения и автором работ: Программирование Приложений под GNU/Linux, Программирование AI-приложений и Использование BSD-сокетов в различных языках программирования. Он имеет опыт разработки процессоров для геостационарных космических летательных аппаратов, а также разработки архитектуры встраиваемых систем и сетевых протоколов. Сейчас Тим работает инженером-консультантом в корпорации Эмулекс (Emulex Corp.) в г.Лонгмонт, Колорадо.



25.01.2007

Паук (spider) – это программа, "ползающая" по Интернету определенным образом и с определенной целью. Цель может состоять в сборе информации или в понимании структуры какого-либо Web-сайта и его полезности. На применении пауков основаны современные поисковые машины, такие как Google и AltaVista. Такие пауки автоматически извлекают данные из Web-сайта и передают их другим приложениям, которые индексируют контент этого Web-сайта с целью формирования наилучшего набора поисковых терминов.

Web-паук (Web-spider) как программный агент

Web spider или Web scraper – это разновидности программных роботов или агентов (в терминологии, предложенной Аланом Кеем (Alan Kay) в начале 1980-х годов). По замыслу А. Кея, программный агент должен действовать в качестве посредника (proxy) между пользователем и компьютерным миром. Такой агент может иметь определенную цель и работать над достижением этой цели в отведенной ему области. Если агент "спотыкается", он может запросить рекомендацию от пользователя, после чего продолжить выполнение возложенной на него задачи.

Современные программные агенты классифицируются по таким атрибутам, как автономность, адаптивность, коммуникативность и способность к совместной работе с другими агентами. В настоящее время предметом исследований в области агентов являются такие направления, такие как мобильность и даже индивидуальность агента. Рассматриваемые в данной статье пауки (Web spider) относятся к категории агентов, предназначенных для выполнения конкретной задачи (Task-Specific Agent).

"Web-скребок" (Web scraper) – это агент, который действует аналогично Web-паукам, но более интересен с юридической точки зрения. Scraper – это разновидность паука, которая нацелена на работу с определенным Интернет-контентом, например, с данными о стоимости продуктов или услуг. Один из вариантов применения scraper-агентов – т.н. конкурентное ценообразование, т. е. выявление существующих на рынке цен на определенную категорию товаров с целью установления соответствующих цен на собственную продукцию. Кроме того, scraper способен объединять данные из нескольких источников в Интернете и предоставлять эту итоговую информацию пользователю.

Биологические аналогии

Настоящий паук в реальной обстановке существует не изолированно, а во взаимодействии с окружающей средой. Такой паук видит и ощущает обстановку вокруг себя и перемещается из одного пункта в другой в соответствии с определенной целью. Web-пауки действуют аналогичным образом. Web-паук – это программа, написанная на каком-либо языке высокого уровня. Такая программа взаимодействует с окружающей средой посредством сетевых протоколов, например, Интернет-протокола HTTP. Если ваш паук захочет связаться с вами, он может послать сообщение по электронной почте с помощью протокола SMTP.

Однако возможности Web-пауков не ограничиваются протоколом HTTP или SMTP. Некоторые пауки способны использовать технологии Web-сервисов, например, SOAP, или протокол XML-RPC. Другие пауки просматривают сетевые телеконференции с помощью протокола NNTP или ищут интересную информацию в новостных RSS-потоках. В отличие от реальных пауков, большинство из которых способны различать только изменения интенсивности света и фиксировать только движущиеся объекты, Web-пауки "видят" и "ощущают" с помощью протоколов нескольких типов.


Области применения spider- и scraper-агентов

Глаза и ноги паука

Основными органами зрения и перемещения Web-паука в Интернете является HTTP – ориентированный на сообщения протокол, с помощью которого клиент подключается к серверу и посылает запросы. В ответ на эти запросы сервер генерирует отклик. Каждый запрос или отклик состоит из заголовка и тела. Заголовок содержит информацию о состоянии и описание содержимого тела.

Протокол HTTP поддерживает запросы трех основных типов. Запрос типа HEAD запрашивает информацию об активах определенного сервера. Запрос типа GET запрашивает сам актив, например, файл или изображение. Запрос типа POST разрешает клиенту взаимодействовать с сервером через Web-страницу (обычно через Web-форму).

Web spider и Web scraper – это весьма полезные приложения. Различные типы таких приложений применяются достаточно широко, причем, как с добрым, так и со злым умыслом. Рассмотрим некоторые области их применения.

Web-краулеры поисковой машины

Web-пауки упрощают поиск в Интернете и повышают его эффективность. Поисковая машина использует множество Web-пауков ("краулеров" - crawlers), которые ползают по Web-страницам в Интернете, извлекают из этих страниц контент и индексируют его. После выполнения этого этапа работы поисковая машина сможет быстро просмотреть локальный индекс на предмет выявления наиболее подходящих результатов для заданного вами поиска. Поисковая машина Google дополнительно использует алгоритм PageRank, который ранжирует результаты поиска по количеству связей других страниц с каждой найденной страницей. Таким образом, реализуется механизм голосования, при котором страницы с максимальным числом голосов получают самый высокий рейтинг в результатах поиска.

Подобный поиск в Интернете может оказаться весьма дорогостоящим, как с точки зрения пропускной способности, необходимой для передачи Web-контента индексатору, так и с точки зрения вычислительных затрат на индексирование результатов. Кроме того, для данного способа требуется большой объем ресурсов хранения, хотя сегодня это уже не является большой проблемой – например, Google предлагает 1000 МБ хранения каждому пользователю почтовой службы Gmail.

Web-пауки минимизируют порождаемую ими нагрузку на Интернет с помощью набора политик. Чтобы представить масштабы проблемы, необходимо учесть, что Google индексирует более 8 млрд. Web-страниц. Политики поведения определяют, какие страницы Web-краулер должен вводить в индексатор и как часто Web-краулер должен возвращаться на какой-либо Web-сайт для повторной проверки, а также т.н. "политику вежливости". Web-серверы могут запрещать работу краулеров с помощью стандартного файла robot.txt, который сообщает краулерам о том, что можно, а что нельзя просматривать на данном сервере.

Корпоративные Web-краулеры

Как и стандартный паук поисковой машины, корпоративный Web-паук индексирует контекст, недоступный обычным посетителям. Например, компании обычно поддерживают внутренние Web-сайты для своих сотрудников. В этом случае область действия паука ограничена локальной средой. Ограничение области поиска обычно повышает запас доступной вычислительной мощности, что позволяет создавать специализированные и более полные индексы. Компания Google сделала еще один шаг в этом направлении, предоставив поисковую машину для индексации контента пользователя персонального компьютера.

Специализированные Web-краулеры

Существует также ряд нетрадиционных вариантов применения краулеров, например, при архивировании контента или генерации статистической информации. Архивный краулер просматривает Web-сайт и выявляет локальный контент, подлежащий долговременному хранению. Такой краулер может быть использован для резервного копирования или, в более общем случае, для получения моментальных снимков определенного контента в Интернете. Статистический краулер может оказаться полезным для понимания определенного Интернет-контента или для выявления отсутствия такого контента. Краулеры способны определять, сколько Web-серверов функционирует в данный момент, сколько Web-серверов определенного типа функционирует в данный момент и даже количество недействующих ссылок (т.е. ссылок, возвращающих ошибку HTTP 404 – страница не найдена).

Еще одним полезным типом специализированных краулеров являются краулеры для проверки Web-сайтов. Краулеры этого типа ищут отсутствующий контент, проверяют все ссылки и гарантируют корректность HTML-кода.

Web-краулеры для анализа электронной почты

Теперь обратимся к отрицательным аспектам. К сожалению, всего несколько паршивых овец могут существенно осложнить пользование Интернетом множеству добропорядочных пользователей. Web-краулеры для анализа электронной почты ищут на Web-сайтах электронные адреса, которые затем используются для рассылки огромных количеств спама, с которым мы сталкиваемся ежедневно. Так, служба Postini сообщила, что по состоянию на август 2005 г. 70% электронных писем, просмотренных ее пользователями, оказались нежелательным спамом.

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

Теперь, когда вы получили основные сведения о spider- и scraper-агентах, перейдем к примерам, которые демонстрируют, насколько легко создать такие агенты для Linux с помощью современных языков сценариев Ruby и Python.


Пример 1. Простой агент типа scraper

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

На Листинге 1 показан сценарий на языке Ruby, в котором Web-сайт анализируется с целью выявления типа используемого HTTP-сервера. Класс Net::HTTP реализует HTTP-клиента и HTTP-методы GET, HEAD и POST. Каждый раз, когда вы обращаетесь с запросом к HTTP-серверу, один из фрагментов ответного HTTP-сообщения всегда содержит информацию о типе сервера, на котором хранится данный контент. Вместо того чтобы загружать страницу с данного сайта, я ограничился использованием метода HEAD для получения информации о корневой странице ('/'). Если HTTP-сервер успешно отвечает (что демонстрируется кодом ответа "200"), осуществляется итеративное прохождение по каждой строке ответа в поисках ключа server и в случае его нахождения печатается соответствующее значение. Значением этого ключа является строка, представляющая тип HTTP-сервера.

Листинг 1. Сценарий на языке Ruby для простого анализа метаданных (srvinfo.rb)
#!/usr/local/bin/ruby
require 'net/http'

# Get the first argument from the command-line (the URL)
url = ARGV[0]

begin

  # Create a new HTTP connection
  httpCon = Net::HTTP.new( url, 80 )

  # Perform a HEAD request
  resp, data = httpCon.head( "/", nil )

  # If it succeeded (200 is success)
  if resp.code == "200" then

    # Iterate through the response hash
    resp.each {|key,val|

      # If the key is the server, print the value
      if key == "server" then

        print "  The server at "+url+" is "+val+"\n"

      end

    }

  end

end

На Листинге 2 показан порядок использования сценария srvinfo и приведены некоторые результаты его взаимодействия с рядом государственных, образовательных и коммерческих Web-сайтов. Результаты не отличаются большим разнообразием – в 68% случаев применяется Web-сервер Apache, в остальных случаях – Web-серверы Sun и Microsoft® Internet Information Services (IIS). В одном из случаев Web-сайт не сообщил о типе используемого Web-сервера. Интересно отметить, что Федеративное государство Микронезия использует старую версию Web-сервера Apache (которую давно пора обновить), в то время как сама организация Apache.org – самую новую версию.

Листинг 2. Пример использования агента для определения типа Web-сервера
[mtj@camus]$ ./srvrinfo.rb www.whitehouse.gov
  The server at www.whitehouse.gov is Apache
[mtj@camus]$ ./srvrinfo.rb www.cisco.com
  The server at www.cisco.com is Apache/2.0 (Unix)
[mtj@camus]$ ./srvrinfo.rb www.gov.ru
  The server at www.gov.ru is Apache/1.3.29 (Unix)
[mtj@camus]$ ./srvrinfo.rb www.gov.cn
[mtj@camus]$ ./srvrinfo.rb www.kantei.go.jp
  The server at www.kantei.go.jp is Apache
[mtj@camus]$ ./srvrinfo.rb www.pmo.gov.to
  The server at www.pmo.gov.to is Apache/2.0.46 (Red Hat Linux)
[mtj@camus]$ ./srvrinfo.rb www.mozambique.mz
  The server at www.mozambique.mz is Apache/1.3.27 
   (Unix) PHP/3.0.18 PHP/4.2.3
[mtj@camus]$ ./srvrinfo.rb www.cisco.com
  The server at www.cisco.com is Apache/1.0 (Unix)
[mtj@camus]$ ./srvrinfo.rb www.mit.edu
  The server at www.mit.edu is MIT Web Server Apache/1.3.26 Mark/1.5 
	(Unix) mod_ssl/2.8.9 OpenSSL/0.9.7c
[mtj@camus]$ ./srvrinfo.rb www.stanford.edu
  The server at www.stanford.edu is Apache/2.0.54 (Debian GNU/Linux) 
	mod_fastcgi/2.4.2 mod_ssl/2.0.54 OpenSSL/0.9.7e WebAuth/3.2.8
[mtj@camus]$ ./srvrinfo.rb www.fsmgov.org
  The server at www.fsmgov.org is Apache/1.3.27 (Unix) PHP/4.3.1
[mtj@camus]$ ./srvrinfo.rb www.csuchico.edu
  The server at www.csuchico.edu is Sun-ONE-Web-Server/6.1
[mtj@camus]$ ./srvrinfo.rb www.sun.com
  The server at www.sun.com is Sun Java System Web Server 6.1
[mtj@camus]$ ./srvrinfo.rb www.microsoft.com
  The server at www.microsoft.com is Microsoft-IIS/6.0
[mtj@camus]$ ./srvrinfo.rb www.apache.org
The server at www.apache.org is Apache/2.2.3 (Unix) 
	mod_ssl/2.2.3 OpenSSL/0.9.7g

Это полезные данные, позволяющие увидеть, какие типы Web-серверов применяются в государственных и образовательных организациях. В следующем примере показан более полезный агент для нахождения биржевых котировок.


Пример 2. Агент типа scraper для нахождения биржевых котировок

В этом примере я написал простой агент типа Web scraper (другое название – screen scraper) для сбора информации о котировках акций. Применен метод "грубой силы", основанный на применении шаблона к ответной Web-странице:

Листинг 3. Простой Web-агент для нахождения биржевых котировок
#!/usr/local/bin/ruby
require 'net/http'

host = "www.smartmoney.com"
link = "/eqsnaps/index.cfm?story=snapshot&symbol="+ARGV[0]

begin

  # Create a new HTTP connection
  httpCon = Net::HTTP.new( host, 80 )

  # Perform a HEAD request
  resp = httpCon.get( link, nil )

  stroffset = resp.body =~ /class="price">/

  subset = resp.body.slice(stroffset+14, 10)

  limit = subset.index('<')

  print ARGV[0] + " current stock price " + subset[0..limit-1] +
          " (from stockmoney.com)\n"

end

В этом Ruby-сценарии открывается соединение HTTP-клиента с сервером (в данном случае с сервером www.smartmoney.com) и устанавливается канал, запрашивающий котировку акций в том виде, в котором она была задана пользователем (посредством &symbol=<symbol>). Я запрашивают этот канал с помощью HTTP-метода GET (для извлечения полной страницы отклика) и затем задаю поиск class="price">>, за которым сразу же следует текущая цена акции. Эта информация извлекается из Web-страницы и затем отображается пользователю.

Как показано в Листинге 4, для использования агента биржевых котировок я просто вызвал сценарий с интересующим меня стандартным символом ценной бумаги.

Листинг 4. Пример использования Web-агента для нахождения биржевых котировок
[mtj@camus]$ ./stockprice.rb ibm
ibm current stock price 79.28 (from stockmoney.com)
[mtj@camus]$ ./stockprice.rb intl
intl current stock price 21.69 (from stockmoney.com)
[mtj@camus]$ ./stockprice.rb nt
nt current stock price 2.07 (from stockmoney.com)
[mtj@camus]$

Пример 3. Общение пользователя с агентом для нахождения биржевых котировок

Показанный в Примере 2 scraper-агент для нахождения биржевых котировок выглядит весьма привлекательно, однако действительную пользу он принесет в том случае, если сможет осуществлять регулярный мониторинг курса акций и сообщать пользователю, если цена интересующих его акций поднялись выше определенного порога или опустилась ниже другого порога. Сейчас мы увидим, как это делается. В показанном на Листинге 5 сценарии я доработал простой Web scraper – теперь он осуществляет регулярный мониторинг курса акций и отсылает сообщение по электронной почте, если курс акций вышел за пределы установленного коридора цен.

Листинг 5. Web-агент для нахождения биржевых котировок с возможностью отсылки извещений по электронной почте
#!/usr/local/bin/ruby
require 'net/http'
require 'net/smtp'

#
# Given a web-site and link, return the stock price
#
def getStockQuote(host, link)

    # Create a new HTTP connection
    httpCon = Net::HTTP.new( host, 80 )

    # Perform a HEAD request
    resp = httpCon.get( link, nil )

    stroffset = resp.body =~ /class="price">/

    subset = resp.body.slice(stroffset+14, 10)

    limit = subset.index('<')

    return subset[0..limit-1].to_f

end


#
# Send a message (msg) to a user.
# Note: assumes the SMTP server is on the same host.
#
def sendStockAlert( user, msg )

    lmsg = [ "Subject: Stock Alert\n", "\n", msg ]
    Net::SMTP.start('localhost') do |smtp|
      smtp.sendmail( lmsg, "rubystockmonitor@localhost.localdomain", [user] )
    end

end


#
# Our main program, checks the stock within the price band every two
# minutes, emails and exits if the stock price strays from the band.
#
# Usage: ./monitor_sp.rb <symbol> <high> <low> <email_address>
#
begin

  host = "www.smartmoney.com"
  link = "/eqsnaps/index.cfm?story=snapshot&symbol="+ARGV[0]
  user = ARGV[3]

  high = ARGV[1].to_f
  low = ARGV[2].to_f

  while 1

    price = getStockQuote(host, link)

    print "current price ", price, "\n"

    if (price > high) || (price < low) then

      if (price > high) then
        msg = "Stock "+ARGV[0]+" has exceeded the price of "+high.to_s+
               "\n"+host+link+"\n"
      end

      if (price < low) then
        msg = "Stock "+ARGV[0]+" has fallen below the price of "+low.to_s+
               "\n"+host+link+"\n"

      end

      sendStockAlert( user, msg )

      exit

    end

    sleep 120

  end

end

Этот сценарий на языке Ruby несколько длиннее, но представляет собой развитие предыдущего сценария Web-агента для нахождения биржевых котировок, показанного наЛистинге 3. В сценарии использована новая функция getStockQuote, которая инкапсулирует функцию анализа биржевых котировок. Другая функция – sendStockAlert – посылает сообщение по указанному пользователем адресу электронной почты. Основная программа представляет собой цикл, в котором осуществляется получение текущей цены акций, проверка этой цены на попадание в заданный ценовой коридор, и – в случае выхода за пределы коридора – отсылка пользователю извещения по электронной почте. Я также ввел задержку между операциями проверки цены, поскольку являюсь вежливым человеком и не хочу перегружать опрашиваемый сервер.

На Листинге 6 в качестве примера показан вызов монитора акций популярной технологической компании. Каждые две минуты осуществляется проверка цены акций и вывод результатов на печать. Если цена акции вышла за верхний предел, агент посылает извещение по электронной почте, и сценарий завершается.

Листинг 6. Демонстрация работы монитора акций
[mtj@camus]$ ./monitor_sp.rb ibm 83.00 75.00 mtj@mtjones.com
current price 82.06
current price 82.32
current price 82.75
current price 83.36

На Рис. 1. показано предупреждающее письмо со ссылкой на источник данных.

Рис. 1. Извещение, которое послал по электронной почте Ruby-сценарий из Листинга 5
Рис. 1. Извещение, которое послал по электронной почте Ruby-сценарий из Листинга 5

Временно оставим агенты типа scraper и перейдем к рассмотрению принципов построения Web-пауков.


Пример 4. Краулер Web-сайта

В завершающем примере я исследую возможности Web-паука, перемещающегося по Web-сайту. По соображениям безопасности я избегаю блужданий за пределами этого Web-сайта, а вместо этого просто анализирую одну Web-страницу.

Для обхода Web-сайта и отслеживания содержащихся на нем ссылок необходимо осуществлять структурный анализ HTML-страниц. Структурный анализ Web-страницы позволяет выявить ссылки на другие ресурсы. Некоторые из этих ссылок указывают на локальные ресурсы (файлы), а другие – на внешние ресурсы (например, на другие Web-страницы).

Обход Web-сайта начинается с заданной Web-страницы. Выявленные на этой странице ссылки ставятся в очередь на посещение, после чего этот процесс повторяется, начиная с первого объекта из очереди на посещение. Это так называемый поиск типа "сначала вширь" (в отличие от поиска "в глубину", при котором производится последовательное углубление по первой обнаруженной ссылке).

Если избегать нелокальных ссылок и углубляться только по локальным Web-страницам, получится Web-краулер для одного Web-сайта, показанный на Листинге 7. В данном случае я перешел с языка Ruby на язык Python, что позволило применить полезный класс HTMLParser (анализатор HTML-кода).

Листинг 7. Простой краулер Web-сайтов на языке Python (minispider.py)
#!/usr/local/bin/python

import httplib
import sys
import re
from HTMLParser import HTMLParser


class miniHTMLParser( HTMLParser ):

  viewedQueue = []
  instQueue = []

  def get_next_link( self ):
    if self.instQueue == []:
      return ''
    else:
      return self.instQueue.pop(0)


  def gethtmlfile( self, site, page ):
    try:
      httpconn = httplib.HTTPConnection(site)
      httpconn.request("GET", page)
      resp = httpconn.getresponse()
      resppage = resp.read()
    except:
      resppage = ""

    return resppage


  def handle_starttag( self, tag, attrs ):
    if tag == 'a':
      newstr = str(attrs[0][1])
      if re.search('http', newstr) == None:
        if re.search('mailto', newstr) == None:
          if re.search('htm', newstr) != None:
            if (newstr in self.viewedQueue) == False:
              print "  adding", newstr
              self.instQueue.append( newstr )
              self.viewedQueue.append( newstr )
          else:
            print "  ignoring", newstr
        else:
          print "  ignoring", newstr
      else:
        print "  ignoring", newstr


def main():

  if sys.argv[1] == '':
    print "usage is ./minispider.py site link"
    sys.exit(2)

  mySpider = miniHTMLParser()

  link = sys.argv[2]

  while link != '':

    print "\nChecking link ", link

    # Get the file from the site and link
    retfile = mySpider.gethtmlfile( sys.argv[1], link )

    # Feed the file into the HTML parser
    mySpider.feed(retfile)

    # Search the retfile here

    # Get the next link in level traversal order
    link = mySpider.get_next_link()

  mySpider.close()

  print "\ndone\n"

if __name__ == "__main__":
  main()

Базовая схема этого краулера основана в загрузке первой ссылки в очередь для проверки. В этой очереди находятся кандидаты на дальнейшее обследование. Все новые ссылки, выявленные в ходе проверки какой-либо ссылки, загружается в эту же очередь. Таким образом, реализуется механизм поиска "сначала вширь". Я также поддерживаю очередь уже просмотренных ссылок и избегаю углубления по любой ссылке, увиденной ранее. Это практически все, основная часть реальной работы осуществляется анализатором HTML-кода.

Сначала на основе класса HTMLParser языка Python я создал новый класс miniHTMLParser. Этот класс решает несколько задач. Во-первых, это мой HTML-анализатор, который применяет метод обратного вызова (handle_starttag) при каждой встрече с начальным HTML-тегом. Я также использовал этот класс для доступа к ссылкам, встреченным в процессе обхода (get_next_link), и для извлечения файла, представленного соответствующей ссылкой (в данном случае, HTML-файла).

В этом классе присутствуют две переменные экземпляра – viewedQueue (содержит ссылки, которые уже обследованы к текущему моменту) и instQueue (которая представляет еще не обследованные ссылки).

Вы видите, что методы этого класса весьма просты. Метод get_next_link проверяет, является ли очередь instQueue пустой, и в этом случае возвращает символ ''. В противном случае с помощью метода pop осуществляется возвращение следующего объекта. Метод gethtmlfile с помощью HTTPConnectionK подключается к Web-сайту возвращает контент заданной страницы. И, наконец, для каждого начального тега Web-страницы вызывается handle_starttag (начальный тег посылается в HTML-анализатор с помощью метода feed). В этой функции я проверяю, является ли ссылка нелокальной (содержит http), является ли ссылка почтовым адресом (содержит mailto) и содержит ли ссылка 'htm', что с высокой степенью вероятности указывает на то, что это Web-страница. Я также убеждаюсь в том, что не посещал эту ссылку ранее, и если нет, эта ссылка загружается в мои очереди – в очередь кандидатов на дальнейшее обследование и в очередь просмотренных ссылок.

Метод main является достаточно простым. Я создаю новый экземпляр класса miniHTMLParser и начинаю обход с Web-сайта (argv[1]) и ссылки (argv[2]), задаваемых пользователем. Я фиксирую содержимое этой ссылки, отсылаю его в HTML-анализатор и захватываю следующую ссылку для посещения, если таковая существует. Этот цикл повторяется до тех пор, пока остаются непосещенные ссылки.

Для вызова Web-паука пользователю необходимо предоставить адрес Web-сайта и ссылку:

./minispider.py www.fsf.org /

В данном случае я запросил корневой файл с Web-сайта организации Free Software Foundation. Результаты выполнения этой команды представлены на Листинге 8. Вы видите новые ссылки, добавленные в очередь кандидатов на дальнейшее обследование, и проигнорированные ссылки, такие как ссылки на нелокальные ресурсы. В нижней части листинга производится обследование ссылок, выявленных в корневом файле.

Листинг 8. Выходная информация сценария minispider
[mtj@camus]$ ./minispider.py www.fsf.org /

Checking link  /
  ignoring hiddenStructure
  ignoring http://www.fsf.org
  ignoring http://www.fsf.org
  ignoring http://www.fsf.org/news
  ignoring http://www.fsf.org/events
  ignoring http://www.fsf.org/campaigns
  ignoring http://www.fsf.org/resources
  ignoring http://www.fsf.org/donate
  ignoring http://www.fsf.org/associate
  ignoring http://www.fsf.org/licensing
  ignoring http://www.fsf.org/blogs
  ignoring http://www.fsf.org/about
  ignoring https://www.fsf.org/login_form
  ignoring http://www.fsf.org/join_form
  ignoring http://www.fsf.org/news/fs-award-2005.html
  ignoring http://www.fsf.org/news/fsfsysadmin.html
  ignoring http://www.fsf.org/news/digital-communities.html
  ignoring http://www.fsf.org/news/patents-defeated.html
  ignoring /news/RSS
  ignoring http://www.fsf.org/news
  ignoring http://www.fsf.org/blogs/rms/entry-20050802.html
  ignoring http://www.fsf.org/blogs/rms/entry-20050712.html
  ignoring http://www.fsf.org/blogs/rms/entry-20050601.html
  ignoring http://www.fsf.org/blogs/rms/entry-20050526.html
  ignoring http://www.fsf.org/blogs/rms/entry-20050513.html
  ignoring http://www.fsf.org/index_html/SimpleBlogFullSearch
  ignoring documentContent
  ignoring http://www.fsf.org/index_html/sendto_form
  ignoring javascript:this.print();
  adding licensing/essays/free-sw.html
  ignoring /licensing/essays
  ignoring http://www.gnu.org/philosophy
  ignoring http://www.freesoftwaremagazine.com
  ignoring donate
  ignoring join_form
  adding associate/index_html
  ignoring http://order.fsf.org
  adding donate/patron/index_html
  adding campaigns/priority.html
  ignoring http://r300.sf.net/
  ignoring http://developer.classpath.org/mediation/OpenOffice2GCJ4
  ignoring http://gcc.gnu.org/java/index.html
  ignoring http://www.gnu.org/software/classpath/
  ignoring http://gplflash.sourceforge.net/
  ignoring campaigns
  adding campaigns/broadcast-flag.html
  ignoring http://www.gnu.org
  ignoring /fsf/licensing
  ignoring http://directory.fsf.org
  ignoring http://savannah.gnu.org
  ignoring mailto:webmaster@fsf.org
  ignoring http://www.fsf.org/Members/root
  ignoring http://www.plonesolutions.com
  ignoring http://www.enfoldtechnology.com
  ignoring http://blacktar.com
  ignoring http://plone.org
  ignoring http://www.section508.gov
  ignoring http://www.w3.org/WAI/WCAG1AA-Conformance
  ignoring http://validator.w3.org/check/referer
  ignoring http://jigsaw.w3.org/css-validator/check/referer
  ignoring http://plone.org/browsersupport

Checking link  licensing/essays/free-sw.html
  ignoring mailto:webmaster

Checking link  associate/index_html
  ignoring mailto:webmaster

Checking link  donate/patron/index_html
  ignoring mailto:webmaster

Checking link  campaigns/priority.html
  ignoring mailto:webmaster

Checking link  campaigns/broadcast-flag.html
  ignoring mailto:webmaster

done

[mtj@camus]$

В этом примере показана работа Web-паука в качестве краулера. После того, как клиент прочитает файл, можно просканировать соответствующую страницу в поисках нужного контента, как и в случае индексатора.


Linux-инструменты для построения Web-пауков

Мы показали примеры создания scraper- и spider-агентов. Эту же функциональность можно реализовать и с помощью Linux-инструментов.

Полезная команда wget (Web get) позволяет организовать рекурсивную работу с Web-сайтом и сбор интересующего вас контента. Вы можете указать определенный Web-сайт, интересующий вас контент и некоторые другие административные опции. Эта команда перекачивает нужные файлы на ваш локальный компьютер. Например, команда следующего вида подключит вас к заданному URL-адресу и рекурсивно опустится не более чем на три уровня, собирая по пути все файлы с расширениями mp3, mpg, mpeg и avi.

wget -A mp3,mpg,mpeg,avi -r -l 3 http://<some URL>

Команда curl действует аналогичным образом. Ее преимущество состоит в том, что в настоящее время она активно дорабатывается. Вы можете использовать и другие подобные команды – snarf, fget и fetch.


Юридические аспекты

По поводу применения Web-пауков для анализа информации в Интернете было подано несколько судебных исков, и все они были приняты к рассмотрению. Недавно компания Farechase, Inc. отвечала в суде по иску компании American Airlines относительно применения scraper-агентов, работающих в реальном времени. Первоначально в этом иске утверждалось, что сбор данных нарушил соглашения компании American Airlines со своими клиентами (входящие в состав документа Положения и условия). После того, как эта претензия была отвергнута, компания American Airlines подала иск о причинении вреда, который был удовлетворен. В других исках утверждалось, что пропускная способность, потребляемая spider- и scraper-агентами, ухудшает условия работы остальных пользователей. Все подобные претензии являются вполне обоснованными, что обуславливает необходимость соблюдения норм вежливости. Дополнительная информация по этому вопросу приведена в разделе Ресурсы.


Что дальше

Применение Web-пауков для информационного анализа Интернета может оказаться весьма увлекательным – а для некоторых и весьма доходным – занятием. Однако, как указывалось выше, этот вид деятельности имеет определенные юридические аспекты. Применяя Web-пауков, всегда подчиняйтесь указаниям файла robots.txt, находящегося на анализируемом Web-сервере, и включайте это требование в свою политику вежливости. Более современные технологии, такие как SOAP, существенно упрощают работу Web-пауков и уменьшают их отрицательное влияние на обычные Интернет-операции. Перспективные разработки, такие как семантические сети, сделают работу пауков еще проще, поэтому количество соответствующих решений и методов будет непрерывно увеличиваться.

Ресурсы

Научиться

  • Оригинал статьи Build a Web spider on Linux
  • Страница Web crawler энциклопедии Wikipedia является отличным ресурсом по Web-краулерам, включая историю их развития и политики применения Web-краулеров.
  • По ссылке Email Spiders предлагается интересная информация о пауках для анализа электронной почты (e-mail spider) и о способах борьбы с ними.
  • Web Robots Pages - один из старейших Web-сайтов по Web-роботам, на котором представлена важная информация по протоколу исполнения роботов (для реализации политики вежливости).
  • "Scrapers, Robots and Spiders: The Battle Over Internet Data Mining" (Gesmer Updegrove LLP, 2006) – интересный обзор по юридическим и этическим аспектам применения Web-пауков различных типов, включающий обсуждение судебного спора между компаниями American Airlines и Farechase, Inc.
  • В зоне Linux сайта developerWorks можно найти дополнительные ресурсы для Linux-разработчиков.
  • Следите за последними новостями на портале Web-трансляций и технических мероприятий developerWorks.

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


  • Bluemix

    Узнайте больше информации о платформе IBM Bluemix, создавайте приложения, используя готовые решения!

  • Библиотека документов

    Более трех тысяч статей, обзоров, руководств и других полезных материалов.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=192197
ArticleTitle=Создание "Web-пауков" в Linux
publish-date=01252007