【发布时间】:2017-12-12 08:25:35
【问题描述】:
为了抓取 URL 池,我使用 joblib 并行处理 selenium。在这种情况下,我面临两个挑战:
- 挑战 1 是加快这一进程。目前,我的代码为每个 URL 打开和关闭一个驱动程序实例(理想情况下每个进程都有一个)
- 挑战 2 是摆脱 CPU 密集型 while 循环,我认为我需要
continue处理空结果(我知道这很可能是错误的)
伪代码:
URL_list = [URL1, URL2, URL3, ..., URL100000] # List of URLs to be scraped
def scrape(URL):
while True: # Loop needed to use continue
try: # Try scraping
driver = webdriver.Firefox(executable_path=path) # Set up driver
website = driver.get(URL) # Get URL
results = do_something(website) # Get results from URL content
driver.close() # Close worker
if len(results) == 0: # If do_something() failed:
continue # THEN Worker to skip URL
else: # If do_something() worked:
safe_results("results.csv") # THEN Save results
break # Go to next worker/URL
except Exception as e: # If something weird happens:
save_exception(URL, e) # THEN Save error message
break # Go to next worker/URL
Parallel(n_jobs = 40)(delayed(scrape)(URL) for URL in URL_list))) # Run in 40 processes
我的理解是,为了跨迭代重用驱动程序实例,# Set up driver-line 需要放在scrape(URL) 之外。但是,scrape(URL) 之外的所有内容都无法找到 joblib 的Parallel(n_jobs = 40)。这意味着您不能在使用 joblib 进行抓取时重用驱动程序实例,这是不正确的。
Q1:上例并行处理时如何复用驱动实例?
Q2:如何在保持上述示例中的功能的同时摆脱while循环?
注意:firefox_profile 中禁用了 Flash 和图像加载(代码未显示)
【问题讨论】:
标签: python selenium screen-scraping joblib