我正在学习Python 4/5个月,这是我从零开始构建的第三个项目,但我不能自己解决这个问题。
此脚本为每个给定的url下载1个图像。我不能找到一个解决方案,如何实现线程池执行器或异步在这个脚本。我不知道如何链接与图像编号的url保存图像部分。我建立了我需要下载的所有网址的判决,但我实际上如何保存正确名称的图像?还有其他建议吗?
另外,目前的网址都是假的。
同步版本:
import requests import argparse import re import os import logging from bs4 import BeautifulSoup parser = argparse.ArgumentParser() parser.add_argument("-n", "--num", help="Book number", type=int, required=True) parser.add_argument("-p", dest=r"path_name", default=r"F:\Users\123", help="Save to dir", ) args = parser.parse_args() logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.ERROR) logger = logging.getLogger(__name__) def get_parser(url_c): url = f'https://test.net/g/{url_c}/1' logger.info(f'Main url: {url_c}') responce = requests.get(url, timeout=5) # timeout will raise an exeption if responce.status_code == 200: page = requests.get(url, timeout=5).content soup = BeautifulSoup(page, 'html.parser') return soup else: responce.raise_for_status() def get_locators(soup): # take get_parser # Extract first/last page num first = int(soup.select_one('span.current').string) logger.info(f'First page: {first}') last = int(soup.select_one('span.num-pages').string) + 1 # Extract img_code and extension link = soup.find('img', {'class': 'fit-horizontal'}).attrs["src"] logger.info(f'Locator code: {link}') code = re.search('galleries.([0-9]+)\/.\.(\w{3})', link) book_code = code.group(1) # internal code extension = code.group(2) # png or jpg # extract Dir book name pattern = re.compile('pretty":"(.*)"') found = soup.find('script', text=pattern) string = pattern.search(found.text).group(1) dir_name = string.split('"')[0] logger.info(f'Dir name: {dir_name}') logger.info(f'Hidden code: {book_code}') print(f'Extension: {extension}') print(f'Tot pages: {last}') print(f'') return {'first_p': first, 'last_p': last, 'book_code': book_code, 'ext': extension, 'dir': dir_name } def setup_download_dir(path, dir): # (args.path_name, locator['dir']) # Make folder if it not exist filepath = os.path.join(f'{path}\{dir}') if not os.path.exists(filepath): try: os.makedirs(filepath) print(f'Directory created at: {filepath}') except OSError as err: print(f"Can't create {filepath}: {err}") return filepath def main(locator, filepath): for image_n in range(locator['first_p'], locator['last_p']): url = f"https://i.test.net/galleries/{locator['book_code']}/{image_n}.{locator['ext']}" logger.info(f'Url Img: {url}') responce = requests.get(url, timeout=3) if responce.status_code == 200: img_data = requests.get(url, timeout=3).content else: responce.raise_for_status() # raise exepetion with open((os.path.join(filepath, f"{image_n}.{locator['ext']}")), 'wb') as handler: handler.write(img_data) # write image print(f'Img {image_n} - DONE') if __name__ == '__main__': try: locator = get_locators(get_parser(args.num)) # args.num ex. 241461 main(locator, setup_download_dir(args.path_name, locator['dir'])) except KeyboardInterrupt: print(f'Program aborted...' + '\n')
URL列表:
def img_links(locator): image_url = [] for num in range(locator['first_p'], locator['last_p']): url = f"https://i.test.net/galleries/{locator['book_code']}/{num}.{locator['ext']}" image_url.append(url) logger.info(f'Url List: {image_url}') return image_url
我在《流畅的python》一书中找到了解决方案。下面是代码片段:
def download_many(cc_list, base_url, verbose, concur_req): counter = collections.Counter() with futures.ThreadPoolExecutor(max_workers=concur_req) as executor: to_do_map = {} for cc in sorted(cc_list): future = executor.submit(download_one, cc, base_url, verbose) to_do_map[future] = cc done_iter = futures.as_completed(to_do_map) if not verbose: done_iter = tqdm.tqdm(done_iter, total=len(cc_list)) for future in done_iter: try: res = future.result() except requests.exceptions.HTTPError as exc: error_msg = 'HTTP {res.status_code} - {res.reason}' error_msg = error_msg.format(res=exc.response) except requests.exceptions.ConnectionError as exc: error_msg = 'Connection error' else: error_msg = '' status = res.status if error_msg: status = HTTPStatus.error counter[status] += 1 if verbose and error_msg: cc = to_do_map[future] print('*** Error for {}: {}'.format(cc, error_msg)) return counter
问题内容: 我想同时下载一些文件,例如100个文件。因此,我决定将下载线程添加到调度队列中,GCD会调整同时运行多少个线程。 这里的问题是:中的块将立即完成,因为它将在另一个线程上运行。因此,如果长度为100,它将立即创建100个线程。 如何配置块以等待下载任务完成?我不想使用,因为它只允许同时运行一个下载任务。 问题答案: 要扩展Abhinav的答案,您应该: 使用创建一个组。 在开始每个下载任
问题内容: 我想使用jQuery在页面上异步加载外部图像, 并且尝试了以下方法: 但是它总是返回错误,是否有可能像这样加载图像? 我尝试使用method,但是它有效,但是我不知道如果图像不可用,如何设置超时时间(404)。我怎样才能做到这一点? 问题答案: 无需ajax。您可以创建一个新的图像元素,设置其source属性,并在完成加载后将其放置在文档中的某个位置:
问题内容: 我想给旋转的gif图像供用户使用jquery进行ajax调用时知道发生了什么。我必须使用async:false,因为否则代码会造成混乱,并且最终会导致会话变量变坏。这是我所拥有的(直到呼叫冻结屏幕后才显示gif。) 在这种情况下,我只希望foo = bar时异步。谁能让我知道为什么在调用之后加载spinner.gif。我认为这可能是因为微调器不在其他任何地方,并且加载时有所延迟,但是当
问题内容: 我有一个用代码创建的(没有): 在另一堂课中,我有一个扩展方法来下载图像异步: 我在其他地方使用了此功能并正常工作,根据我的日志,我了解到下载的图像没有问题(渲染单元时),下载图像后,单元UI未更新。 我也尝试使用像Haneke这样的缓存库,但是问题存在并且没有改变。 请帮助我理解错误 谢谢 问题答案: 设置图像后,您应该致电 编辑:从改正为
问题内容: 我正在尝试使用我的应用程序中的URL和按钮下载图像。当我在手机上运行它时,我无法下载该图像。任何人都可以指出这个问题。我在这里先向您的帮助表示感谢 :) 这是我的代码。 问题答案: 您可以通过两种方式从url下载图像 1。您 可以使用Glide库从url加载图像,看下面的代码,它可以轻松地为您提供帮助 编译这个库 而不是像这样加载图像 2。如果您不想使用第三方库,请尝试此 创建一个异步
如果可能,也指出解决方案 我的代码: 错误: 回溯(最近一次调用):文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py”,第1318行,do_open encode_chunked=req。has_header('Transfer-encoding'))文件“/Library/Fr