Вследствие того, что последнее время достаточно быстро растёт число блогов в сети.То соответственно растёт распространение RSS каналов. А это в свою очередь порождает необходимость, или вернее сказать возможность, анализа этой информации. RSS -канал – простой XML документ, содержащий самую важную информацию конкретной записи, или в ряде случаев всю запись целком.
Но перед тем как ставить вопрос о дальнейшем использовании этих каналов попробуем просто подсчитать число слов в этом канале. А затем запишем в файл . Это позволит производить нам дальше подбор блогов наиболее интересных для анализа и обработки по соответствующим запросам. Для некоторых просто к воровству контента . Но компьютер – это машина, а как использовать его решаем мы сами. Так , что приступаем к делу. Работать, как вы поняли из заглавия статьи мы будем на питоне…
В начале необходимо скачать библиотеку Universal Feed Parser.
Эта библиотека обеспечит нас возможностью получить заголовок, ссылки и записи из любого канало в формате RSS либо Atom .
Дальше следует перейти к написанию функции, которая должна обеспечить нас возможностью выборки отдельных слов.
С этой целью нам потребуется создать скрипт на питоне. Назовём его например wordsreader.py.
import feedparser import re FEEDLIST="feedlist.txt" NAMEOFFILESWITHWORDS="data.txt" #нижняя и верхнии границы частоты стречаемости слова. #Регулирование может привести к наибольшей плотности #слов , соотв вашей тематике lowLimit=0.1 upperLimit=0.5 # Возвращает число слов def getwordcounts(url): # Парсим ленту d=feedparser.parse(url) wc={} # Цикл по всем вхождениям for e in d.entries: if 'summary' in e: summary=e.summary else: summary=e.description # Извлечь список слов words=getwords(e.title+' '+summary) for word in words: wc.setdefault(word,0) wc[word]+=1 return d.feed.title,wc
В каналах RSS и Atom всегда имеется различные теги
Шаблон фильтрации будем писать для <...> такого рода образований. Так, что в черновом варианте учтём заодно слова из ссылок. Но это конечно в случае англоязычных блогов.
Вообщем необходимо добавить ещё следующую функцию
getwords
. Она получает информацию от функции
getwordcounts
. На выходе и получим список слов.
def getwords(html): # Удалить все HTML теги txt=re.compile(r'<[^>]+>').sub('',html) # Выделяем слова , ограниченные небуквенными символами words=re.compile(r'[^A-Z^a-z]+').split(txt) # Перевести в нижний регистр, на случай #если не хотим учитывать слова по два раза # Ну например некоторые слова стоят в начале предложения return [word.lower() for word in words if word!=''] ######################################### ###END OF THE FIRST PART getwords function######### #########################################
Следует поговорить о регулярном выражении следующего вида.
re.compile(r'[^A-Z^a-z]+')
Объясню почему. Конечно не состовляет труда понять, что здесь написано .
[^symbols] -означает поиск соответсвия с выражением , не содержащим символы из подмножества symbols. Сразу остановлюсь на важности этой части. Т.е .если нас интересуют только слова то, значи надо составить подмножества из букв .
A-Za-z – Это подмножеством латинских букв.
Но вот в случае кириллицы следует указывать
[^йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ] совокупность букв.
Просто иногда в питоне не получается сделать так [^А-Я^a-я]. Если есть возможность седлать так, как описано в предыдущем выражении – оставьте комментарии.
Теперь необходимо получить список этих каналов с которыми и будем работать. Они будут расположены в текстовом файле feedlist.txt.
######################################## ###BEG OF THE SECOND PART getwords function####### ######################################### apcount={} wordcounts={} feedlist=[line for line in file(FEEDLIST)] for feedurl in feedlist: try: title,wc=getwordcounts(feedurl) wordcounts[title]=wc for word,count in wc.items(): apcount.setdefault(word,0) if count>1: apcount[word]+=1 except: print 'Failed to parse feed %s' % feedurl ######################################### ###END OF THE FIRST PART getwords function######### #########################################
Ну соответсвенно теперь нам надо выделить слова в зависимости от плотности их вхождений и записать их в файл , заданный в переменной NAMEOFFILESWITHWORDS в самом начале.
######################################### ###BEG OF THE 3D PART getwords function########### ######################################### wordlist=[] for w,bc in apcount.items(): frac=float(bc)/len(feedlist) if frac>lowLimit and frac<upperLimit: wordlist.append(w) out=file(NAMEOFFILESWITHWORDS,'w') out.write('Blog') for word in wordlist: out.write('\t%s' % word) out.write('\n') for blog,wc in wordcounts.items(): print blog out.write(blog) for word in wordlist: if word in wc: out.write('\t%d' % wc[word]) else: out.write('\t0') out.write('\n')
В результате мы получим файл NAMEOFFILESWITHWORDS со словами, частота употребления которых заключена в пределах от lowLimit до upperLimit. И уже имея это файл можно Выявлять какой спектр каналов будет наиболее интересен. .
Для работы этого скрипта конечно придётся его импортировать. А если доработать то можно получить более функциональный скрипт, параметры которого-
FEEDLIST=»feedlist.txt»
NAMEOFFILESWITHWORDS=»data.txt»
lowLimit=0.1
upperLimit=0.5
-задаются из коммандной строки. Т.е. заменить соответствующие переменные на sys.argv[] .
Вот и получили новую статью. Питон очень многофункциональный инструмент . Для автоматизации SEO деятельности , как кажется мне, подходит лучше всего.А теперь вопрос- зачем нам считать слова для SEO деятельности? Ответ прост. Если немного доработать скрипт , вы сможете из списка интересующих вас каналов подобрать наиболее подходящий RSS канал . Это конечно поможет развитию спам блогов в сети. Но я верю, что есть люди в сети которые просто любят считать слова. И это для них самое приятное занятие. Не плодите спам блоги )
Ферзеску
29.11.2011 - 12:35
А что за переменная ‘feedlist’? Компилятор выдаёт на неё ошибку, говоря, что она не описана
[Translate]