我目前正在进行一个数据抓取项目,该项目要求我在每个循环中加载和保存数据。你可能想知道我为什么要那样做?好吧,之前我在每个循环之间都没有加载和保存数据,如果脚本在上一次迭代之前的任何地方崩溃(每次都是由于超时、奇怪的URL或任何你能想象到的原因(,我就会丢失所有数据。
总的来说,目前应用的方法运行良好,但在大约20k次迭代后,我的存储文件长度增加到了~90mb,导致脚本变得越来越慢,迫使我创建一个新的数据保存文件。下面的代码显示了我的脚本的基本功能。
import numpy as np
#List with URLS to scrape (220k URLS)
URLS = np.load("/some_directory/URLS.npy").tolist()
#Already checked URLS
Checked_URLS=np.load("/some_directory/checked_URLS.npy").tolist()
#Perform scraping and add new URL to checked list
for i in URLS:
if i not in Checked_URLS:
Checked_already.append(i)
np.save("some_directory/checked_URLS.npy", Checked_already)
NEW_DATA=Bunch_of_scraping_code
#Load numpy list with data collected from previous URLS
#Append new scraping data and save list
FOUND_DATA=np.load("/some_directory/FOUND_DATA.npy", allow_pickle=True).tolist()
FOUND_DATA.append(NEW_DATA)
np.save("some_directory/FOUND_DATA.npy", LOT_DATA)
我相信一定有一种更python的方式,不需要在每个循环中将整个列表加载到python中?或者也许是另一种完全不需要写作的方式?我将列表写入.npy,因为据我所知,这是解析大型列表文件的最有效方法。
我曾试图将我的数据直接保存到熊猫中,但这让一切变得更糟、更慢。我们将感谢所有的帮助!
我认为更有效的方法是包装可能与try/except
一起崩溃的代码,并记录有问题的URL以供进一步调查,而不是一遍又一遍地重复相同的操作:
for url in URLS:
try:
FOUND_DATA=np.load("/some_directory/FOUND_DATA.npy", allow_pickle=True).tolist()
FOUND_DATA.append(NEW_DATA)
except Exception as ex:
# for any reason the code crashes, the following message will be printed and the loop will continue
print(f"Failed to process url: {url})