Поиск по блогу

вторник, 22 апреля 2014 г.

Пробую использовать "patterns" для импорта RSS в мои конспекты

Здесь пробуем, как patterns парсит delicious. Вариант скрипта работает, но "на коленке". Пока надо осмыслить, что можно (и нужно ли) делать с разовой загрузкой RSS в пост.
По крайней мере, теперь можно собирать ссылки с разных компьютеров, а потом вставлять подборки ссылок в посты.
По плану мне надо было бы попрактиковаться с PDB iPDB. Но организм ищет предлоги, чтобы не садится за компьютер..., а если уж сел, то смотреть видео..., а не кодировать...
Устал? Наверное... Последние недели я пытался "решить" (точнее освоить) инфраструктурные задачи. Мне пришлось "отвлечься" на установку Kali Persistence, книжку про Git..., дебаггинг и дебаггеры...
И все шло своим чередом, но предыдущую неделю все пришлось делать при нехватке кислорода (грипп, забитый нос, хрипящие бронхи...). Вчера я целый день занимался тем, что публиковал посты, которые накопились за две недели на двух компьютерах. Получилось около 20 "гриппозных постов" - достаточно отрывистых и неполных...
Я понимаю, что здесь я только учусь... и пишу эти посты для себя... Но и в этом случае желательно собрать все "базовые" материалы по теме в одном-двух постах.
А у меня (последние 10 дней) идет работа с двух компьютеров. И качество "учебных" постов снизилось. Надо срочно принимать новый стандарт оформления поста. Здесь я хочу попробовать возможности Patterns.
Этот пост я написал неделю назад, а потом "забыл про него"..., и вспомнил случайно... не публиковал, поскольку надо было выдать "окончательный" вариант скрипта, а его "не было"... Точнее понимал, что такой скрипт показывать "стыдно", а времени на написание приличного не было... вот он - рефакторинг... как с ним быть?
Ееще один вопрос, как не терять эти мои полуфабрикаты? ... Issues, bugtrackers...? SCRUM... нужна система управления вопросами .... Почему не попробовать мою коллекцию планнеров?

Первоисточники

Установка

In []:
C:\Users\kiss\Anaconda>pip install pattern
Downloading/unpacking pattern
  Running setup.py (path:c:\users\kiss\appdata\local\temp\pip_build_kiss\pattern\setup.py) egg_info for package pattern

    
Installing collected packages: pattern
  Running setup.py install for pattern

Successfully installed pattern
Cleaning up...

C:\Users\kiss\Anaconda>

Разбираем пример из статьи "Web Scraping"

In [1]:
import pattern.web

url = 'http://rss.nytimes.com/services/xml/rss/nyt/World.xml'
results = pattern.web.Newsfeed().search(url, count=5)
results

print '%s \n\n %s \n\n %s \n\n' % (results[0].url, results[0].title, results[0].description)
http://rss.nytimes.com/c/34625/f/642565/s/3955bd36/sc/2/l/0Lsinosphere0Bblogs0Bnytimes0N0C20A140C0A40C140Carrest0Eorder0Efor0Efugitive0Ehong0Ekong0Etycoon0Ereaffirmed0C0Dpartner0Frss0Gemc0Frss/story01.htm 

 Sinosphere Blog: Arrest Order for Fugitive Hong Kong Tycoon Reaffirmed 

 A Hong Kong judge has upheld the arrest warrant for the newspaper tycoon Ma Sik-chun, who fled to Taiwan 36 years ago after being charged with drug trafficking.<img border="0" height="1" src="http://rss.nytimes.com/c/34625/f/642565/s/3955bd36/sc/2/mf.gif" width="1" /><br clear="all" /><br /><br /><a href="http://da.feedsportal.com/r/194480095318/u/0/f/642565/c/34625/s/3955bd36/sc/2/rc/1/rc.htm" rel="nofollow"><img border="0" src="http://da.feedsportal.com/r/194480095318/u/0/f/642565/c/34625/s/3955bd36/sc/2/rc/1/rc.img" /></a><br /><a href="http://da.feedsportal.com/r/194480095318/u/0/f/642565/c/34625/s/3955bd36/sc/2/rc/2/rc.htm" rel="nofollow"><img border="0" src="http://da.feedsportal.com/r/194480095318/u/0/f/642565/c/34625/s/3955bd36/sc/2/rc/2/rc.img" /></a><br /><a href="http://da.feedsportal.com/r/194480095318/u/0/f/642565/c/34625/s/3955bd36/sc/2/rc/3/rc.htm" rel="nofollow"><img border="0" src="http://da.feedsportal.com/r/194480095318/u/0/f/642565/c/34625/s/3955bd36/sc/2/rc/3/rc.img" /></a><br /><br /><a href="http://da.feedsportal.com/r/194480095318/u/0/f/642565/c/34625/s/3955bd36/sc/2/a2.htm"><img border="0" src="http://da.feedsportal.com/r/194480095318/u/0/f/642565/c/34625/s/3955bd36/sc/2/a2.img" /></a><img border="0" height="1" src="http://pi.feedsportal.com/r/194480095318/u/0/f/642565/c/34625/s/3955bd36/sc/2/a2t.img" width="1" /> 



In [6]:
from IPython.display import HTML, Image
In [7]:
HTML(results[0].description)
Out[7]:
A Hong Kong judge has upheld the arrest warrant for the newspaper tycoon Ma Sik-chun, who fled to Taiwan 36 years ago after being charged with drug trafficking.






Такое впечатление, что все работает... просто картинки здесь по 1 пикселу. Они все грузятся на страницу и "портят форматирование абзаца", поэтому мы и видим столько пустого места. Можно код посмотреть, но... Разбираться с ними лень. Лучше попробуем парсить фиды с delicious.
In [19]:
for i in  [0,1,2,3,4]:
   print results[i].title
    
Sinosphere Blog: Arrest Order for Fugitive Hong Kong Tycoon Reaffirmed
Deadline Set by Ukraine to Vacate Occupied Buildings Passes
India Ink: India Election Digest: April 14
Prime Minister of Libya Says He Will Resign
Ron Pundak, a Key Israeli in Oslo Accords, Dies at 59

Пробуем парсить RSS c закладками на Delicious

In [21]:
url_d = 'http://delicious.com/v2/rss/altersego2007/scraping'
results_d = pattern.web.Newsfeed().search(url_d, count=5)
results_d

print '%s \n\n %s \n\n %s \n\n' % (results_d[0].url, results_d[0].title, results_d[0].description)
http://knightlab.northwestern.edu/2014/03/20/five-data-scraping-tools-for-would-be-data-journalists/?utm_content=buffer38dc4&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer 

 Five data scraping tools for would-be data journalists | Knight Lab | Northwestern University 

 Здесь указаны три библиотеки (суп, ...скрапи), но мне понравились два простых плагина к браузерам 



In [22]:
results_d[1]
Out[22]:
Result({u'language': u'', u'author': u'altersego2007', u'url': u'http://www.clips.ua.ac.be/pages/pattern', u'text': u'The module is free, well-document and bundled with 50+ examples and 350+ unit tests.', u'title': u'Pattern | CLiPS', u'date': u'Mon, 17 Mar 2014 11:47:32 +0000', u'id': u'http://delicious.com/url/a29fabd7b702a880ce8d7e505670a2fd#altersego2007'})

Первые ошибки парсинга выскакивают сразу же, но они очень "полезные"

Здесь выскочила ошибка - третья и пятая строки были отдельно от ссылок. Оказалось, что ссылки заканчивались на '/' (как в примере ниже - u'http://www.marketing2oh.com/scrape-serps-for-seo-analysis/') и в строчке получалось '/>', что тег ссылки закрывается раньше, чем начинается текст. Браузер при этом игнорировал "штатный" закрывающий тег ссылки... Вставил target="_blank" в конец строки...
In [45]:
results_d[2]
Out[45]:
Result({u'language': u'', u'author': u'altersego2007', u'url': u'http://www.marketing2oh.com/scrape-serps-for-seo-analysis/', u'text': u'Have you ever wanted to capture search results and import them into Excel (or favorite database) for a quick-and-dirty SEO analysis?', u'title': u'Web Scraping a Search Engine Results Page with the OutWit Hub Data Extractor', u'date': u'Fri, 06 Dec 2013 19:02:04 +0000', u'id': u'http://delicious.com/url/6957570e5f653101b8d8fa91611cdf32#altersego2007'})
Итак, все работает. Пока не удалось использовать возможности форматирования строк Python, но думаю, что в крайнем случае, сделаю так, как здесь
In [86]:
import pattern.web
# We have to determine 'tag1+tag2+tag3' for delicious
# And number of items for parsing from RSS
number=3
tags='scrapy'
url = 'http://delicious.com/v2/rss/altersego2007/' + tags
results = pattern.web.Newsfeed().search(url, count=number)
str=''
for  i in  [0,1,2]:
    str = str + '<br/><a href='+ results[i].url + ' target="_blank">' + 'ref ' + results[i].title + '</a>  ' + results[i].text
HTML(str)
Out[86]:

ref Five data scraping tools for would-be data journalists | Knight Lab | Northwestern University Здесь указаны три библиотеки (суп, ...скрапи), но мне понравились два простых плагина к браузерам
ref scrapinghub/portia · GitHub Portia is a tool for visually scraping web sites without any programming knowledge. Just annotate web pages with a point and click editor to indicate what data you want to extract, and portia will learn how to scrape similar pages from the site.
ref Собираем данные с помощью Scrapy / Хабрахабр Здесь уже проскакивали вскользь упоминания об этом фреймворке для сбора данных. Инструмент действительно мощный и заслуживает большего внимания. В этом обзоре я расскажу, как
In [53]:
%debug
> <ipython-input-52-2d65485be41e>(7)<module>()
      6 for  i in  [0,1,2,3,4]:
----> 7     str = str + '<br/><a href='+ results_d[i].url + ' target="_blank">' + 'ref ' + results_d[i].title + '</a>'
      8 HTML(str)

ipdb> p tags
'scrapy+pyhon'
ipdb> args
ipdb> p str
'<h4>\xd0\xa1\xd0\xbf\xd0\xb8\xd1\x81\xd0\xbe\xd0\xba \xd1\x81\xd1\x81\xd1\x8b\xd0\xbb\xd0\xbe\xd0\xba Delicious c \xd1\x82\xd0\xb5\xd0\xb3\xd0\xbe\xd0\xbcscrapy+pyhon</h4>'
ipdb> q

Итак, идея проверена, в 60 ячейке первая сборка всего вместе. Закоментировал заголовок. нельзя его вставлять в HTML(). Кроме того, надо знать точно, сколько элементов парсится с сайта. Если их меньше 5-ти, то выскакивает ошибка out of range... Словом, все сыро, но работает.
In [64]:
%gui ?
ERROR: Invalid GUI request u'?', valid ones are:['osx', 'qt4', None, 'qt', 'inline', 'gtk', 'tk', 'wx']

In [65]:
%qtconsole
После экспериментов с консолью я немного изменил код. По сути осталась только одна задача looping. Надо читать документацию. ...Не сдержался, почитал, вот как все просто:
In [101]:
str=''
for result in results:
    str = str + '<br/><a href='+ result.url + ' target="_blank">' + 'ref ' + result.title + '</a>  ' + result.text
Придумал переменную "result" и этого оказалось достаточно. Теперь проверим, что у нас получилось:
In [102]:
HTML(str)
Out[102]:

ref Five data scraping tools for would-be data journalists | Knight Lab | Northwestern University Здесь указаны три библиотеки (суп, ...скрапи), но мне понравились два простых плагина к браузерам
ref scrapinghub/portia · GitHub Portia is a tool for visually scraping web sites without any programming knowledge. Just annotate web pages with a point and click editor to indicate what data you want to extract, and portia will learn how to scrape similar pages from the site.
ref Собираем данные с помощью Scrapy / Хабрахабр Здесь уже проскакивали вскользь упоминания об этом фреймворке для сбора данных. Инструмент действительно мощный и заслуживает большего внимания. В этом обзоре я расскажу, как

Вот "последний" вариант (но не окончательный) для копипаста в последующие посты

In []:
from IPython.display import HTML, Image
import pattern.web
# We have to determine 'tag1+tag2+tag3' for delicious
# And number of items for parsing from RSS
number=3
tags='scrapy'
url = 'http://delicious.com/v2/rss/altersego2007/' + tags
results = pattern.web.Newsfeed().search(url, count=number)
str=''
for result in results:
    str = str + '<br/><a href='+ result.url + ' target="_blank">' + 'ref ' + result.title + '</a>  ' + result.text
HTML(str)


Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий