harshdhane commited on
Commit
edca2c5
·
verified ·
1 Parent(s): 330965a

Update scraper.py

Browse files
Files changed (1) hide show
  1. scraper.py +62 -102
scraper.py CHANGED
@@ -1,128 +1,123 @@
1
  import time
2
  import requests
3
  from bs4 import BeautifulSoup
 
4
 
5
- import requests
6
- from bs4 import BeautifulSoup
7
-
8
- def fetch_soup(url):
9
- headers = {
10
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
11
- "AppleWebKit/537.36 (KHTML, like Gecko) "
12
- "Chrome/114.0.0.0 Safari/537.36",
13
- "Accept-Language": "en-US,en;q=0.9",
14
- }
15
- resp = requests.get(url, headers=headers)
16
- resp.raise_for_status()
17
- return BeautifulSoup(resp.text, "html.parser")
18
-
19
- session = requests.Session()
20
  session.headers.update({
21
- "User-Agent": "Mozilla/5.0 ...",
22
- "Accept-Language": "en-US,en;q=0.9",
 
 
23
  })
24
- resp = session.get(url)
25
-
26
 
27
  def fetch_soup(url):
28
- resp = requests.get(url, headers=HEADERS, timeout=10)
29
- resp.raise_for_status()
30
- # optional sleep to be polite / avoid rate‑limits
31
- time.sleep(1)
32
- return BeautifulSoup(resp.text, "html.parser")
 
 
 
 
 
 
33
 
34
 
35
  def scrape_amazon(query):
36
  print(f"Scraping Amazon for query: {query}")
37
- url = f"https://www.amazon.in/s?k={query}"
38
  soup = fetch_soup(url)
39
 
40
  products = []
41
  for item in soup.select("div[data-component-type='s-search-result']"):
42
- name_el = item.select_one("h2 span ")
43
  price_el = item.select_one("span.a-price-whole")
44
- img_el = item.select_one("img.s-image")
45
- link_el = item.select_one("a")
46
 
47
  products.append({
48
- "name": name_el .get_text(strip=True) if name_el else "N/A",
49
  "price": price_el.get_text(strip=True) if price_el else "N/A",
50
- "img": img_el ["src"] if img_el else "",
51
- "link": "https://www.amazon.in" + link_el["href"] if link_el else ""
52
  })
53
  return products
54
 
55
 
56
  def scrape_1mg(query):
57
  print(f"Scraping 1mg for query: {query}")
58
- url = f"https://www.1mg.com/search/all?name={query}"
59
  soup = fetch_soup(url)
60
 
61
  products = []
62
  for product in soup.select("div.style__horizontal-card___1Zwmt"):
63
- name_el = product.select_one("div.style__product-description___1vPQe")
64
  price_el = product.select_one("div.style__price-tag___B2csA")
65
- link_el = product.select_one("a")
66
- img_el = product.select_one("img")
67
 
68
  products.append({
69
- "name": name_el.get_text(strip=True) if name_el else "N/A",
70
  "price": price_el.get_text(strip=True) if price_el else "N/A",
71
- "img": img_el ["src"] if img_el else "",
72
- "link": "https://www.1mg.com" + link_el["href"] if link_el else ""
73
  })
74
  return products
75
-
 
76
  def scrape_netmeds(query):
77
  print(f"Scraping Netmeds for query: {query}")
78
- url = f"https://www.netmeds.com/catalogsearch/result/{query}/all"
79
  soup = fetch_soup(url)
80
 
81
  products = []
82
  for product in soup.select("div.cat-item"):
83
- name_el = product.select_one("h3")
84
  price_el = product.select_one("span.final-price")
85
- link_el = product.select_one("a")
86
- img_el = product.select_one("img")
87
 
88
  products.append({
89
- "name": name_el.get_text(strip=True) if name_el else "N/A",
90
  "price": price_el.get_text(strip=True) if price_el else "N/A",
91
- "img": img_el ["src"] if img_el else "",
92
- "link": "https://www.netmeds.com" + link_el["href"] if link_el else ""
93
  })
94
  return products
95
 
 
96
  def scrape_pharmeasy(query):
97
  print(f"Scraping PharmEasy for query: {query}")
98
- url = f"https://pharmeasy.in/search/all?name={query}"
99
  soup = fetch_soup(url)
100
 
101
  products = []
102
  for product in soup.select("div.ProductCard_medicineUnitContainer__m2_zO"):
103
- name_el = product.select_one("h1")
104
  price_el = product.select_one("div.ProductCard_ourPrice__yU5GB")
105
- link_el = product.select_one("a")
106
- img_el = product.select_one("img")
107
 
108
  products.append({
109
- "name": name_el.get_text(strip=True) if name_el else "N/A",
110
  "price": price_el.get_text(strip=True) if price_el else "N/A",
111
- "img": img_el ["src"] if img_el else "",
112
- "link": "https://pharmeasy.in" + link_el["href"] if link_el else ""
113
  })
114
  return products
115
 
116
 
117
  def search_product(query):
118
- amazon_products = [{"source": "Amazon", **p} for p in scrape_amazon(query)]
119
- one_mg_products = [{"source": "1mg", **p} for p in scrape_1mg(query)]
120
- netmeds_products = [{"source": "Netmeds",**p} for p in scrape_netmeds(query)]
121
- pharmeasy_products = [{"source": "PharmEasy",**p} for p in scrape_pharmeasy(query)]
122
 
123
  combined = []
124
- max_len = max(len(amazon_products), len(one_mg_products),
125
- len(netmeds_products), len(pharmeasy_products))
126
 
127
  for i in range(max_len):
128
  combined.append({
@@ -130,15 +125,13 @@ def search_product(query):
130
  amazon_products[i]["name"] if i < len(amazon_products) else
131
  one_mg_products[i]["name"] if i < len(one_mg_products) else
132
  netmeds_products[i]["name"] if i < len(netmeds_products) else
133
- pharmeasy_products[i]["name"] if i < len(pharmeasy_products) else
134
- ""
135
  ),
136
  "img": (
137
  amazon_products[i]["img"] if i < len(amazon_products) else
138
  one_mg_products[i]["img"] if i < len(one_mg_products) else
139
  netmeds_products[i]["img"] if i < len(netmeds_products) else
140
- pharmeasy_products[i]["img"] if i < len(pharmeasy_products) else
141
- ""
142
  ),
143
  "amazon": amazon_products[i] if i < len(amazon_products) else {},
144
  "one_mg": one_mg_products[i] if i < len(one_mg_products) else {},
@@ -150,44 +143,11 @@ def search_product(query):
150
 
151
 
152
  def search_product_with_progress(query):
153
- """Search products with progress tracking - this is for demo purposes"""
154
- import requests
155
-
156
- # Simulate progress tracking by calling each scraper individually
157
- amazon_products = [{"source": "Amazon", **p} for p in scrape_amazon(query)]
158
- one_mg_products = [{"source": "1mg", **p} for p in scrape_1mg(query)]
159
- netmeds_products = [{"source": "Netmeds", **p} for p in scrape_netmeds(query)]
160
- pharmeasy_products = [{"source": "PharmEasy", **p} for p in scrape_pharmeasy(query)]
161
-
162
- # Combine results
163
- combined = []
164
- max_len = max(len(amazon_products), len(one_mg_products),
165
- len(netmeds_products), len(pharmeasy_products))
166
 
167
- for i in range(max_len):
168
- combined.append({
169
- "name": (
170
- amazon_products[i]["name"] if i < len(amazon_products) else
171
- one_mg_products[i]["name"] if i < len(one_mg_products) else
172
- netmeds_products[i]["name"] if i < len(netmeds_products) else
173
- pharmeasy_products[i]["name"] if i < len(pharmeasy_products) else
174
- ""
175
- ),
176
- "img": (
177
- amazon_products[i]["img"] if i < len(amazon_products) else
178
- one_mg_products[i]["img"] if i < len(one_mg_products) else
179
- netmeds_products[i]["img"] if i < len(netmeds_products) else
180
- pharmeasy_products[i]["img"] if i < len(pharmeasy_products) else
181
- ""
182
- ),
183
- "amazon": amazon_products[i] if i < len(amazon_products) else {},
184
- "one_mg": one_mg_products[i] if i < len(one_mg_products) else {},
185
- "netmeds": netmeds_products[i] if i < len(netmeds_products) else {},
186
- "pharmeasy": pharmeasy_products[i] if i < len(pharmeasy_products) else {},
187
- })
188
-
189
- # Fetch side effects
190
  api_url = f'https://api.fda.gov/drug/event.json?api_key=ah8n0nI6468qpS6cMfqvBM0sdGs4nO1sT3Ie7LjJ&search=patient.drug.medicinalproduct:"{query}"'
 
191
  try:
192
  response = requests.get(api_url)
193
  data = response.json()
@@ -199,7 +159,7 @@ def search_product_with_progress(query):
199
  else:
200
  side_effects = ["No side effects found."]
201
  except Exception as e:
202
- print(f"Error fetching data: {e}")
203
- side_effects = ["Error fetching data. Please try again."]
204
 
205
- return combined, side_effects
 
1
  import time
2
  import requests
3
  from bs4 import BeautifulSoup
4
+ from urllib.parse import quote_plus
5
 
6
+ # Global session with headers
7
+ session = requests.Session()
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  session.headers.update({
9
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
10
+ "AppleWebKit/537.36 (KHTML, like Gecko) "
11
+ "Chrome/114.0.0.0 Safari/537.36",
12
+ "Accept-Language": "en-US,en;q=0.9"
13
  })
 
 
14
 
15
  def fetch_soup(url):
16
+ try:
17
+ resp = session.get(url, timeout=10)
18
+ resp.raise_for_status()
19
+ time.sleep(1) # polite delay
20
+ return BeautifulSoup(resp.text, "html.parser")
21
+ except requests.exceptions.HTTPError as e:
22
+ print(f"[ERROR] HTTP error while fetching: {url}\n{e}")
23
+ return BeautifulSoup("", "html.parser")
24
+ except Exception as e:
25
+ print(f"[ERROR] General error while fetching: {url}\n{e}")
26
+ return BeautifulSoup("", "html.parser")
27
 
28
 
29
  def scrape_amazon(query):
30
  print(f"Scraping Amazon for query: {query}")
31
+ url = f"https://www.amazon.in/s?k={quote_plus(query)}"
32
  soup = fetch_soup(url)
33
 
34
  products = []
35
  for item in soup.select("div[data-component-type='s-search-result']"):
36
+ name_el = item.select_one("h2 span")
37
  price_el = item.select_one("span.a-price-whole")
38
+ img_el = item.select_one("img.s-image")
39
+ link_el = item.select_one("a")
40
 
41
  products.append({
42
+ "name": name_el.get_text(strip=True) if name_el else "N/A",
43
  "price": price_el.get_text(strip=True) if price_el else "N/A",
44
+ "img": img_el["src"] if img_el else "",
45
+ "link": "https://www.amazon.in" + link_el["href"] if link_el else ""
46
  })
47
  return products
48
 
49
 
50
  def scrape_1mg(query):
51
  print(f"Scraping 1mg for query: {query}")
52
+ url = f"https://www.1mg.com/search/all?name={quote_plus(query)}"
53
  soup = fetch_soup(url)
54
 
55
  products = []
56
  for product in soup.select("div.style__horizontal-card___1Zwmt"):
57
+ name_el = product.select_one("div.style__product-description___1vPQe")
58
  price_el = product.select_one("div.style__price-tag___B2csA")
59
+ link_el = product.select_one("a")
60
+ img_el = product.select_one("img")
61
 
62
  products.append({
63
+ "name": name_el.get_text(strip=True) if name_el else "N/A",
64
  "price": price_el.get_text(strip=True) if price_el else "N/A",
65
+ "img": img_el["src"] if img_el else "",
66
+ "link": "https://www.1mg.com" + link_el["href"] if link_el else ""
67
  })
68
  return products
69
+
70
+
71
  def scrape_netmeds(query):
72
  print(f"Scraping Netmeds for query: {query}")
73
+ url = f"https://www.netmeds.com/catalogsearch/result/{quote_plus(query)}/all"
74
  soup = fetch_soup(url)
75
 
76
  products = []
77
  for product in soup.select("div.cat-item"):
78
+ name_el = product.select_one("h3")
79
  price_el = product.select_one("span.final-price")
80
+ link_el = product.select_one("a")
81
+ img_el = product.select_one("img")
82
 
83
  products.append({
84
+ "name": name_el.get_text(strip=True) if name_el else "N/A",
85
  "price": price_el.get_text(strip=True) if price_el else "N/A",
86
+ "img": img_el["src"] if img_el else "",
87
+ "link": "https://www.netmeds.com" + link_el["href"] if link_el else ""
88
  })
89
  return products
90
 
91
+
92
  def scrape_pharmeasy(query):
93
  print(f"Scraping PharmEasy for query: {query}")
94
+ url = f"https://pharmeasy.in/search/all?name={quote_plus(query)}"
95
  soup = fetch_soup(url)
96
 
97
  products = []
98
  for product in soup.select("div.ProductCard_medicineUnitContainer__m2_zO"):
99
+ name_el = product.select_one("h1")
100
  price_el = product.select_one("div.ProductCard_ourPrice__yU5GB")
101
+ link_el = product.select_one("a")
102
+ img_el = product.select_one("img")
103
 
104
  products.append({
105
+ "name": name_el.get_text(strip=True) if name_el else "N/A",
106
  "price": price_el.get_text(strip=True) if price_el else "N/A",
107
+ "img": img_el["src"] if img_el else "",
108
+ "link": "https://pharmeasy.in" + link_el["href"] if link_el else ""
109
  })
110
  return products
111
 
112
 
113
  def search_product(query):
114
+ amazon_products = [{"source": "Amazon", **p} for p in scrape_amazon(query)]
115
+ one_mg_products = [{"source": "1mg", **p} for p in scrape_1mg(query)]
116
+ netmeds_products = [{"source": "Netmeds", **p} for p in scrape_netmeds(query)]
117
+ pharmeasy_products = [{"source": "PharmEasy", **p} for p in scrape_pharmeasy(query)]
118
 
119
  combined = []
120
+ max_len = max(len(amazon_products), len(one_mg_products), len(netmeds_products), len(pharmeasy_products))
 
121
 
122
  for i in range(max_len):
123
  combined.append({
 
125
  amazon_products[i]["name"] if i < len(amazon_products) else
126
  one_mg_products[i]["name"] if i < len(one_mg_products) else
127
  netmeds_products[i]["name"] if i < len(netmeds_products) else
128
+ pharmeasy_products[i]["name"] if i < len(pharmeasy_products) else ""
 
129
  ),
130
  "img": (
131
  amazon_products[i]["img"] if i < len(amazon_products) else
132
  one_mg_products[i]["img"] if i < len(one_mg_products) else
133
  netmeds_products[i]["img"] if i < len(netmeds_products) else
134
+ pharmeasy_products[i]["img"] if i < len(pharmeasy_products) else ""
 
135
  ),
136
  "amazon": amazon_products[i] if i < len(amazon_products) else {},
137
  "one_mg": one_mg_products[i] if i < len(one_mg_products) else {},
 
143
 
144
 
145
  def search_product_with_progress(query):
146
+ combined = search_product(query)
 
 
 
 
 
 
 
 
 
 
 
 
147
 
148
+ # Fetch side effects using OpenFDA API
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
  api_url = f'https://api.fda.gov/drug/event.json?api_key=ah8n0nI6468qpS6cMfqvBM0sdGs4nO1sT3Ie7LjJ&search=patient.drug.medicinalproduct:"{query}"'
150
+
151
  try:
152
  response = requests.get(api_url)
153
  data = response.json()
 
159
  else:
160
  side_effects = ["No side effects found."]
161
  except Exception as e:
162
+ print(f"Error fetching side effects: {e}")
163
+ side_effects = ["Error fetching side effects."]
164
 
165
+ return combined, side_effects