优化App Store Scraper遍历国家代码时的性能问题
优化App Store播客评论爬取速度:跳过无评论国家的重试
我用App Store Scraper爬取苹果播客评论时,遍历全国家代码列表遇到了速度瓶颈——无评论的国家会触发库默认的20次重试,导致整体耗时过长。try-except无法提前终止重试,因为重试逻辑是库内部实现的。下面提供两种可行的优化方案:
方案一:修改库的默认重试次数(快速解决)
App Store Scraper的Base类默认设置了retries=20,我们可以通过猴子补丁全局修改重试次数,让首次请求失败后直接跳过,无需等待多次重试。
from app_store_scraper import Podcast from app_store_scraper.base import Base # 将默认重试次数改为1(首次失败即停止) Base.retries = 1 # 原有遍历逻辑 app_id = 1614435903 app_name = '28ish-days-later' countries = ["DZ", "AO", "AI", "AR", "AM", "AU", "AT", "AZ", "BH", "BB", "BY", "BE", "BZ", "BM", "BO", "BW", "BR", "VG", "BN", "BG", "CA", "KY", "CL", "CN", "CO", "CR", "HR", "CY", "CZ", "DK", "DM", "EC", "EG", "SV", "EE", "FI", "FR", "DE", "GH", "GB", "GR", "GD", "GT", "GY", "HN", "HK", "HU", "IS", "IN", "ID", "IE", "IL", "IT", "JM", "JP", "JO", "KE", "KW", "LV", "LB", "LT", "LU", "MO", "MG", "MY", "ML", "MT", "MU", "MX", "MS", "NP", "NL", "NZ", "NI", "NE", "NG", "NO", "OM", "PK", "PA", "PY", "PE", "PH", "PL", "PT", "QA", "MK", "RO", "RU", "SA", "SN", "SG", "SK", "SI", "ZA", "KR", "ES", "LK", "SR", "SE", "CH", "TW", "TZ", "TH", "TN", "TR", "UG", "UA", "AE", "US", "UY", "UZ", "VE", "VN", "YE"] for c in countries: sysk = Podcast(country=c, app_name=app_name, app_id=app_id) try: sysk.review() print(f"No. of reviews found for country {c}: {sysk.reviews_count}") # 这里可添加评论保存逻辑 except Exception as e: print(f"Skip country {c}: {str(e)}")
说明:如果希望完全不重试,可将Base.retries设为0。此方法无需修改库源码,全局生效,能直接减少无评论国家的等待时间。
方案二:预筛选有评论的国家(更稳妥)
先对所有国家发起一次仅请求1条评论的快速检测,筛选出有评论的国家后,再遍历精简列表爬取全量评论,彻底跳过无评论国家的请求消耗。
from app_store_scraper import Podcast app_id = 1614435903 app_name = '28ish-days-later' all_countries = ["DZ", "AO", "AI", "AR", "AM", "AU", "AT", "AZ", "BH", "BB", "BY", "BE", "BZ", "BM", "BO", "BW", "BR", "VG", "BN", "BG", "CA", "KY", "CL", "CN", "CO", "CR", "HR", "CY", "CZ", "DK", "DM", "EC", "EG", "SV", "EE", "FI", "FR", "DE", "GH", "GB", "GR", "GD", "GT", "GY", "HN", "HK", "HU", "IS", "IN", "ID", "IE", "IL", "IT", "JM", "JP", "JO", "KE", "KW", "LV", "LB", "LT", "LU", "MO", "MG", "MY", "ML", "MT", "MU", "MX", "MS", "NP", "NL", "NZ", "NI", "NE", "NG", "NO", "OM", "PK", "PA", "PY", "PE", "PH", "PL", "PT", "QA", "MK", "RO", "RU", "SA", "SN", "SG", "SK", "SI", "ZA", "KR", "ES", "LK", "SR", "SE", "CH", "TW", "TZ", "TH", "TN", "TR", "UG", "UA", "AE", "US", "UY", "UZ", "VE", "VN", "YE"] valid_countries = [] # 第一步:预筛选有评论的国家 for c in all_countries: try: sysk = Podcast(country=c, app_name=app_name, app_id=app_id) sysk.review(how_many=1) # 仅请求1条评论,快速验证 if sysk.reviews_count > 0: valid_countries.append(c) print(f"Country {c} has reviews, added to valid list") else: print(f"Country {c} has no reviews, skipped") except Exception as e: print(f"Country {c} request failed, skipped: {str(e)}") print(f"Total valid countries with reviews: {len(valid_countries)}") # 第二步:遍历有效国家爬取全量评论 path_out = "podcast_reviews" filename_csv = f'{app_name}_reviews_table.csv' file_csv = f"{path_out}/{filename_csv}" # 修正路径拼接逻辑 for c in valid_countries: sysk = Podcast(country=c, app_name=app_name, app_id=app_id) sysk.review() # 爬取全部评论 print(f"Fetched {sysk.reviews_count} reviews for country {c}") # 示例:用pandas保存评论到CSV # import pandas as pd # df = pd.DataFrame(sysk.reviews) # df.to_csv(file_csv, mode='a', header=False, index=False)
说明:预筛选阶段请求量极小,速度极快;筛选后仅处理有评论的国家,完全避免了无评论国家的重试等待。建议结合方案一的重试次数修改,进一步提升预筛选效率。
内容的提问来源于stack exchange,提问作者OnceUponATime
相关产品推荐
相关产品推荐

