Wyszukiwanie i agregacja projektów z github, bitbucket czy Google code
9 October 2009
Comments
bitbucket.org, code.google.com, czy github.com to serwisy hostujące ogromną ilość otwartoźródłowych projektów programistów z całego świata (nie należy też zapominać o innych serwisach jak sourceforge). Tworząc tematyczny artykuł, serwis internetowy bardzo przydatne mogło by być agregowanie projektów na dany temat ze wszystkich tych stron. W tym artykule zaprezentuję przykładowe rozwiązanie wyszukiwania projektów i agregacji zdobytych danych w Pythonie.
Github
Serwis ten udostępnia API pozwalające wyszukiwać repozytoria (zwraca dane w formacie YAML), lecz nie można pobrać pełnej listy wyników (stronicować wyników wyszukiwania), więc trzeba uciec się do standardowego rozwiązania - ekstrakcji danych ze strony HTML. Oto przykładowa funkcja:import urllib2
from re import findall
def github_getall(term, page=1):
opener = urllib2.build_opener()
opener.addheaders = [('user-agent', 'Opera/9.64 (X11; Linux x86_64; U; en) Presto/2.1.1')]
o = opener.open('http://github.com/search?type=Repositories&language=&q=%s&repo=&langOverride=&x=5&y=22&start_value=%s' % (term, str(page)))
data = o.read()
repos = findall( r'(?xs)<h2\s*class="title">(.*?)<a\s*href="(.*?)">(.*?)</a>(.*?)<div\s*class="description">(.*?)</div>''', data)
if len(repos) > 0:
for i in repos:
name = i[2].split(' / ')
author = name[0].strip()
title = name[1].strip()
url = 'http://github.com/%s/%s/' % (author, title)
desc = i[4].strip()
print title
print url
print desc
print
print github_getall('django', 1)
for i in range(1,10):
try:
github_getall('google+wave', i)
except:
# nie ma już więcej stron stronicowania wyników
print 'EXCEPTION'
Google Code
Rozwiązanie dla tej usługi jest bardzo podobne:import urllib2
from re import findall
def googlec(term, page=1):
openurl = 'http://code.google.com/hosting/search?q=%s&btn=Search+projects' % term
if page > 1:
openurl = '%s&start=%s' % (openurl, str(page*10))
opener = urllib2.build_opener()
opener.addheaders = [('user-agent', 'Opera/9.64 (X11; Linux x86_64; U; en) Presto/2.1.1')]
o = opener.open(openurl)
data = o.read()
repos = findall( r'(?xs)clk\(this,\s*([0-9]*)\)"(.*?)href="(.*?)">(.*?)
\s*-\s*(.*?)</a>''', data)
if len(repos) > 0:
for i in repos:
url = 'http://code.google.com%s' % i[2]
title = i[3].strip()
desc = i[4].strip()
print title
print desc
print url
print
print googlec('django', 1)
Bitbucked
A dla Bitbucked wystarczy taki skrypcik:import urllib2
from re import findall
def bitbucket(term, page=1):
opener = urllib2.build_opener()
opener.addheaders = [('user-agent', 'Opera/9.64 (X11; Linux x86_64; U; en) Presto/2.1.1')]
o = opener.open('http://bitbucket.org/repo/all/popular/%s/?name=%s' % (str(page), term))
data = o.read()
repos = findall( r'(?xs)<span><a\s*href="(.*?)">(.*?)</a>\s*/\s*<a\s*href="(.*?)">(.*?)</a></span><br\s*/>(.*?) (.*?).<br\s*/>''', data)
if len(repos) > 0:
for i in repos:
author = i[1]
url = 'http://bitbucket.org%s' % i[2]
title = i[3]
desc = i[5].strip()
print title
print author
print url
print desc
print
print bitbucket('django', 1)
Zaprezentowane powyżej funkcje zostały wykorzystane w aplikacji Projekty zbierającej projekty dotyczące (w przypadku tej strony): Django, GAE, Google Wave, PyQt i Pythona.
RkBlog
Comment article