首页 > 解决方案 > 在另一个函数中调用 2 个函数

问题描述

我试图在一个函数中调用 extract 函数和 extract_url 函数。我知道name error: name 'endpoint' and name 'agg_key' is not defined.我正在这样做,所以我可以从另一个脚本调用一个脚本,所以我不需要运行命令行。我该怎么做呢?

我试图调用的函数:

def scrape_all_products(URL):
    extract(endpoint, agg_key, page_range=None)
    extract_url(args)

我正在调用的函数:

def extract(endpoint, agg_key, page_range=None):
r_list = list(range(page_range[0], page_range[1]+1)) if page_range else []
page = 1
agg_data = []

while True:
    page_endpoint = endpoint + f'?page={str(page)}'
    response = requests.get(page_endpoint, timeout=(
        int(os.environ.get('REQUEST_TIMEOUT', 0)) or 10))
    response.raise_for_status()
    if response.url != page_endpoint:  # to handle potential redirects
        p_endpoint = urlparse(response.url)  # parsed URL
        endpoint = p_endpoint.scheme + '://' + p_endpoint.netloc + p_endpoint.path
    if not response.headers['Content-Type'] == 'application/json; charset=utf-8':
        raise Exception('Incorrect response content type')
    data = response.json()
    page_has_products = agg_key in data and len(
        data[agg_key]) > 0

    page_in_range = page in r_list or page_range is None

    # break loop if empty or want first page
    if not page_has_products or not page_in_range:
        break
    agg_data += data[agg_key]
    page += 1
return agg_data

其他功能:

def extract_url(args):
p = format_url(args.url, scheme='https', return_type='parse_result')

formatted_url = p.geturl()
agg_key = 'products'
if args.collections:
    agg_key = 'collections'
fp = os.path.join(
    args.dest_path, f'{p.netloc}.{agg_key}.{args.output_type}')

if args.file_path:
    fp = os.path.join(
        args.dest_path, f'{args.file_path}.{args.output_type}')

endpoint = f'{formatted_url}/{agg_key}.json'
ret = {
    'endpoint_attempted': endpoint,
    'collected_at': str(datetime.now()),
    'success': False,
    'error': ''
}
try:
    data = extract(endpoint, agg_key, args.page_range)

except requests.exceptions.HTTPError as err:
    ret['error'] = str(err)
except json.decoder.JSONDecodeError as err:
    ret['error'] = str(err)
except Exception as err:
    ret['error'] = str(err)
else:
    ret['success'] = True
    ret[agg_key] = data

if ret['success']:
    ret['file_path'] = str(fp)
    save_to_file(fp, data, args.output_type)
return ret

标签: python

解决方案


scrape_all_products函数只知道在该函数内部创建的变量和传递给它的变量(在这种情况下是URL)。endpoint并且agg_key都是在不同的函数内部创建的。您必须以与传递scrape_all_products相同的方式传递这些变量URL。这样做:

def scrape_all_products(URL, endpoint, agg_key, args):

然后你必须适当地修改任何scrape_all_products被调用的地方。


推荐阅读