Паук (spider) – это программа, "ползающая" по Интернету определенным образом и с определенной целью. Цель может состоять в сборе информации или в понимании структуры какого-либо Web-сайта и его полезности. На применении пауков основаны современные поисковые машины, такие как Google и AltaVista. Такие пауки автоматически извлекают данные из Web-сайта и передают их другим приложениям, которые индексируют контент этого Web-сайта с целью формирования наилучшего набора поисковых терминов.
"Web-скребок" (Web scraper) – это агент, который действует аналогично Web-паукам, но более интересен с юридической точки зрения. Scraper – это разновидность паука, которая нацелена на работу с определенным Интернет-контентом, например, с данными о стоимости продуктов или услуг. Один из вариантов применения scraper-агентов – т.н. конкурентное ценообразование, т. е. выявление существующих на рынке цен на определенную категорию товаров с целью установления соответствующих цен на собственную продукцию. Кроме того, scraper способен объединять данные из нескольких источников в Интернете и предоставлять эту итоговую информацию пользователю.
Настоящий паук в реальной обстановке существует не изолированно, а во взаимодействии с окружающей средой. Такой паук видит и ощущает обстановку вокруг себя и перемещается из одного пункта в другой в соответствии с определенной целью. Web-пауки действуют аналогичным образом. Web-паук – это программа, написанная на каком-либо языке высокого уровня. Такая программа взаимодействует с окружающей средой посредством сетевых протоколов, например, Интернет-протокола HTTP. Если ваш паук захочет связаться с вами, он может послать сообщение по электронной почте с помощью протокола SMTP.
Однако возможности Web-пауков не ограничиваются протоколом HTTP или SMTP. Некоторые пауки способны использовать технологии Web-сервисов, например, SOAP, или протокол XML-RPC. Другие пауки просматривают сетевые телеконференции с помощью протокола NNTP или ищут интересную информацию в новостных RSS-потоках. В отличие от реальных пауков, большинство из которых способны различать только изменения интенсивности света и фиксировать только движущиеся объекты, Web-пауки "видят" и "ощущают" с помощью протоколов нескольких типов.
Области применения spider- и scraper-агентов
Web spider и Web scraper – это весьма полезные приложения. Различные типы таких приложений применяются достаточно широко, причем, как с добрым, так и со злым умыслом. Рассмотрим некоторые области их применения.
Web-пауки упрощают поиск в Интернете и повышают его эффективность. Поисковая машина использует множество Web-пауков ("краулеров" - crawlers), которые ползают по Web-страницам в Интернете, извлекают из этих страниц контент и индексируют его. После выполнения этого этапа работы поисковая машина сможет быстро просмотреть локальный индекс на предмет выявления наиболее подходящих результатов для заданного вами поиска. Поисковая машина Google дополнительно использует алгоритм PageRank, который ранжирует результаты поиска по количеству связей других страниц с каждой найденной страницей. Таким образом, реализуется механизм голосования, при котором страницы с максимальным числом голосов получают самый высокий рейтинг в результатах поиска.
Подобный поиск в Интернете может оказаться весьма дорогостоящим, как с точки зрения пропускной способности, необходимой для передачи Web-контента индексатору, так и с точки зрения вычислительных затрат на индексирование результатов. Кроме того, для данного способа требуется большой объем ресурсов хранения, хотя сегодня это уже не является большой проблемой – например, Google предлагает 1000 МБ хранения каждому пользователю почтовой службы Gmail.
Web-пауки минимизируют порождаемую ими нагрузку на Интернет с помощью набора политик. Чтобы представить масштабы проблемы, необходимо учесть, что Google индексирует более 8 млрд. Web-страниц. Политики поведения определяют, какие страницы Web-краулер должен вводить в индексатор и как часто Web-краулер должен возвращаться на какой-либо Web-сайт для повторной проверки, а также т.н. "политику вежливости". Web-серверы могут запрещать работу краулеров с помощью стандартного файла robot.txt, который сообщает краулерам о том, что можно, а что нельзя просматривать на данном сервере.
Как и стандартный паук поисковой машины, корпоративный 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
Временно оставим агенты типа scraper и перейдем к рассмотрению принципов построения 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.
Получить продукты и технологии
- На странице Source Code for Web
Robot Spiders Web-сайта Searchtools.com предоставлен исходный код для создания роботов с открытым кодом, предназначенных для решения различных задач (на нескольких языках).
- По ссылке Order the SEK for Linux можно заказать набор из двух DVD-дисков, содержащий пробные версии новейших программных продуктов IBM для Linux из семейств DB2®, Lotus®, Rational®, Tivoli® и WebSphere®.
- Используйте в своем следующем проекте разработки для Linux ознакомительные версии программного обеспечения IBM, которые можно скачать непосредственно с сайта developerWorks.
Обсудить
- Примите участие в обсуждении материала на форуме.
- Посетите блоги developerWorks и примите участие в сообществе developerWorks.
M. Тим Джонс (M. Tim Jones) является архитектором встраиваимого программного обеспечения и автором работ: Программирование Приложений под GNU/Linux, Программирование AI-приложений и Использование BSD-сокетов в различных языках программирования. Он имеет опыт разработки процессоров для геостационарных космических летательных аппаратов, а также разработки архитектуры встраиваемых систем и сетевых протоколов. Сейчас Тим работает инженером-консультантом в корпорации Эмулекс (Emulex Corp.) в г.Лонгмонт, Колорадо.