代码学习
本脚本用于个人测试学习,切勿用于非法用途,若用于非法用途,与本人无关。
脚本限制:若要不受限制的导出,至少需要普通会员的权限,不会消耗api接口的数量。
单线程,不会写线程;也不会加参数,请自行修改代码然后运行。
开场设置编码的那一行不确定是不是这玩意了,能跑起来就行了,不管他了。
网络上已经有别的大佬写的脚本了,我这个权当做学习python的。
第一版
# * coding:utf-8 *
# 该项目用于导出fofa的搜索结果,本来想将结果保存到xlsx文件的,但是想到又要安装库,麻烦,所以就直接保存到txt文件里了。
import os
import requests
import base64
import re
# 设置Cookie信息
Cookie = "fofa_token=xxx"
search = 'host="xxx.com"' # 自定义需要搜索的语法信息,参阅fofa语法。
count_result = r'(?<=<p class="nav-font-size"><span class="pSpanColor">).*?(?=</span>)' # 正则匹配有多少条搜索结果
get_result = r'(?<=<span class="aSpan"><a href=").*?(?=" target="_blank">)' # 正则匹配搜索结果中的结果地址
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36",
"Cookie":Cookie
}
result_list = [] # 用于保存所有结果
http_result = [] # 用于保存http结果
https_result = [] # 用于保存https结果
for page in range(1,3): # 遍历每一页的结果,自己视情况修改下列范围。1,3表示获取第1页到第2页的搜索结果。
url = "https://fofa.so/result?qbase64="+base64.b64encode(search.encode('utf-8')).decode("utf-8")+"&page="+str(page)+"&page_size=10"
get_search = requests.get(url=url, headers=headers) # 发起搜索请求
sum_result = re.findall(count_result, get_search.text) # 正则匹配找结果数量。
sum = sum_result[0].replace(",","") # 对应正则匹配有多少条搜索结果,便于后期统计。
target_url = re.findall(get_result, get_search.text) # 对应正则匹配搜索结果中的地址,编译后续记录。
print("搜索完毕,总共搜索到:"+sum+"个结果..目前正在获取第 "+str(page)+"页的结果.")
if len(target_url)>=1: # 获取搜索结果
for url in target_url:
if "https" in url:
https_result.append(url) # https搜索结果追加到列表。
else:
http_result.append(url) # http搜索结果追加到列表。
continue
else:
print("这是第"+str(page)+"页,没结果了.")
break
page+=1
http_file = open(os.getcwd()+"\\http.txt", "w+", encoding="utf-8") # http结果保存到当前目录的一个单独文件。
https_file = open(os.getcwd()+"\\https.txt", "w+", encoding="utf-8") # http结果保存到当前目录的一个单独文件。
all_file = open(os.getcwd()+"\\all.txt", "w+", encoding="utf-8") # 将所有结果去重后保存到当前目录的一个单独文件。
for save_http in http_result: # 将http的结果保存到文件。
http_file.write(save_http+"\n")
for save_https in https_result: # 将https的结果保存到文件。
https_file.write(save_https+"\n")
result_list = http_result+https_result # 将https和http的搜索结果合并到一起。
all_list = [] # 定义一个新列表用于存放去重后的结果。
for all_result in result_list: # 将合并后的结果放入列表中。
repeat = all_result.replace("http://","").replace("https://","")
all_list.append(repeat)
new_list = list(dict.fromkeys(all_list)) # 合并结果后的列表去重。
for save_list in new_list: # 将合并并去重后的数据保存到文件。
all_file.write(save_list+"\n")
http_file.close()
https_file.close()
all_file.close()
第二版
获取标题的代码好像有问题。
# * encoding:utf-8 *
import os
import requests
import base64
import re
import sys
# 设置Cookie信息
Cookie = "fofa_token=xxxx"
# search = 'title="TOS Loading"' # 自定义需要搜索的语法信息
count_result = r'(?<=<p class="nav-font-size"><span class="pSpanColor">).*?(?=</span>)' # 正则匹配有多少条搜索结果
get_result = r'(?<=<span class="aSpan"><a href=").*?(?=" target="_blank">)' # 正则匹配搜索结果中的结果地址
get_title = r'(?<=<p class="max-tow-row">).*(?=</p> <p><a class="jumpA")'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36",
"Cookie": Cookie
}
def search(search: str, page_stop: int, page_start = 1):
file_name = search.replace("\"","").replace(" ","_")+".txt"
result_file = open(os.getcwd() +"\\"+ file_name, "w+", encoding="utf-8")
print("当前搜索语法为:"+search + " 从第"+str(page_start)+"页获取,到第"+str(page_stop)+"页结束。")
print("-------------------------------")
for page in range(page_start, page_stop):
url = "https://fofa.info/result?qbase64=" + base64.b64encode(search.encode('utf-8')).decode("utf-8") + "&page=" + str(page) + "&&page_size=10"
get_search = requests.get(url=url, headers=headers, verify=True) # 发起搜索请求
sum_result = re.findall(count_result, get_search.text) # 正则匹配找结果数量。
target_title = re.findall(get_title, get_search.text) # 匹配标题
sum_r = sum_result[0].replace(",", "") # 对应正则匹配有多少条搜索结果,便于后期统计。
target_url = re.findall(get_result, get_search.text) # 对应正则匹配搜索结果中的地址,便于后续记录。
print("搜索完毕,总共搜索到:" + sum_r + "个结果..目前正在获取第 " + str(page) + "页的结果.")
if len(target_url) >= 1:
for result_reange in range(0,10):
print(target_url[result_reange]+"\t"+target_title[result_reange])
result_file.write(target_url[result_reange]+"\t"+target_title[result_reange]+"\n")
else:
print("这是第" + str(page) + "页,没结果了.")
break
page += 1
result_file.close()
def main():
if len(sys.argv) <= 2 or len(sys.argv) >= 5:
print("用法:")
print(" xx.py [搜索语法,双引号加\\转义] [获取多少页]")
print(" xx.py [搜索语法,双引号加\\转义] [开始获取结果的页数] [结束获取结果的页数]")
print("例子:")
print(" xx.py title=\"test\" 5")
if len(sys.argv) == 3:
search1 = sys.argv[1]
page_stop1 = sys.argv[2]
search(search1, int(page_stop1))
if len(sys.argv) == 4:
search2 = sys.argv[1]
page_start2 = sys.argv[2]
page_stop2 = sys.argv[3]
search(search2, int(page_stop2),int(page_start2))
main()