viewgit/index.php:465 Only variables should be passed by reference [2048]

viewgit/index.php:466 Non-static method GeSHi::get_language_name_from_extension() should not be called statically [2048]

  1. #
  2. # -*- coding: utf-8 -*-
  3. #
  4.  
  5. import random
  6. import urllib2
  7. import mutex
  8. import threading
  9. import re, time
  10.  
  11. default_page = "http://poisson.phc.unipi.it"
  12.  
  13. __author__ = "Leonardo Robol <leo@robol.it>"
  14.  
  15. mtx_url_dict = mutex.mutex()
  16.  
  17. N = 10000
  18. url_dict = {}
  19. url_counter = range(N)
  20.  
  21. max_steps = 5
  22.  
  23. def get_links(page):
  24. """Restituisce una lista con i link
  25. presenti nella pagina data, in forma canonica"""
  26. content = get_page(page.url)
  27. if(content == -1):
  28. return -1
  29.  
  30. links = re.findall(r"<a href=\"(\S*)\"[^>]*>",content)
  31. ret = []
  32. for link in links:
  33. # Espando il link in modo da (speriamo!)
  34. # garantire l'unicità
  35. ret.append(expand_url(page.url, link))
  36.  
  37. return ret
  38.  
  39.  
  40. def expand_url(parent, url):
  41. """Questa funzione prende l'url della pagina parent
  42. e l'url del link e dà all'url del link una forma unica
  43. e canonica, del tipo
  44.  
  45. http://www.example.com/pagina
  46. http://www.example.com/pagina.html
  47. """
  48.  
  49. ## Controllo che l'url non cominci con un punto
  50. ## nel qual caso cerchiamo di rimediare subito,
  51. ## ma non cadiamo nel tranello di ignorare i ..
  52. if url[0] == ".":
  53. if len(url) == 1:
  54. url = parent
  55.  
  56. else:
  57. if(url[1] != "."):
  58. url = url[1:]
  59.  
  60. ## Se all'inizio dell'url c'è uno slash non ci serve tutto
  61. ## il parent, ma solo la prima parte
  62. if url.startswith("/"):
  63. parent = re.search(".+//[^/]*", parent).group(0)
  64. else:
  65. # in caso contrario dobbiamo assicurarci di troncare
  66. # l'ultima parte dell'url dopo il /, a meno che non
  67. # finisca senza estensione (in quel caso aggiungiamo un /)
  68. if re.search("\.[^/]*$", parent):
  69. parent = re.sub("[^/]*$", "", parent)
  70. else:
  71. parent += "/"
  72.  
  73.  
  74.  
  75. ## Controlliamo prima di tutto se nell'url c'è un
  76. ## protocollo
  77. protocol = re.search(r"(\w+):", url)
  78. if protocol == None:
  79. url = parent + url
  80. return url
  81.  
  82. def get_page(url):
  83. """Cerca di scaricare l'url dato e restituisce
  84. -1 se non ce la fa, il contenuto altrimenti"""
  85. try:
  86. req = urllib2.urlopen(url)
  87. except:
  88. return -1
  89.  
  90. return req.read()
  91.  
  92. class Page():
  93. """Una pagina web. Questa classe, quando viene istanziata,
  94. controlla se una pagina con quel nome è già presente (una
  95. pagina è unica!) e se lo è restituisce lo stesso oggetto,
  96. altrimenti ne crea uno nuovo con un nuovo ID"""
  97.  
  98. def __repr__(self):
  99. return "<Page object: %s>" % self.url
  100.  
  101. def __init__(self, url=""):
  102.  
  103. if(url != ""):
  104. mtx_url_dict.lock(self.__new_page, url)
  105. mtx_url_dict.unlock()
  106. else:
  107. mtx_url_dict.lock(self.__get_page, 0)
  108. mtx_url_dict.unlock()
  109.  
  110. def __get_page(self, num):
  111.  
  112. if(len(url_counter) == 0):
  113. self.exhausted = True
  114. return
  115.  
  116. page_found = False
  117.  
  118. while(not page_found):
  119.  
  120. for url in url_dict:
  121. page = Page(url)
  122. if not page.analyzed:
  123. page_found = True
  124. self.url = url
  125. break
  126.  
  127. if not page_found:
  128. time.sleep(1)
  129.  
  130.  
  131.  
  132. self.ID = page.ID
  133. self.analyzed = page.analyzed
  134. self.exhausted = False
  135. url_dict[url].analyzed = True
  136.  
  137. def __new_page(self, url):
  138. # Questo ci serve per tenere il
  139. # conto di tutti gli url
  140. global url_dict
  141. global url_counter
  142.  
  143. self.exhausted = False
  144. self.analyzed = False
  145. self.url = url
  146.  
  147. if(url_dict.has_key(url)):
  148. # Preservo i parametri che esistono già!
  149. self.ID = url_dict[url].ID
  150. self.analyzed = url_dict[url].analyzed
  151.  
  152. else:
  153. try:
  154. self.ID = url_counter.pop()
  155. except IndexError:
  156. self.exhausted = True
  157.  
  158.  
  159. url_dict[url] = self
  160. url_dict[url].links = []
  161.  
  162. def add_link(self, page):
  163.  
  164. if(page.exhausted):
  165. return -1
  166. print " => Adding link to %s" % page.url
  167. mtx_url_dict.lock(self.__add_link, page.ID)
  168. mtx_url_dict.unlock()
  169. return 0
  170.  
  171. def __add_link(self, ID):
  172. url_dict[self.url].links.append(ID)
  173.  
  174. def links(self):
  175. return url_dict[self.url].links
  176.  
  177.  
  178.  
  179.  
  180. class Crawler(threading.Thread):
  181. """Partendo da startpage, segue tutti i link registrando
  182. i vari collegamenti fra le pagine. Una volta raggiunto il
  183. limite di pagine da controllare termina"""
  184.  
  185. def __init__(self, startpage=default_page):
  186. threading.Thread.__init__(self)
  187. self.start_page = startpage
  188.  
  189.  
  190. def run(self):
  191.  
  192. step_counter = 0
  193.  
  194. # Capiamo che pagina ci serve
  195. page = Page(self.start_page)
  196.  
  197. while(not page.exhausted):
  198.  
  199. if(step_counter > max_steps):
  200. page = Page(self.start_page)
  201. step_counter = 0
  202. else:
  203. page = Page()
  204. step_counter += 1
  205.  
  206. if page.exhausted:
  207. break
  208.  
  209. # Come prima cosa devo fare il parsing dei
  210. # link che ci sono nella pagina
  211. # Diamo una mixata per simulare meglio
  212. # il caso.. dato che tanto è probabile che
  213. # alcuni link rimarranno non visitati!
  214. links = get_links(page)
  215. random.shuffle(links)
  216.  
  217. ## A questo punto io che mi occupo della pagina devo
  218. ## aggiungere tutti i link alla pagina
  219.  
  220. if not links == -1:
  221. for l in links:
  222. lpage = Page(l)
  223.  
  224. if not lpage.exhausted:
  225. page.add_link(lpage)
  226. else:
  227. break
  228.  
  229.  
  230.  
  231.  
  232. if __name__ == "__main__":
  233.  
  234. concurrency = 25
  235.  
  236. threads = []
  237. for i in range(0, concurrency):
  238. threads.append(Crawler())
  239. threads[i].start()
  240.  
  241.  
  242. for i in range(0, concurrency):
  243. threads[i].join()
  244.  
  245. ## A questo punto mi devo preoccupare di salvare
  246. ## la matrice in un formato soddisfacente
  247.  
  248. out = open("ji.txt", 'w')
  249.  
  250. for page in url_dict:
  251. for link in url_dict[page].links:
  252. out.write(page + "\t" + str(url_dict[page].ID) + "\t" + str(link) + "\n")
  253.  
  254.  
  255.  
  256.  
  257.  
  258.