Массовый поиск в Whois из 20000 доменов - получение тайм-аутов

Я пытаюсь НАБЛЮДАТЬ извлечение информации WHOIS для 20 000 доменных имен, код python работает с 2 элементами в моем файле CSV, но приносит ошибку со всем набором данных из 20000 доменных имен

попробовал с 2 доменными именами, ок. использование полного списка 20k доменных имен приводит к ошибкам

import whois
import matplotlib.pyplot as plt
import numpy as np  
import pandas as pd  
import socket
import os
import csv 
import datetime
import time
import requests
from ipwhois import IPWhois
from urllib import request
from ipwhois.utils import get_countries
import tldextract
from ipwhois.utils import get_countries
countries = get_countries(is_legacy_xml=True)
from ipwhois.experimental import bulk_lookup_rdap
from ipwhois.hr import (HR_ASN, HR_ASN_ORIGIN, HR_RDAP_COMMON, HR_RDAP, HR_WHOIS, HR_WHOIS_NIR)
countries = get_countries(is_legacy_xml=True)
import ipaddress

df = pd.read_csv('labelled_dataset.csv')

#TimeOut Setting
s = socket.socket()
s.settimeout(10)

#Date Processing Function

def check_date_type(d):
    if type(d) is datetime.datetime:
        return d
    if type(d) is list:
        return d[0]
for index,row in df.iterrows():

    DN = df.iloc[index]['Domains']

    df['IPaddr'] = socket.gethostbyname(DN)
    df['IPcity'] = IPWhois(socket.gethostbyname(DN),     allow_permutations=True).lookup_whois()['nets'][0]['city']
    df['ASNumber'] = IPWhois(socket.gethostbyname(DN), allow_permutations=True).lookup_whois()['asn']
    df['NetAddr'] = IPWhois(socket.gethostbyname(DN), allow_permutations=True).lookup_whois()['nets'][0]['address']
    df['NetCity'] = IPWhois(socket.gethostbyname(DN), allow_permutations=True).lookup_whois()['nets'][0]['city']
    df['NetPostCode'] = IPWhois(socket.gethostbyname(DN), allow_permutations=True).lookup_whois()['nets'][0]['postal_code']
    W = whois.whois(DN)
    df['WebsiteName'] = W.name
    df['ASRegistrar'] = W.registrar
    df['CtryCode'] = W.country
    df['Dstatus'] = W.status[1]
    df['RegDate'] = check_date_type(W.creation_date)
    df['ExDate'] = check_date_type(W.expiration_date)

df.to_csv('extracted_dataset_1_1.csv', index=False)

Ожидайте выдачу сведений ASN, информации WHOIS по доменному имени, экспортированной в CSV-файл

1 ответ

Вы создаете новый объект IPWhois для каждого свойства, которое вы ищете. Это означает, что вы выполняете не менее 5 запросов whois на одну итерацию.

Это будет генерировать большой сетевой трафик и совершенно не нужно - вы можете просто запустить whois один раз на домен и получить доступ к результатам в качестве членов.

Попробуйте изменить код в вашем цикле на что-то вроде этого:

df['IPaddr'] = socket.gethostbyname(DN)
ipwhois = IPWhois(df['IPaddr'], allow_permutations=True).lookup_whois()
if (ipwhois):
  df['IPcity'] = ipwhois['nets'][0]['city']
  df['ASNumber'] = ipwhois['asn']
  df['NetAddr'] = ipwhois['nets'][0]['address']
  df['NetCity'] = ipwhois['city']
  df['NetPostCode'] = ipwhois['nets'][0]['postal_code']

Есть некоторые другие оптимизации, которые я бы предложил:

  • Записывайте в свой файл каждую итерацию или каждую n итераций, чтобы вы могли работать постепенно и не потерять свои результаты в случае ошибки в коде.
  • Используйте одну библиотеку - IPWhois или же whois - не оба.
  • Посмотрите на использование aysyncio. В настоящее время ваш код должен ждать ответа от whois запрос перед продолжением, и сетевой запрос на много порядков медленнее, чем ваш код проходит каждую итерацию в вашем цикле. С асинхронной моделью вы можете запустить несколько whois запросы и действуют только на результаты, когда они приходят. Эта модель может помочь оптимизировать эффективность вашего приложения.
Другие вопросы по тегам