iT邦幫忙

0

PYTHON爬蟲https://www.twnic.tw/whois_n.php

com 2023-01-24 17:46:551636 瀏覽
  • 分享至 

  • xImage

我寫了以下程式

import requests
from bs4 import BeautifulSoup
import time
t = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
url = 'https://www.twnic.tw/whois_n.cgi?query='
name = 'cbn'
k=0
for s in t:
    r = requests.get(url+name+s+".com") 
    soup = BeautifulSoup(r.text,"html.parser") 
    sel = soup.select("pre")
    m = 'No match for domain'
    d=len(sel)
    if d > 0:
        if sel[0].text[1:20]==m:
            print(name+s+".com")
    else:
        time.sleep(60)
    print(k)
    k=k+1

因為每8次查詢WHOIS就會被擋下來,我停60秒再執行下一次。
但是被擋的當次就得放棄查詢,我原本以為sleep(60)就可以過,但是想問前輩有甚麼其他辦法讓我 requests.get不會被TWNIC WHOIS擋?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

7
Ray
iT邦大神 1 級 ‧ 2023-01-24 17:59:11

ㄟ不是啊, 找 Whois 為何要用到爬蟲去爬網頁?
Whois 是 RFC 3912 標準網路協定, 你照這去問 Whois Server 可以問到最準確的答案:
WHOIS Protocol Specification
全世界找 Whois 資料都是用這個標準通訊協定, 不是用網頁爬蟲.

你去爬網頁, 只要人家網頁一改版就完了; 用 Whois 專用協定不會有這個問題, 因為 RFC 已經是標準, 不會沒事隨便給你換格式或欄位, 想改掉某個 RFC 通常都要幾十年的時間.

這是 Whois 標準的查詢流程, 正常都是用 Linux 內建的 whois 指令就可以查詢了, 但因一般人不善使用該指令, 所以才會另外做網頁出來, 方便一般人查詢, 但網頁不是標準:

Python 自己就有 Whois Protocol 的 Library, 根本不需要爬蟲:
Python 搜尋 WHOIS 資料?網域 Domain 資料不難找

Whois 會擋高頻查詢是正常表現, 因為他不想被人把資料庫全部撈走; 也不想因此影響到正常的查詢作業. 所以 Whois Server 另外會有 Cache 機制, 在短時間內查詢相同內容, 就給你 Cache, 以免造成 Server 的負擔.

看更多先前的回應...收起先前的回應...
com iT邦新手 4 級 ‧ 2023-01-24 18:19:06 檢舉

謝謝您告知有WHOIS套件,主要是再研究TWNIC這一頁防爬蟲的機制為何,目前測試60秒重查不同DOMAIN 2次就可以過。

Ray iT邦大神 1 級 ‧ 2023-01-24 18:36:10 檢舉

其實你只要每次查詢都換一個不同的 IP 就會過, 他是用 IP 統計...

com iT邦新手 4 級 ‧ 2023-01-24 18:46:11 檢舉

我有試過換IP不會過,很像是用COOKIE或SESSION判斷。或是CACHE【您的查詢太頻繁,請稍待再查詢,謝謝】

一般防爬蟲會有很多複合式的記錄。
正常來說,基本的換線動作。除了換IP之外。
也需要將COOKIE、暫存檔全數清除才行。

另外也得看你所謂的換IP是什麼情況。一般現在PROXY或是VPN的方式已經沒啥用。得真的更換IP去做處理。

我個人是利用AWS來換IP處理的。不過雖然是說換IP。其實也是跑VM來各別綁定IP處理。

com iT邦新手 4 級 ‧ 2023-01-25 16:48:19 檢舉

@㊣浩瀚星空㊣
我是使用PPPOE更換IP內部網卡IPV6跟IPV4是關閉,只能使用PPPOE撥接上網。
使用下面指令更換IP

cmd = 'rasdial /disconnect'
os.system(cmd)
time.sleep(20)
cmd = 'rasdial HINET 88888888@hinet.net XXXXXXXX'
os.system(cmd)
time.sleep(10)

我目前猜測是對方用WAF,因為我沒有CACHE也沒有COOKIE,換IP停30秒還是會被擋1次,換IP要第2次才成功。

re.Zero iT邦研究生 5 級 ‧ 2023-01-25 18:47:43 檢舉

@com:
Hinet PPPoE 有時會給回斷線前的同一 IP,建議你加入檢查 IP 的程序。

我要發表回答

立即登入回答