代码学习

本脚本用于个人测试学习,切勿用于非法用途,若用于非法用途,与本人无关。

脚本限制:若要不受限制的导出,至少需要普通会员的权限,不会消耗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()