網工寫python 爬IP位址庫

2021-10-19 05:13:14 字數 2151 閱讀 7197

一、選取乙個有開放api的ip位址庫

經比較,選擇ip-api這個庫(免費,一天內不限制次數),備選ipwois

def getisp(ip):

try:

proxies =

res = requests.get('' + ip, headers=,timeout=(1000,2000),proxies = proxies).content

#res = requests.get('' + ip, headers=, timeout=(100, 200)).content

print(ip)

data = json.loads(res)

if data['status'] == 'success':

return data['country'], data['isp'], data['as']

else:

'''data = ipwhois(ip).lookup_whois()

asn2 = data['asn']

country2 = pycountry.countries.get(alpha_2=data['asn_country_code']).name

isp2 = data['asn_description']'''

return 'fail', 'fail', 'fail'

except exception as e:

print("getisp出現異常:"+str(e))

''' data = ipwhois(ip).lookup_whois()

asn2 = data['asn']

country2 = pycountry.countries.get(alpha_2=data['asn_country_code']).name

isp2 = data['asn_description']'''

time.sleep(60)

return 'fail', 'fail','fail'

遇到的問題:ip-api限制一分鐘內只能查詢大約50個ip,超過後獲取不到資料,故在出現異常後,通過time.sleep(60)實現1min的緩衝時間(造成時間浪費,窮沒得辦法)

二、將查詢到的ip資訊存入資料庫

def update_isp (number):

try:

conn = pool.connection()

cur = conn.cursor()

for i in range(50000):

rows_count,subnet = inquery_prefix(number)

if rows_count > 0:

subnet = ''.join(subnet)

country1,isp1,asn1 = getisp(subnet)

country = str(country1)

isp = str(isp1)

val = (country1,isp1,number)

sql = "update routes set `country`=%s,`isp`=%s where number = %s"

print("update routes set `country`=%s"%country+ ",`isp`=%s"%isp+" where number = %d"%int(number))

cur.execute(sql,val)

number = str(int(number) + 1)

conn.commit()

else:

number = str(int(number) + 1)

return number

except exception as e:

print('update_isp出現異常:' +str(e))

遇到的問題:效能還是效能,一開始的update語句中的條件是where prefix=,導致存資料庫很慢,後來改為主鍵條件where number=,儲存變快了許多

三、其他

1、本來想爬取全球80萬條路由條目的資訊,並通過多執行緒併發爬取,結果發現python的多執行緒太假,並不能提高效率

2、受限於api分鐘內有次數限制,頻繁查詢獲取不到資料,導致2min內只能存50條路由條目,80萬條路由條目要爬幾十天,有點坑坑,計畫持續優化(**能力渣渣的網工的淚)

網工 IP協議與IP位址

tcp ip體系中的網路層協議,是方便計算機網路通資訊的協議。版本 4位二進位制,標識版本號。頭部長度 標識ip協議對的頭部長度,該欄位表示的的單位數是32bit,常用值為5,也是可取值的最小值,表示報頭為20位元組,最大值是15,表示報頭60位元組 如果有額外的 ip 的 options 選項,還...

python獲取區域網IP位址

設計思路 設計乙個udp資料報,併發送到公共的dns伺服器當中,udp資料報是盡最大努力不可靠交付,我們只需要獲取到udp頭部資訊即可 import socket def main get wlan ip def get wlan ip try socket.sock dgram代表的是socket...

網工 NA NAT位址轉換技術

私網位址與公網位址之間進行轉換 1.私網位址 可復用 10.0.0.0 10.255.255.255 172.16.0.0 172.31.255.255 192.168.0.0 192.168.255.255 2.公網位址 ip唯一 除私網位址及部分特殊位址 內部本地 轉換前內部源位址 外部本地 轉...