Ddrescue can perform a sector-by-sector clone of a drive with bad sectors. It maintains a log so that it can resume after an interruption. Ddrescue clones the easy sectors on the first pass and then tries for the more difficult ones on subsequent passes.
Obviously ddrescue won't be able to read any sector that is truly bad, but you could try different physical orientations of your drive (vertical, upside down, on end), and you could try cooling the HDD with a fan.
If it is a late model WD or Seagate drive, then try cleaning the oxidisation off the head contacts on the PCB by gently rubbing them with a soft white pencil eraser.
ALternatively, if you wish to recover individual files, then try Bad Block Copy for Windows:
http://alter.org.ua/soft/win/bb_recover/