各メールアドレスのホスト名の列を持つパンダデータフレームがあります( 1000行以上):
email hostname
email@example.com example.com
email2@example.com example.com
email@example2.com example2.com
email@example3.com example3.com
各ホスト名を調べて、それが本当に存在するかどうかを確認したいと思います。
email hostname valid_hostname
email@example.com example.com True
email2@example.com example.com False
email@example2.com example2.com False
email@example3.com example3.com False
まず、各メール アドレスのホスト名を抽出しました。
df['hostname'] = df['email'].str.split('@').str[1]
次に、 を使用して DNS を確認しようとしましたpyIsEmail
が、遅すぎました。
from pyisemail import is_email
df['valid_hostname'] = df['hostname'].apply(lambda x: is_email(x, check_dns=True))
次に、マルチスレッド関数を試しました:
import requests
from requests.exceptions import ConnectionError
def validate_hostname_existence(hostname:str):
try:
response = requests.get(f'http://{hostname}', timeout=0.5)
except ConnectionError:
return False
else:
return True
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor() as executor:
df['valid_hostname'] = pd.Series(executor.map(validate_hostname_existence, df['hostname']),index=df['hostname'].index)
しかし、私は並列関数にかなり慣れていないので、それもうまくいきませんでした。複数のエラーがあり、このホスト名がすでにチェックされているかどうかを最初にチェックして、リクエスト全体をもう一度スキップできれば、はるかに有益であると思います。実際にメールを送信せずに、できる限り行きたいと思います。
これを達成するためのライブラリまたは方法はありますか? これまでのところ、この問題の適切な解決策を見つけることができませんでした。