正在尝试批量提取20,000个域名的whois信息,python代码在我的CSV文件中与2个项目一起使用,但是在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详细信息的输出,每个域名中的每个域名信息在CSV文件中导出
您正在为您查找的每个属性创建一个新的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
查询,并且只能在结果到达时采取行动。该模型可以帮助优化应用程序的效率。