parser.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/usr/bin/python3
  2. import threading
  3. from queue import Queue
  4. from db import db
  5. from source import Source
  6. from linklist import LinkList
  7. from news import News
  8. def parseSource(s):
  9. num_worker_threads=10
  10. sel=None
  11. rss=False
  12. if "selector" in s:
  13. sel=s["selector"]
  14. if "rss" in s:
  15. rss=bool(s["rss"])
  16. l=LinkList(s["link"],sel,rss=rss)
  17. kw=d.get_keywords(s["category"])
  18. if l is not None:
  19. print("[Source] %s: %d total articles" % ( s["name"], len(l.links)))
  20. for a in l.links:
  21. if not d.article_exists(a):
  22. q.put(a)
  23. print("[Source] %s: %d new articles" % ( s["name"], q.qsize()))
  24. num_worker_threads=min(10,q.qsize())
  25. if not q.empty():
  26. threads=[]
  27. for i in range(num_worker_threads):
  28. t = threading.Thread(target=news_worker,args=[s["_id"],kw])
  29. t.daemon=True
  30. t.start()
  31. threads.append(t)
  32. print("Waiting for %d queue elements" % q.qsize())
  33. q.join() #block until all tasks are done
  34. print("Finished waiting for the queue")
  35. for i in range(num_worker_threads):
  36. q.put(None)
  37. print("Waiting for %d threads" % len(threads))
  38. for t in threads:
  39. t.join(10)
  40. print("[Source] %s => Finished parsing" %s["name"])
  41. def news_worker(source_id,kw):
  42. tname=threading.current_thread().name
  43. while True:
  44. try:
  45. item = q.get(timeout=5)
  46. except:
  47. print("[%s] Empty queue" % tname)
  48. break
  49. if item is None:
  50. print("[%s] Empty queue (none)" % tname)
  51. q.task_done()
  52. break
  53. print("[Thread %s] %s" % (tname,item))
  54. try:
  55. n=News(item,source_id,kw)
  56. print("[Thread %s] Finished" % tname)
  57. d.insert_article(n.get())
  58. except:
  59. print("whut")
  60. finally:
  61. q.task_done()
  62. q=Queue()
  63. d=db()
  64. d.purge_error()
  65. for s in d.sources():
  66. parseSource(s)