diff --git a/web_programming/fetch_well_rx_price.py b/web_programming/fetch_well_rx_price.py new file mode 100644 index 000000000..58dbe5993 --- /dev/null +++ b/web_programming/fetch_well_rx_price.py @@ -0,0 +1,102 @@ +""" + +Scrape the price and pharmacy name for a prescription drug from rx site +after providing the drug name and zipcode. + +""" + +from typing import Union +from urllib.error import HTTPError + +from bs4 import BeautifulSoup +from requests import exceptions, get + +BASE_URL = "https://www.wellrx.com/prescriptions/{0}/{1}/?freshSearch=true" + + +def fetch_pharmacy_and_price_list(drug_name: str, zip_code: str) -> Union[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? + if not drug_name or not zip_code: + return None + + request_url = BASE_URL.format(drug_name, zip_code) + response = get(request_url) + + # 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"}) + if grid_list and len(grid_list) > 0: + for grid in grid_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, + } + ) + + return pharmacy_price_list + + except (HTTPError, exceptions.RequestException, ValueError): + return None + + +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: Union[list, None] = fetch_pharmacy_and_price_list( + drug_name, zip_code + ) + + if pharmacy_price_list: + + print(f"\nSearch results for {drug_name} at location {zip_code}:") + for pharmacy_price in pharmacy_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}")