MPCW / scraper.py
harshdhane's picture
Update scraper.py
edca2c5 verified
Raw
History Blame Contribute Delete
6.51 kB
import time
import requests
from bs4 import BeautifulSoup
from urllib.parse import quote_plus
# Global session with headers
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/114.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9"
})
def fetch_soup(url):
try:
resp = session.get(url, timeout=10)
resp.raise_for_status()
time.sleep(1) # polite delay
return BeautifulSoup(resp.text, "html.parser")
except requests.exceptions.HTTPError as e:
print(f"[ERROR] HTTP error while fetching: {url}\n{e}")
return BeautifulSoup("", "html.parser")
except Exception as e:
print(f"[ERROR] General error while fetching: {url}\n{e}")
return BeautifulSoup("", "html.parser")
def scrape_amazon(query):
print(f"Scraping Amazon for query: {query}")
url = f"https://www.amazon.in/s?k={quote_plus(query)}"
soup = fetch_soup(url)
products = []
for item in soup.select("div[data-component-type='s-search-result']"):
name_el = item.select_one("h2 span")
price_el = item.select_one("span.a-price-whole")
img_el = item.select_one("img.s-image")
link_el = item.select_one("a")
products.append({
"name": name_el.get_text(strip=True) if name_el else "N/A",
"price": price_el.get_text(strip=True) if price_el else "N/A",
"img": img_el["src"] if img_el else "",
"link": "https://www.amazon.in" + link_el["href"] if link_el else ""
})
return products
def scrape_1mg(query):
print(f"Scraping 1mg for query: {query}")
url = f"https://www.1mg.com/search/all?name={quote_plus(query)}"
soup = fetch_soup(url)
products = []
for product in soup.select("div.style__horizontal-card___1Zwmt"):
name_el = product.select_one("div.style__product-description___1vPQe")
price_el = product.select_one("div.style__price-tag___B2csA")
link_el = product.select_one("a")
img_el = product.select_one("img")
products.append({
"name": name_el.get_text(strip=True) if name_el else "N/A",
"price": price_el.get_text(strip=True) if price_el else "N/A",
"img": img_el["src"] if img_el else "",
"link": "https://www.1mg.com" + link_el["href"] if link_el else ""
})
return products
def scrape_netmeds(query):
print(f"Scraping Netmeds for query: {query}")
url = f"https://www.netmeds.com/catalogsearch/result/{quote_plus(query)}/all"
soup = fetch_soup(url)
products = []
for product in soup.select("div.cat-item"):
name_el = product.select_one("h3")
price_el = product.select_one("span.final-price")
link_el = product.select_one("a")
img_el = product.select_one("img")
products.append({
"name": name_el.get_text(strip=True) if name_el else "N/A",
"price": price_el.get_text(strip=True) if price_el else "N/A",
"img": img_el["src"] if img_el else "",
"link": "https://www.netmeds.com" + link_el["href"] if link_el else ""
})
return products
def scrape_pharmeasy(query):
print(f"Scraping PharmEasy for query: {query}")
url = f"https://pharmeasy.in/search/all?name={quote_plus(query)}"
soup = fetch_soup(url)
products = []
for product in soup.select("div.ProductCard_medicineUnitContainer__m2_zO"):
name_el = product.select_one("h1")
price_el = product.select_one("div.ProductCard_ourPrice__yU5GB")
link_el = product.select_one("a")
img_el = product.select_one("img")
products.append({
"name": name_el.get_text(strip=True) if name_el else "N/A",
"price": price_el.get_text(strip=True) if price_el else "N/A",
"img": img_el["src"] if img_el else "",
"link": "https://pharmeasy.in" + link_el["href"] if link_el else ""
})
return products
def search_product(query):
amazon_products = [{"source": "Amazon", **p} for p in scrape_amazon(query)]
one_mg_products = [{"source": "1mg", **p} for p in scrape_1mg(query)]
netmeds_products = [{"source": "Netmeds", **p} for p in scrape_netmeds(query)]
pharmeasy_products = [{"source": "PharmEasy", **p} for p in scrape_pharmeasy(query)]
combined = []
max_len = max(len(amazon_products), len(one_mg_products), len(netmeds_products), len(pharmeasy_products))
for i in range(max_len):
combined.append({
"name": (
amazon_products[i]["name"] if i < len(amazon_products) else
one_mg_products[i]["name"] if i < len(one_mg_products) else
netmeds_products[i]["name"] if i < len(netmeds_products) else
pharmeasy_products[i]["name"] if i < len(pharmeasy_products) else ""
),
"img": (
amazon_products[i]["img"] if i < len(amazon_products) else
one_mg_products[i]["img"] if i < len(one_mg_products) else
netmeds_products[i]["img"] if i < len(netmeds_products) else
pharmeasy_products[i]["img"] if i < len(pharmeasy_products) else ""
),
"amazon": amazon_products[i] if i < len(amazon_products) else {},
"one_mg": one_mg_products[i] if i < len(one_mg_products) else {},
"netmeds": netmeds_products[i] if i < len(netmeds_products) else {},
"pharmeasy": pharmeasy_products[i] if i < len(pharmeasy_products) else {},
})
return combined
def search_product_with_progress(query):
combined = search_product(query)
# Fetch side effects using OpenFDA API
api_url = f'https://api.fda.gov/drug/event.json?api_key=ah8n0nI6468qpS6cMfqvBM0sdGs4nO1sT3Ie7LjJ&search=patient.drug.medicinalproduct:"{query}"'
try:
response = requests.get(api_url)
data = response.json()
if data.get('results'):
side_effects = [
reaction.get('reactionmeddrapt', 'N/A')
for reaction in data['results'][0].get('patient', {}).get('reaction', [])
]
else:
side_effects = ["No side effects found."]
except Exception as e:
print(f"Error fetching side effects: {e}")
side_effects = ["Error fetching side effects."]
return combined, side_effects