parser.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. sel=None
  10. rss=False
  11. if "selector" in s:
  12. sel=s["selector"]
  13. if "rss" in s:
  14. rss=bool(["rss"])
  15. l=LinkList(s["link"],sel,rss=rss)
  16. kw=d.get_keywords(s["category"])
  17. if l is not None:
  18. print("[Source] %s: %d total articles" % ( s["name"], len(l.links)))
  19. for a in l.links:
  20. if not d.article_exists(a):
  21. q.put(a)
  22. print("[Source] %s: %d new articles" % ( s["name"], q.qsize()))
  23. if not q.empty():
  24. threads=[]
  25. for i in range(num_worker_threads):
  26. t = threading.Thread(target=news_worker,args=[s["_id"],kw])
  27. t.daemon=True
  28. t.start()
  29. threads.append(t)
  30. print("Waiting for %d queue elements" % q.qsize())
  31. q.join() #block until all tasks are done
  32. #stop workers
  33. for i in range(num_worker_threads):
  34. q.put(None)
  35. for t in threads:
  36. t.join()
  37. print("[Source] %s => Finished parsing" %s["name"])
  38. def news_worker(source_id,kw):
  39. while True:
  40. item = q.get()
  41. if item is None:
  42. break
  43. n=News(item,source_id,kw)
  44. print("[Thread %s] %s" % (threading.current_thread().name,n.URL))
  45. d.insert_article(n.get())
  46. q.task_done()
  47. q=Queue()
  48. d=db()
  49. d.purge_error()
  50. num_worker_threads=100
  51. for s in d.sources():
  52. parseSource(s)