- Notifications
You must be signed in to change notification settings - Fork 46.7k
/
Copy pathfetch_well_rx_price.py
96 lines (67 loc) · 2.74 KB
/
fetch_well_rx_price.py
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
87
88
89
90
91
92
93
94
95
96
"""
Scrape the price and pharmacy name for a prescription drug from rx site
after providing the drug name and zipcode.
"""
fromurllib.errorimportHTTPError
frombs4importBeautifulSoup
fromrequestsimportexceptions, get
BASE_URL="https://www.wellrx.com/prescriptions/{0}/{1}/?freshSearch=true"
deffetch_pharmacy_and_price_list(drug_name: str, zip_code: str) ->list|None:
"""[summary]
This function will take input of drug name and zipcode,
then request to the BASE_URL site.
Get the page data and scrape it to the generate the
list of lowest prices for the prescription drug.
Args:
drug_name (str): [Drug name]
zip_code(str): [Zip code]
Returns:
list: [List of pharmacy name and price]
>>> fetch_pharmacy_and_price_list(None, None)
>>> fetch_pharmacy_and_price_list(None, 30303)
>>> fetch_pharmacy_and_price_list("eliquis", None)
"""
try:
# Has user provided both inputs?
ifnotdrug_nameornotzip_code:
returnNone
request_url=BASE_URL.format(drug_name, zip_code)
response=get(request_url, timeout=10)
# Is the response ok?
response.raise_for_status()
# Scrape the data using bs4
soup=BeautifulSoup(response.text, "html.parser")
# This list will store the name and price.
pharmacy_price_list= []
# Fetch all the grids that contains the items.
grid_list=soup.find_all("div", {"class": "grid-x pharmCard"})
ifgrid_listandlen(grid_list) >0:
forgridingrid_list:
# Get the pharmacy price.
pharmacy_name=grid.find("p", {"class": "list-title"}).text
# Get price of the drug.
price=grid.find("span", {"p", "price price-large"}).text
pharmacy_price_list.append(
{
"pharmacy_name": pharmacy_name,
"price": price,
}
)
returnpharmacy_price_list
except (HTTPError, exceptions.RequestException, ValueError):
returnNone
if__name__=="__main__":
# Enter a drug name and a zip code
drug_name=input("Enter drug name: ").strip()
zip_code=input("Enter zip code: ").strip()
pharmacy_price_list: list|None=fetch_pharmacy_and_price_list(
drug_name, zip_code
)
ifpharmacy_price_list:
print(f"\nSearch results for {drug_name} at location {zip_code}:")
forpharmacy_priceinpharmacy_price_list:
name=pharmacy_price["pharmacy_name"]
price=pharmacy_price["price"]
print(f"Pharmacy: {name} Price: {price}")
else:
print(f"No results found for {drug_name}")