A semantic search engine for source code https://bitshift.benkurtovic.com/
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 
 

100 rindas
3.5 KiB

  1. """
  2. :synopsis: Main crawler module, to oversee all site-specific crawlers.
  3. ...more info soon...
  4. """
  5. import requests, time, threading
  6. import bitshift.crawler.git_indexer
  7. from ..codelet import Codelet
  8. from ..database import Database
  9. class GitHubCrawler(threading.Thread):
  10. """
  11. Crawler that retrieves links to all of GitHub's public repositories.
  12. GitHubCrawler is a threaded singleton that queries GitHub's API for URLs
  13. to its public repositories, which it inserts into a :class:`Queue.Queue`
  14. shared with :class:`bitshift.crawler.git_indexer.GitIndexer`.
  15. :ivar repository_queue: (:class:`Queue.Queue`) Contains dictionaries with
  16. repository information retrieved by `GitHubCrawler`, and other Git
  17. crawlers, to be processed by
  18. :class:`bitshift.crawler.git_indexer.GitIndexer`.
  19. """
  20. def __init__(self, repository_queue):
  21. """
  22. Create an instance of the singleton `GitHubCrawler`.
  23. :param repository_queue: A queue containing dictionaries of repository
  24. metadata retrieved by `GitHubCrawler`, meant to be processed by an
  25. instance of :class:`bitshift.crawler.git_indexer.GitIndexer`.
  26. .. code-block:: python
  27. sample_dict = {
  28. "url" : "https://github.com/user/repo",
  29. "name" : "repo",
  30. "framework_name" : "GitHub"
  31. }
  32. :type repository_queue: :class:`Queue.Queue`
  33. """
  34. self.repository_queue = repository_queue
  35. super(GitHubCrawler, self).__init__()
  36. def run(self):
  37. """
  38. Query the GitHub API for data about every public repository.
  39. Pull all of GitHub's repositories by making calls to its API in a loop,
  40. accessing a subsequent page of results via the "next" URL returned in an
  41. API response header. Uses Severyn Kozak's (sevko) authentication
  42. credentials.
  43. """
  44. next_api_url = "https://api.github.com/repositories"
  45. authentication_params = {
  46. "client_id" : "436cb884ae09be7f2a4e",
  47. "client_secret" : "8deeefbc2439409c5b7a092fd086772fe8b1f24e"
  48. }
  49. api_request_interval = 5e3 / 60 ** 2
  50. while len(next_api_url) > 0:
  51. # DEBUG
  52. db.log.insert({
  53. "time" : str(time.time()).split(".")[0][-4:],
  54. "qsize" : self.repository_queue.qsize()
  55. })
  56. start_time = time.time()
  57. response = requests.get(next_api_url, params=authentication_params)
  58. for repo in response.json():
  59. logging.basicConfig(filename="crawler.log", level=logging.DEBUG)
  60. logging.debug("crawler: %-20s: %-5s: %-5s: %s",
  61. str(time.time()).split(".")[0],
  62. self.repository_queue.qsize(), repo["id"],
  63. repo["name"])
  64. while self.repository_queue.full():
  65. pass
  66. self.repository_queue.put({
  67. "url" : repo["html_url"],
  68. "name" : repo["html_url"].split("/")[-1],
  69. "framework_name" : "GitHub"
  70. })
  71. if int(response.headers["x-ratelimit-remaining"]) == 0:
  72. time.sleep(int(response.headers["x-ratelimit-reset"]) -
  73. time.time())
  74. next_api_url = response.headers["link"].split(">")[0][1:]
  75. sleep_time = api_request_interval - (time.time() - start_time)
  76. if sleep_time > 0:
  77. time.sleep(sleep_time)