0

我正在尝试批量提取 20,000 个域名的 WHOIS 信息,python 代码适用于我的 csv 文件中的 2 个项目,但会导致 20000 个域名的整个数据集出现错误

尝试了2个域名,OK。使用 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 文件中

4

1 回答 1

0

您正在为要查找的每个属性创建一个新的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次迭代时写入您的文件,以便您可以增量工作,并且在代码错误时不会丢失结果。
  • 使用一个库 -IPWhoiswhois- 不同时使用两者。
  • 看看使用aysyncio。目前,您的代码whois在继续之前必须等待查询的响应,并且网络查询比您的代码在循环中的每次迭代中运行要慢许多数量级。使用异步模型,您可以触发多个whois查询,并且仅在结果到达时对其进行操作。该模型可以帮助优化您的应用程序的效率。
于 2019-07-27T11:31:05.273 回答