Spaces:
Runtime error
Runtime error
| import requests | |
| from bs4 import BeautifulSoup | |
| import streamlit as st | |
| import random | |
| import logging | |
| from fake_useragent import UserAgent | |
| logging.basicConfig(level=logging.INFO) | |
| def get_search_results(search_query): | |
| try: | |
| url = f"https://www.amazon.com/s?k={search_query}" | |
| # ua = UserAgent(browsers=['Safari', 'edge', 'Google Chrome', 'UC Browser', 'opera', 'Mozilla Firefox', 'Brave']) | |
| headers = { | |
| "User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36', | |
| "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8" | |
| } | |
| response = requests.get(url, headers=headers) | |
| response.raise_for_status() | |
| logging.info(f"Response status code: {response.status_code}") | |
| soup = BeautifulSoup(response.content, "html.parser") | |
| return soup | |
| except requests.RequestException as e: | |
| logging.error(f"Error fetching search results: {e}") | |
| return None | |
| def extract_product_info(search_results): | |
| try: | |
| products = [] | |
| results = search_results.find_all("div", class_="s-result-item") | |
| for result in results: | |
| title_element = result.find("span", class_="a-size-medium") | |
| price_element = result.find("span", class_="a-price") | |
| image_element = result.find("img", class_="s-image") | |
| review_count_element = result.find("span", class_="a-size-base") | |
| deal_element = result.find("span", class_="a-badge-text") | |
| if title_element and price_element and image_element: | |
| title = title_element.get_text().strip() | |
| price = price_element.find("span", class_="a-offscreen").get_text().strip() | |
| image_url = image_element["src"] | |
| link = result.find("a", class_="a-link-normal")["href"] | |
| reviews = review_count_element.get_text().strip() if review_count_element else "No reviews" | |
| is_deal = bool(deal_element) # Check if deal_element exists | |
| products.append( | |
| {"title": title, "price": price, "image_url": image_url, "link": link, "reviews": reviews, | |
| "is_deal": is_deal}) | |
| except Exception as e: | |
| logging.error(f"Error extracting product info: {e}") | |
| return [] | |
| return products | |
| def main(): | |
| try: | |
| st.title("Amazon Product Search") | |
| page = st.radio("Navigate", ["Home", "Search Items"]) | |
| st.markdown("-----") | |
| if page == "Home": | |
| # Fetch and display products for a random item category | |
| random_item_names = [ | |
| "Laptops", | |
| "Computer Monitors", | |
| "Computer Networking", | |
| "Computer Servers", | |
| "Computer Components", | |
| "Computer Accessories", | |
| "Computer Peripherals", | |
| "External Hard Drives", | |
| "Solid State Drives", | |
| "Graphics Cards", | |
| "RAM Memory", | |
| "Processors", | |
| "Keyboards", | |
| "Mice", | |
| "Webcams", | |
| "Headsets", | |
| "Printers", | |
| "Scanners", | |
| "Projectors", | |
| "macbook", "iphone", | |
| "samsung", "phone", | |
| "galaxy notebook" | |
| ] | |
| num_items = random.randint(8, 12) | |
| selected_item_names = random.sample(random_item_names, num_items) | |
| for item_name in selected_item_names: | |
| search_results = get_search_results(item_name) | |
| products = extract_product_info(search_results) | |
| if products: | |
| for idx, product in enumerate(products, start=1): | |
| col1, col2 = st.columns([1, 3]) | |
| with col1: | |
| st.image(product['image_url']) | |
| with col2: | |
| st.markdown(f"{product['title']}") | |
| st.subheader(f"{product['price']}") | |
| st.write(f"**Reviews:** {product['reviews']}") | |
| st.write("Deal Available" if product['is_deal'] else "No Deal Available") | |
| st.link_button("View on Amazon", f"https://www.amazon.com{product['link']}") | |
| st.markdown("---") | |
| else: | |
| st.write(f"No products found for '{item_name}'.") | |
| elif page == "Search Items": | |
| # Display search input and results | |
| search_query = st.text_input("Enter your search query:") | |
| if search_query: | |
| search_results = get_search_results(search_query) | |
| products = extract_product_info(search_results) | |
| if products: | |
| # Display the search results | |
| st.title("Search Results:") | |
| for idx, product in enumerate(products, start=1): | |
| col1, col2 = st.columns([1, 3]) | |
| with col1: | |
| st.image(product['image_url']) | |
| with col2: | |
| st.markdown(f"{product['title']}") | |
| st.subheader(f"{product['price']}") | |
| st.write(f"**Reviews:** {product['reviews']}") | |
| st.write("Deal Available" if product['is_deal'] else "No Deal Available") | |
| st.link_button("View on Amazon", f"https://www.amazon.com{product['link']}") | |
| st.markdown("---") | |
| else: | |
| st.write(f"No products found for '{search_query}'.") | |
| except Exception as e: | |
| st.error(f"An error occurred: {e}") | |
| if __name__ == "__main__": | |
| main() | |