0

各メールアドレスのホスト名の列を持つパンダデータフレームがあります( 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)

しかし、私は並列関数にかなり慣れていないので、それもうまくいきませんでした。複数のエラーがあり、このホスト名がすでにチェックされているかどうかを最初にチェックして、リクエスト全体をもう一度スキップできれば、はるかに有益であると思います。実際にメールを送信せずに、できる限り行きたいと思います。

これを達成するためのライブラリまたは方法はありますか? これまでのところ、この問題の適切な解決策を見つけることができませんでした。

4

2 に答える 2