В этом посте я продолжу освещать написание простого паука. Ну естественно подходим к самому интересному моменту – а именно индексации собственными руками. Ниже я расскажу как получить список проиндексированных страниц с выбранного ресурса…
Перед тем как остановиться на написание самого кода паука, хотелось бы остановиться на простом скрипте. Этот скрипт сильно сэкономит время во время отладки и написания кода основного паука.
import searchengine import sys pagelist=[] pagelist.append(str(sys.argv[1])) spider1=searchengine.spider('') spider1.spider(pagelist)
Этот скрипт в дальнейшкм можно дополнять, но на данный момент он делает следующее.
Первая строчка позволяет импортировать основной файл паука.
Остановимся на следующих строчках:
pagelist.append(str(sys.argv[1]))
Они будут содержать начальные адреса страниц, с которых начнётся процесс индексации.
Воспользоваться этим скриптом достаточно просто. Назовём его scriptname.
chmod u+x scriptname ./scriptname "http://lifeisfine.ru"
Результатом работы скрипта будет печать проиндексированных страниц.
Ну а теперь перейдём к написанию непосредственно скрипта.
Простой паук будет индексировать файлы из интернета.
import urllib2 import BeautifulSoup from BeautifulSoup import * from urlparse import urljoin ignorewords=set(['the','of','to','and','a','in','is','it'])
Верхние строчки позволяют импортировать необходимые библиотеки. Но следует отметить, что библиотеку BeautifulSoup необходимо предварительно установить. Я решил посвятить следующий пост непосредственно установке. В случае операцинной системы Линукс UBUNTU
sudo apt-get install python-beautifulsoup
Ниже необходимо добавить следующий код
для функции класса spider:
class spider: def __init__(self,dbname): pass def __del__(self): pass def dbcommit(self): pass def addtoindex(self,url,soup): print "Indexing %s" % url def spider(self,pages,depth=2): for i in range(depth): newpages=set() for page in pages: try: c=urllib2.urlopen(page) except: print "It is impossible to open" % page continue #Основная нагрузка лежит на этой функции soup=BeautifulSoup(c.read()) self.addtoindex(page,soup) links=soup('a') # print links for link in links: if ('href' in dict(link.attrs)): url=urljoin(page,link['href']) if url.find("'")!=-1: continue url=url.split('#')[0] if url[0:4]=='http' : newpages.add(url) pages=newpages
Следующий код просто будет печатать названия страниц, которые будут поочерёдно обходиться. Непосредственно следующий участок кода простого паука отвечает за печать названия этих страниц.
def addtoindex(self,url,soup): print "Indexing %s" % url
Основная нагрузка лежит на следующей строчке:
soup=BeautifulSoup(c.read())
Эта часть кода позволяет задать класса, и в дальнейшем пользоваться встроенными функциями в этот класс.
Эта часть простого паука имеет ряд недостатков .
Но в целом на данный момент эта часть позволяет ползать по страницам, печатая ссылки. Так , что дальше будут описаны функции добавления основных параметров в базу данных.
Через ряд постов получим полуполноценную поисковую машину в полустепени. Этот простой паук будет ползать по интернету и решать наши локальные задачи.