How can I copy data from an external HDD that is about to fail?

I would try using rsync from the command line.

rsync -av --ignore-errors /Volumes/failingDrive/ /Volumes/brandNewDrive

should do the trick. Mind the trailing / at the end of the source. Rsync will not copy files it finds on the destination, so if you call it a second time it will continue where it left off.