需求:想通過指令碼實現批量爬取fofa查詢後的目標ip位址,然後儲存在本地。由於前端頁面會公升級導致指令碼會過期,所以又將指令碼更新了下。若使用報錯可以扣我進行修改指令碼
先獲取登入後的cookie,比如
fofa_ip.py執行結果如下,如搜尋語句中存在引號之類的需要輸入轉義符,如 --word "title=\"+ id_vc_welcome +\"",或者 --word " title=\'***xx\' "
指令碼更新~
import requests
from requests.packages import urllib3
urllib3.disable_warnings()
import base64
import argparse
from lxml import etree
import os
from colorama import init
init(autoreset=true)
#定義傳參函式
def para():
parser = argparse.argumentparser(description='fofa查詢指令碼')
parser.add_argument('--word',type=str,required=true,help='fofa查詢的語句')
parser.add_argument('--cookie',type=str,required=true,help='登入fofa賬號後的cookie')
parser.add_argument('--pro',type=str,required=false,help='**伺服器ip和埠(可選引數),如:xx.xx.xx.xx:7890')
print('[+]author:小緣喵')
print('[-]version_1.3')
print("[-]fofa查詢,批量獲取目標ip")
args = parser.parse_args()
word = args.word
cookie = args.cookie
pro = args.pro
if not pro: #如果沒有輸入**,則**為空
pro = ''
print(f"fofa搜尋語句為:\033[0;31m\033[0m 請核對是否正確")
return word,cookie,pro
#獲取爬取的頁面數量
def pag_num(word,cookie,pro):
print("[-]開始獲取查詢的頁面數量...")
#查詢詞進行baase64編碼
s = (base64.b64encode(word.encode('utf-8'))).decode('utf-8')
#封裝請求頭和請求引數
global headers
headers =
param =
#查詢的url
url = f""
#獲取頁面原始碼
text = requests.get(url=url,headers=headers,verify=false,timeout=15,proxies=).text
#獲取爬取目標的頁面數量
tree = etree.html(text)
try:
#pag_num:獲取到的頁面總數量
pag_num = tree.xpath('//div[@id="__layout"]//div[@class="pagfooter"]/div[@class="el-pagination"]/ul[@class="el-pager"]/li/text()')[-1]
except exception as error:
print('pag_num函式中未獲取到頁面數量,可能查詢目標無結果或者頁面解析出問題。出錯所在地位pag_num變數。詳細錯誤為:')
os._exit(0)
print('fofa爬取頁面數量為:'+pag_num)
#num:想要爬取的頁面數量
num = input('請輸入您想要爬取的頁面數量:')
if num.isdigit(): #檢測輸入的是否為純數字
num = int(num)
else:
print('請輸入乙個整數,謝謝')
os._exit(0)
return pag_num,num,s
#定義爬取頁面ip的函式
def fofa(word,pag_num,num,s,pro):
file_name = word.replace('\"','').replace('\'','')+'.txt'
try:
if os.path.exists(file_name):
os.remove(file_name)
except exception as error:
print('刪除舊檔案失敗,請檢測是否有足夠許可權。詳細錯誤為:')
ip_list = #定義存放所有ip的列表
for i in range(1,num+1):
param =
#獲取頁面原始碼
url = f""
try:
text = requests.get(url=url,headers=headers,verify=false,timeout=15,proxies=).text
except exception as error:
print(f"fofa函式中,獲取頁面原始碼時發生錯誤,錯誤所在地為text變數。詳細錯誤為:")
os._exit(0)
tree = etree.html(text)
#提取乙個頁面所有ip位址
try:
r = tree.xpath('//div[@id="__layout"]//div[@class="showlistscontainer"]/div[@class="rightlistsmain"]//a[@target="_blank"]/@href')
except exception as error:
os._exit(0)
for n in r:
n = str(n)
if "//" in n:
#將ip位址儲存到列表中
else:
pass
print(f'[-]第頁爬取完畢!')
ip_list_new = list(set(ip_list)) #將ip位址去重,然後進行儲存
for i in ip_list_new:
with open(file_name,'a',encoding='utf-8') as f:
f.write(i+'\r')
print('[-]全部頁面爬取完畢')
print(f'[+]共爬取\033[0;32m\033[0m個ip位址')
if __name__ == '__main__':
para = para() #以元組的形式返回結果 ('dva', 'sessionabc', '192.168.1.1')
num = pag_num(para[0].strip('\''),para[1],para[2]) #由於輸入查詢目標引數的時候會涉及到引號之類的,而fofa語法對引號的使用有嚴格的要求,所以這裡傳入引數進去的時候要去掉單引號
fofa(para[0].strip('\''),num[0],num[1],num[2],para[2])
python動態爬取知乎 python爬取微博動態
在初學爬蟲的過程中,我們會發現很多 都使用ajax技術動態載入資料,和常規的 不一樣,資料是動態載入的,如果我們使用常規的方法爬取網頁,得到的只是一堆html 沒有任何的資料。比如微博就是如此,我們可以通過下滑來獲取更多的動態。對於這樣的網頁該如何抓取呢?我們以微博使用者動態為例,抓取某名使用者的文...
Python批量爬取資料與去重方法
在進行英文取名專案對資料的爬取與分析中,經常會對已經儲存的批量資料去獲取更多有效的資料,這個時候我們需要考慮去重複問題,以及在高頻率訪問 導致連線超時中斷等問題。設定緩衝區 當我們進行批量處理時,也許會發現在過萬條資料裡面存在些許重複項資料,這個時候如果我們針對這些資料繼續去獲取更多的資料時,依然會...
Python爬取小說
感覺這個夠蛋疼的,因為你如果正常寫的話,前幾次執行沒問題,之後你連 都沒改,再執行就出錯了。其實這可能是網路請求失敗,或者有反爬蟲的東西吧。但這就會讓你寫的時候非常苦惱,所以這這東西,健壯性及其重要!import requests from bs4 import beautifulsoup impo...