Skip to content

Commit 8ed4fea

Browse files
committed
update
1 parent 2ea0280 commit 8ed4fea

File tree

12 files changed

+451
-1
lines changed

12 files changed

+451
-1
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
1+
.DS_Store
22
# C++ objects and libs
33
*.slo
44
*.lo

SanDeal_Demo/TikiDisplayThread.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from threading import Thread
2+
from TikiHunterThread import TikiHunterThread
3+
import time
4+
from os import system
5+
6+
class TikiDisplayThread(Thread):
7+
8+
def __init__(self):
9+
Thread.__init__(self)
10+
self.hunters = []
11+
self.index = 0
12+
13+
def addHunter(self, hunter):
14+
self.hunters.append(hunter)
15+
16+
def show(self):
17+
for h in self.hunters:
18+
if(h.bestItem != None):
19+
print(h.bestItem.info())
20+
print("----------------")
21+
22+
def isAllAlive(self):
23+
for h in self.hunters:
24+
if h.isAlive() == False:
25+
return False
26+
return True
27+
28+
def run(self):
29+
while True and self.isAllAlive():
30+
self.index = (self.index + 1) % 100
31+
print("index: " + str(self.index))
32+
self.show()
33+
time.sleep(3)
34+
system("clear")

SanDeal_Demo/TikiHelper.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from TikiTarget import TikiTarget
2+
3+
def getTargetsFromFile(fileName):
4+
targetFile = open(fileName, "r")
5+
lines = targetFile.readlines()
6+
targetFile.close()
7+
8+
targets = []
9+
n = len(lines)
10+
print("n = " + str(n))
11+
i = 0
12+
while i < n:
13+
newTarget = TikiTarget(lines[i].strip(), lines[i+1].strip())
14+
# print(newTarget.info())
15+
targets.append(newTarget)
16+
i = i+2
17+
18+
return targets
19+
20+
# 1.499.000đ => 1499000
21+
def convertToPrice(strPrice):
22+
strPrice = strPrice.replace('.', '')
23+
strPrice = strPrice.replace('đ', '')
24+
return int(strPrice)

SanDeal_Demo/TikiHunterThread.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
from threading import Thread
2+
from TikiTarget import TikiTarget
3+
from TikiItem import TikiItem
4+
from TikiHelper import *
5+
from bs4 import BeautifulSoup
6+
import requests
7+
import time
8+
9+
10+
class TikiHunterThread(Thread):
11+
MAX_PAGE = 1
12+
13+
def __init__(self, target):
14+
Thread.__init__(self)
15+
self.target = target
16+
self.bestItem = None
17+
self.name = target.getKeyword()
18+
19+
def __findBestItem(self):
20+
# for to MAX_PAGE
21+
searchLink = self.target.getSearchLink(1)
22+
response = requests.get(searchLink)
23+
24+
if response.status_code != 200:
25+
return
26+
27+
28+
bsoup = BeautifulSoup(response.text, "lxml")
29+
# <a> class = search-a-product-item
30+
listElement = bsoup.findAll("a", {"class":"search-a-product-item"})
31+
32+
i = 0
33+
for e in listElement:
34+
# print(str(i) + " : ")
35+
36+
if(e.get_text().find("Đã hết hàng") >= 0 or e.get_text().find("Ngừng kinh doanh") >= 0):
37+
# print("=========== Đã hết hàng ======")
38+
continue
39+
40+
newItem = TikiItem()
41+
42+
newItem.title = e.get("title")
43+
newItem.url = "https://tiki.vn" +e.get("href")
44+
span = e.find("span", {"class":"final-price"})
45+
newItem.price = convertToPrice(span.contents[0].strip())
46+
47+
48+
span = e.find("span", {"class":"price-regular"})
49+
if(span != None):
50+
newItem.regularPrice = convertToPrice(span.contents[0].strip())
51+
52+
if(newItem.isValidItem(self.target.patterns)):
53+
# print(newItem.info())
54+
if(self.bestItem == None):
55+
self.bestItem = newItem
56+
else:
57+
if(newItem.price < self.bestItem.price):
58+
self.bestItem = newItem
59+
i = i + 1
60+
61+
# print("Best Item: " + self.name)
62+
# if(self.bestItem != None):
63+
# print(self.bestItem.info())
64+
# print("--------------")
65+
66+
67+
def run(self):
68+
print("Start Thread: " + self.name)
69+
while True:
70+
try:
71+
self.__findBestItem()
72+
except:
73+
print("Something Wrong!!!!")
74+
time.sleep(2)
75+
print("End Thread: " + self.name)

SanDeal_Demo/TikiItem.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
class TikiItem:
3+
def __init__(self):
4+
self.title = ""
5+
self.price = 0
6+
self.regularPrice = 0
7+
self.url = ""
8+
9+
def info(self):
10+
return self.title +" | " + str(self.price) + " | " + self.url
11+
12+
def isValidItem(self, patterns):
13+
for p in patterns:
14+
if self.title.lower().find(p.lower()) < 0:
15+
return False
16+
return True

SanDeal_Demo/TikiMain.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from TikiTarget import TikiTarget
2+
from TikiItem import TikiItem
3+
from TikiHunterThread import TikiHunterThread
4+
from TikiDisplayThread import TikiDisplayThread
5+
from TikiHelper import *
6+
from bs4 import BeautifulSoup
7+
import requests
8+
import time
9+
10+
TARGET_FILE = "target_list.txt"
11+
12+
targets = getTargetsFromFile(TARGET_FILE)
13+
threads = []
14+
displayThread = TikiDisplayThread()
15+
16+
for t in targets:
17+
hunter = TikiHunterThread(t)
18+
hunter.start()
19+
threads.append(hunter)
20+
displayThread.addHunter(hunter)
21+
22+
displayThread.start()
23+
24+
for t in threads:
25+
t.join()
26+
27+
print ("===== END Main ====")

SanDeal_Demo/TikiTarget.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
2+
class TikiTarget:
3+
def __init__(self, patternStr="", categoryStr = ""):
4+
self.patternsString = patternStr
5+
self.patterns = self.__splitPattern()
6+
self.categoryUrl = categoryStr
7+
8+
def info(sefl):
9+
return "Patterns: " + str(sefl.patterns) + " | category: " + sefl.categoryUrl
10+
11+
def __splitPattern(sefl):
12+
newList = sefl.patternsString.split(",")
13+
i = 0
14+
while i < len(newList):
15+
newList[i] = newList[i].strip()
16+
i = i+1
17+
return newList
18+
19+
# Máy ảnh, lấy liền, Fujifilm => Máy ảnh lấy liền Fujifilm
20+
def getKeyword(sefl):
21+
keyword = ""
22+
for key in sefl.patterns:
23+
keyword = keyword + " " + key
24+
return keyword
25+
26+
def getSearchLink(sefl, pageNum):
27+
return sefl.categoryUrl +"?q="+ sefl.getKeyword() + "&ref=categorySearch&page=" + str(pageNum)

SanDeal_Demo/_ClassDiagram.png

27.6 KB
Loading

SanDeal_Demo/_System.jpg

130 KB
Loading

SanDeal_Demo/target_list.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Máy ảnh, lấy liền, Fujifilm
2+
https://tiki.vn/may-anh-lay-lien/c2144
3+
Nồi Chiên Không Dầu, Philips
4+
https://tiki.vn/noi-chien/c8123

0 commit comments

Comments
 (0)