我在抓取一个网站,其中包含几十个基本网址,最终链接到我解析的数千个xml页面,并转化为Pandas数据框,最终保存到SQLite数据库。我多处理下载/解析阶段以节省时间,但脚本在一定数量的页面(不知道多少;介于100和200之间)后静静地挂起(停止收集页面或解析XML)。Web scraper在多处理时静静地挂起
使用相同的解析器,但一切顺序(没有多处理)没有给出任何问题,所以我怀疑我在做多处理错误。也许是创建了Parse_url类的过多实例并堵塞了内存?
下面是过程的概述:
engine = create_engine('sqlite:///path_to_db') # sqlalchemy
class Parse_url():
def __init__(self, url):
self.url = url
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
return True
def parse(self):
# parse xml, return dataframes
def collect_xml_links(start_url):
# collect and return a list of links to XML pages on this starting URL
def parse_urls(url):
with Parse_url(url) as parser:
collection_of_dfs = parser.parse()
return collection_of_dfs
def write_info_to_sql(result, db_name, engine):
# write info to SQLite database
start_urls = [url1, url2, url3, ... ]
with Pool(4) as pool:
results = pool.map(collect_xml_links, start_urls)
for urls in results:
url_list.extend(urls) # This works and returns urls
for i in range(0, len(url_list), 50): # Chunks of 50 to report progress
url_list_slice = url_list[i:i+50]
with Pool(4) as pool:
results = pool.map(parse_urls, url_list_slice)
for result in results:
write_info_to_sql(result, db_name, engine)
当脚本挂起,它似乎总是有类似的页数刮这样做,但我不能肯定它是否完全相同。杀死该脚本会产生无益的回溯,指向results = pool.map(parse_urls, url_list_slice)
行。
我的多重处理设置有一个明显的问题吗?是否有可能生成Parse_url类的太多实例?
我没有看到任何地方定义'collect_xml_links'或'start_urls' ... – pstatix
在哪里修复?仍然没有'def collect_xml_links'或可迭代的'start_urls'。 – pstatix
猜测类实例正在积累,我在'write_info_to_sql(result,db_name,engine)'后面添加了 'del(result)'。这似乎已经解决了挂起,但我想知道是否有更好的解决方案 – iayork