BS4 MemoryError:堆栈溢出和EOFError:在python中使用多处理时输入不足
我有一个简单的python脚本,它利用python的BS4库和多处理来执行一些web抓取。我最初遇到一些错误,脚本无法完成,因为我会超过递归限制,但后来我发现BeautifulSoup树无法被pickle,因此导致多处理问题,因此我在顶部答案中遵循了一条建议,即执行以下操作:BS4 MemoryError:堆栈溢出和EOFError:在python中使用多处理时输入不足,python,python-3.x,beautifulsoup,multiprocessing,Python,Python 3.x,Beautifulsoup,Multiprocessing,我有一个简单的python脚本,它利用python的BS4库和多处理来执行一些web抓取。我最初遇到一些错误,脚本无法完成,因为我会超过递归限制,但后来我发现BeautifulSoup树无法被pickle,因此导致多处理问题,因此我在顶部答案中遵循了一条建议,即执行以下操作:sys.setrecursionlimit(25000) 这在几周内运行良好,没有出现任何问题(据我所知),但今天我重新启动了脚本,一些进程不起作用,我得到的错误如下所示: 我现在得到这个错误: Traceback (mos
sys.setrecursionlimit(25000)
这在几周内运行良好,没有出现任何问题(据我所知),但今天我重新启动了脚本,一些进程不起作用,我得到的错误如下所示:
我现在得到这个错误:
Traceback (most recent call last):
File "C:/Users/user/PycharmProjects/foo/single_items/single_item.py", line 243, in <module>
Process(target=instance.constant_thread).start()
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\process.py", line 112, in start
self._popen = self._Popen(self)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\context.py", line 223, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\context.py", line 322, in _Popen
return Popen(process_obj)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\popen_spawn_win32.py", line 89, in __init__
reduction.dump(process_obj, to_child)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\bs4\element.py", line 1449, in __getattr__
"'%s' object has no attribute '%s'" % (self.__class__, tag))
MemoryError: stack overflow
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\spawn.py", line 105, in spawn_main
exitcode = _main(fd)
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\spawn.py", line 115, in _main
self = reduction.pickle.load(from_parent)
EOFError: Ran out of input
更新1:
似乎每次崩溃时都是相同的url,即使每个url(看起来)与未崩溃的url具有相同的HTML格式。我在
中看到了一些问题,而。什么时候停止?它将继续调用make\u get\u request
,直到python程序内存耗尽。您能解释一下吗?请求是同步(而非异步)发出的,因此理论上在前一个请求完成之前不应该发出任何请求(由于while
循环)。任何时候发出的请求数都不会超过创建的进程数,这是在while循环之外决定的。您能举一个失败的URL的例子吗?问题可能与该页面的HTML结构有关。另外,您使用什么代码进行酸洗/取消酸洗?你是直接从漂亮的汤中腌制汤,还是别的什么?如果您提供重现您的问题的代码,将最容易帮助您。
class foo:
def __init__(url):
self.url = url
def constant_scrape:
while True:
rq = make_get_request(self.url)
soup = BeautifulSoup(rq)
if __name__ == '__main__':
sys.setrecursionlimit(25000)
url_list = [...]
for url in url_list:
instance = foo(url)
Process(target=instance.constant_scrape).start()