Bubbles30 commited on
Commit
0e6dd53
·
verified ·
1 Parent(s): ce087ad

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +29 -44
app.py CHANGED
@@ -95,70 +95,55 @@ def read_links_from_workbook(path):
95
  tasks.append((code, str(val).strip(), f"_{i}"))
96
  return tasks
97
 
98
- def download_image(url, out_path, fail_log, code, suf):
 
 
 
 
99
  def log(msg):
100
  entry = f"{code}{suf}: {msg}"
101
  print(entry)
102
- with open(fail_log, "a") as f:
103
- f.write(entry + "\n")
104
 
105
  parsed = urlparse(url)
106
  referer = f"{parsed.scheme}://{parsed.netloc}/"
107
- headers = random_headers(referer)
 
 
 
 
108
 
109
  log(f"Starting download: {url}")
110
 
111
- # Try requests direct download
112
  try:
113
- r = requests.get(url, headers=headers, stream=True, timeout=30)
114
  r.raise_for_status()
115
  if "image" in r.headers.get("Content-Type", "").lower():
116
  with open(out_path, "wb") as f:
117
  for chunk in r.iter_content(8192):
118
  f.write(chunk)
119
  return True
120
- log(f"Requests non-image content-type: {r.headers.get('Content-Type')}")
 
121
  except Exception as e:
122
- log(f"Requests error: {e}")
123
 
124
- # Selenium fallback (headless)
125
- driver = None
126
  try:
127
- opts = Options()
128
- opts.add_argument("--headless")
129
- opts.add_argument("--disable-gpu")
130
- opts.add_argument("--no-sandbox")
131
- opts.add_argument(f"user-agent={headers['User-Agent']}")
132
- opts.add_argument("--disable-dev-shm-usage")
133
-
134
- driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opts)
135
- driver.set_page_load_timeout(30)
136
- driver.get(url)
137
- time.sleep(5) # let JS/images load
138
-
139
- img_el = driver.find_element("tag name", "img")
140
-
141
- data_url = driver.execute_script("""
142
- const img = arguments[0];
143
- const c = document.createElement('canvas');
144
- c.width = img.naturalWidth;
145
- c.height = img.naturalHeight;
146
- c.getContext('2d').drawImage(img, 0, 0);
147
- return c.toDataURL('image/png');
148
- """, img_el)
149
-
150
- header, b64 = data_url.split(",", 1)
151
- import base64
152
- raw = base64.b64decode(b64)
153
- with open(out_path, "wb") as f:
154
- f.write(raw)
155
- return True
156
-
157
  except Exception as e:
158
- log(f"Selenium error: {e}")
159
- finally:
160
- if driver:
161
- driver.quit()
162
 
163
  log("Download failed for all methods")
164
  return False
 
95
  tasks.append((code, str(val).strip(), f"_{i}"))
96
  return tasks
97
 
98
+ def download_image(url, out_path, failures, code, suf, fail_lock):
99
+ from urllib.parse import urlparse
100
+ import cloudscraper
101
+ import traceback
102
+
103
  def log(msg):
104
  entry = f"{code}{suf}: {msg}"
105
  print(entry)
106
+ with fail_lock:
107
+ failures.append(entry)
108
 
109
  parsed = urlparse(url)
110
  referer = f"{parsed.scheme}://{parsed.netloc}/"
111
+ headers = {
112
+ "User-Agent": random.choice(USER_AGENTS),
113
+ "Referer": referer,
114
+ "Accept": "image/webp,image/apng,image/*,*/*;q=0.8",
115
+ }
116
 
117
  log(f"Starting download: {url}")
118
 
119
+ # 1) Direct requests
120
  try:
121
+ r = requests.get(url, headers=headers, stream=True, timeout=30, verify=False)
122
  r.raise_for_status()
123
  if "image" in r.headers.get("Content-Type", "").lower():
124
  with open(out_path, "wb") as f:
125
  for chunk in r.iter_content(8192):
126
  f.write(chunk)
127
  return True
128
+ else:
129
+ log(f"Requests non-image content-type: {r.headers.get('Content-Type')}")
130
  except Exception as e:
131
+ log(f"Requests error: {e}\n{traceback.format_exc()}")
132
 
133
+ # 2) cloudscraper fallback
 
134
  try:
135
+ scraper = cloudscraper.create_scraper(browser={"browser":"chrome","platform":"windows"})
136
+ r = scraper.get(url, headers=headers, stream=True, timeout=30)
137
+ r.raise_for_status()
138
+ if "image" in r.headers.get("Content-Type", "").lower():
139
+ with open(out_path, "wb") as f:
140
+ for chunk in r.iter_content(8192):
141
+ f.write(chunk)
142
+ return True
143
+ else:
144
+ log(f"Cloudscraper non-image content-type: {r.headers.get('Content-Type')}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
  except Exception as e:
146
+ log(f"Cloudscraper error: {e}\n{traceback.format_exc()}")
 
 
 
147
 
148
  log("Download failed for all methods")
149
  return False