- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparser.py
More file actions
Latest commit
86 lines (71 loc) · 3.04 KB
/
Copy pathparser.py
File metadata and controls
86 lines (71 loc) · 3.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
importre
importrouter
importnumpyasnp
frombs4importBeautifulSoup
fromoperatorimportitemgetter
classParser:
"""Get bestsellers data from Amazon departments and filter it."""
PERCENTILE=95
defget_department_urls(self):
"""Get links of all first level departments."""
soup=BeautifulSoup(router.do_get(
"https://www.amazon.com/Best-Sellers/zgbs/").text, "html.parser")
return [a.attrs["href"] forainsoup.find_all(
"a",
href=re.compile("https://www.amazon.com/Best-Sellers-"))]
defget_department_bestsellers(self, url):
"""Parse name, rating, reviews and price from department url"""
# print(url)
dep_bestsellers= []
b_soup=BeautifulSoup(router.do_get(url).text, "html.parser")
# Find first bestseller data
bestsellers=b_soup.find_all("div", class_="zg_itemImmersion")
forbinbestsellers:
name=b.find("a").text.strip()
rating=float(b.find("a", href=re.compile(
"/product-reviews")).text.split()[0])
reviews=int(b.find("a", class_="a-size-small").text.
replace(",", ""))
price=b.find("span", class_="p13n-sc-price").text[1:]
ifreviews>300:
b= {"name": name, "rating": rating, "reviews": reviews,
"price": float(price)}
# Track the most reviewed
ifreviews>self.max_reviews:
self.top=b
self.max_reviews=reviews
dep_bestsellers.append(b)
returndep_bestsellers
defget_percentile(self, list, p):
a=np.array(list)
returnnp.percentile(a, 80)
defget_bestsellers(self, urls):
"""Create list from each department"""
self.max_reviews=0
bestsellers= []
foruinurls:
try:
b=self.get_department_bestsellers(u)
bestsellers+=b
exceptExceptionase:
print("Skipping {}".format(u))
print(str(e))
returnbestsellers
deffilter_data(self, dict, key, value):
returnlist(filter(lambdab: b['price'] <value, dict))
defget_data(self):
dep_urls=self.get_department_urls()
bestsellers=self.get_bestsellers(dep_urls)
# Remove duplicates
bestsellers= [dict(t) fortinset([tuple(d.items())
fordinbestsellers])]
print("Found {} bestsellers".format(len(bestsellers)))
sorted_b=sorted(bestsellers, key=itemgetter('price', 'reviews'))
p=self.get_percentile([b['price']
forbinsorted_b], self.PERCENTILE)
print("Percentile value is: {}".format(p))
# Filter by percentile
filtered_b=self.filter_data(dict=sorted_b, key='price', value=p)
print("Filtered to {} by {} percentile".format(
len(filtered_b), self.PERCENTILE))
returnfiltered_b