Wyszukiwanie i agregacja projektów z github, bitbucket czy Google code

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)
Zaprezentowana funkcja dla zadanej frazy wyszuka repozytoria i zwróci listę obrobionych wyników. Dla pobrania większej ilości danych należy skorzystać ze stronicowania, np:
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

Programowanie Sieciowe, 9 October 2009

Comment article
Comment article RkBlog main page Search RSS Contact