RSS
 

Подсчёт слов в RSS канале с использованием Питон

22 Июл

Питон и модуль feedparser

Вследствие того, что последнее время достаточно быстро растёт число блогов в сети.То соответственно растёт  распространение  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 канал . Это конечно поможет развитию спам блогов в сети. Но я верю, что есть люди в сети которые просто любят считать слова. И это для них самое приятное занятие. Не плодите спам блоги )

Google Bookmarks Reddit Technorati Yahoo My Web БобрДобр.ru Memori.ru МоёМесто.ru
 

Прокомментировать

 
 
  1. Ферзеску

    29.11.2011 - 12:35

    А что за переменная ‘feedlist’? Компилятор выдаёт на неё ошибку, говоря, что она не описана

     
 
Система Orphus

Enter your email address:

Delivered by FeedBurner

.