TensorFlow doesn’t understand HTTP urls:
raw = tf.io.read_file(features["URL"])

UnimplementedError: File system scheme 'https' not implemented ...

With the filesystem-plugins, that might be possible. So I think you do need the py_function here.  “ignore_errors” or returning an empty result still sounds like the solution.

won’t scale when you have millions of URLs.

At least waiting for IO is something python threads can do in parallel.
with futures.ThreadPoolExecutor() as ex:
       executor.map(_maybe_fetch, urls)

Either way this sounds like something you’ll want to do once and cache the result, like with Dataset.snapshot, no?