标签 企业备案查询 下的文章

声明:本资料仅供学习交流,严禁使用于商业、非法用途!!!

之前不是发了一个备案查询的脚本嘛,详情可见[bspost cid="3384"]

有师傅反应说接口数据不太对,因为那个接口用的都是缓存库,确实太老了,新的得vip(手动狗头)

根据我的需求确实能满足,以下改的就纯单学习交流了,获取的还是比之前要全很多

另外师傅们注意,还是根据需求来写的,所以仅限根据企业名称获取备案功能!!!

还有,没去细扣js了,直接用的selenium,师傅们如果使用可能还得去装个驱动,这个直接上网搜就行,毕竟在工作(摸鱼)时间写的,发现还挺好用的,对token验证还是乱杀,也学习了一波

直接上代码吧

import re
import time
import random
import csv
from urllib import parse
from urllib.parse import quote
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from pathlib import Path
import warnings
#忽略warning
warnings.filterwarnings("ignore")

# 定义备案爬虫类
class BeianSpider(object): 
    # 获取url
    def __init__(self):
        #判断beian.csv是否存在,不存在则创建
        my_file = Path("beian.csv")
        if my_file.exists():
            print("[+]beian.csv已存在!")
        else:
            with open('beian.csv','a',newline='',encoding="utf-8") as f:
                #生成csv操作对象
                writer = csv.writer(f)
                header = ["主办单位名称","单位性质","网站备案/许可证号","网站名称","网站首页网址","审核时间","记录时间","备案域名"]
                writer.writerow(header)
                print("[+]beian.csv已创建!")

    def get_url(self,word):
        url = 'https://icp.chinaz.com/record/{}'
        
        name=quote(word, 'utf-8')
        #params = parse.urlencode(name)
        url = url.format(name)
        #print(url)
        return url
    
    # 正则行数,提取内容
    def parse_html(self,name,html):
        # 正则表达式
        re_bds = '<td>(.*?)</td><td class="tc">(.*?)</td><td>(.*?)</td><td>(.*?)</td><td class="Now"><span><a href="//(.*?)".*?<td class="tc">(.*?)</td><td class="tc">(.*?)</td><td class="tc"><a href="/record/(.*?)".*?'
        # 生成正则表达式对象
        pattern = re.compile(re_bds,re.S)
        r_list = pattern.findall(html)
        print(r_list)
        self.save_html(r_list)
        with open('success.txt','a+',newline='',encoding="utf-8") as f:
            f.write(name)
            f.write('\n')

    # 保存数据函数,使用python内置csv模块
    def save_html(self,r_list):
        #生成文件对象  
        with open('beian.csv','a',newline='',encoding="utf-8") as f:
            #生成csv操作对象
            writer = csv.writer(f)
            #整理数据
            lenth = len(r_list)
            #print(lenth)
            for i in range(lenth):
                #主办单位名称
                save_organizer_name = r_list[i][0]
                #print(name)
                #单位性质
                save_unit_nature = r_list[i][1]
                #网站备案/许可证号
                save_ICP_number = r_list[i][2]
                #网站名称
                save_website_name = r_list[i][3]
                #网站首页网址
                save_website_index = r_list[i][4]
                #审核时间
                save_review_time = r_list[i][5]
                #记录时间
                save_record_time = r_list[i][6]
                #备案域名
                save_ICP_domain = r_list[i][7]
                L = [save_organizer_name,save_unit_nature,save_ICP_number,save_website_name,save_website_index,save_review_time,save_record_time,save_ICP_domain]
                # 写入csv文件
                writer.writerow(L)
            print("[+]",r_list[0][0],"查询写入完成")
                    

    # 主函数
    def run(self):
        try:
            url = "http://icp.chinaz.com/record"
            #禁止浏览器窗口弹出
            chrome_options = webdriver.ChromeOptions()
            chrome_options.add_argument('--headless')
            chrome_options.add_argument('--disable-gpu')
            browser = webdriver.Chrome(chrome_options=chrome_options)
            #browser = webdriver.Chrome()
            with open('qiye.txt','r',newline='',encoding="utf-8") as f:
                data = f.read().splitlines()
                lenth = len(data)
                for i in range(lenth):
                    #print(data[i])
                    url = self.get_url(data[i])
                    browser.get(url)
                    try:
                        #设置显示等待时间及标签,此处可改,实测受网络波动影响
                        wait = WebDriverWait(browser, 5)
                        wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'bg-list')))
                    #显示等待没有找到标签会报错,此处写入faild.txt后跳到下一个查找
                    except Exception as e:
                        with open('faild.txt','a+',newline='',encoding="utf-8") as f:
                            f.write(data[i])
                            f.write('\n')
                            print("[-]",data[i],"无备案信息")
                        continue
                    html = browser.page_source
                    self.parse_html(data[i],html)
                    #随机延时,根据需求设置
                    #time.sleep(random.uniform(1,2))
            print("[+]","All Finished")
        #except Exception:
    
        finally:
            browser.close()

# 以脚本方式启动
if __name__ == '__main__':
    #捕捉全局异常错误
    try:
        spider = BeianSpider()
        spider.run()
    except Exception as e:
        print("错误:",e)

使用还是跟之前一样,在qiye.txt里写上所有企业名称,一行一个,直接python3运行beian.py就好,然后脚本跑起来会输出到beian.csv里,同时输出success和faild的企业名,这样没找到备案的企业还能找其他站捞一波,以网上随便找的全省医院为例,结果见下图




实测还是获取的信息多一点,没vip只能查一页,所以就只获取一页了

而且实测跟网速还是有挺大关系,师傅们可以看看代码微调下参数,等待啥的

另外祝师傅们七夕快乐啊~~

有的人七夕有花有爱有对象,有的人居然从六月一直加班到现在,需坚强

事情是这样的,最近打了很多攻防类的演练项目,基本都是各种比赛各种卷,而目标一般会给出大批企业名称、域名或ip

域名跟ip倒好说,现有的工具能支撑我从找子域到扫端口再到漏扫一条龙服务

但之前好几次都在开头收集企业域名给卡住了,然后比别家慢一拍,很多报告交上去都是无效,在别人后面吃灰

目前参加的比赛开始或中后期都会给出一大批只有企业名称的公共目标,数量几百或几千,而且有部分比赛的规则里目标是不包括子公司的

其实github和吐司上都有几个师傅的项目能满足需求,而且写的非常全

但我不知道为啥就是跟爱企查过不去了,用工具那cookie配置就没成功过,不知道是不是跟网络环境有关

而且直接爱企查批量表示一千个企业里面只有16个企业有网站.......

然后在某个夜晚找了个还算查的全的站,花了点时间撸了个脚本,基本能满足只查个备案的需求吧

这里就直接上源码了

from urllib import request
import re
import time
import random
import csv
from urllib.parse import quote
ua_list = [
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
    'User-Agent:Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
    'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
    'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
    'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0',
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
]

# 定义一个爬虫类
class BeianSpider(object): 
    # 初始化
    # 定义初始页面url
    def get_url(self,word):
        url = 'https://www.icplist.com/icp/info/{}'
        
        name=quote(word, 'utf-8')
        #params = parse.urlencode(name)
        url = url.format(name)
        #print(url)
        return url
    # 请求函数
    def get_html(self,name,url):
        headers = {'User-Agent':random.choice(ua_list)}
        
        req = request.Request(url=url,headers=headers)
        res = request.urlopen(req)
        html = res.read().decode()
        #print(html)
        # 直接调用解析函数
        self.parse_html(name,html)
    
    # 解析函数
    def parse_html(self,name,html):
        # 正则表达式
        #re_bds_1 = '<div class="layui-table-cell"><a href="/icp/info/(.*?)"'
        re_bds = '<div class="layui-table-cell"><a href="/icp/info/(.*?)".*?<div class="layui-table-cell"><a href="/icp/info/(.*?)".*?<div class="layui-table-cell"> <a href="/icp/info/(.*?)"'
        # 生成正则表达式对象
        pattern = re.compile(re_bds,re.S)
        r_list = pattern.findall(html)
        if(r_list):
            print(r_list)
            self.save_html(r_list)
            with open('success.txt','a+',newline='',encoding="utf-8") as f:
                f.write(name)
                f.write('\n')
        else:
            with open('faild.txt','a+',newline='',encoding="utf-8") as f:
                f.write(name)
                f.write('\n')
                print("[-]",name,"无备案信息")
            return

    # 保存数据函数,使用python内置csv模块
    def save_html(self,r_list):
        #生成文件对象  
        with open('beian.csv','a',newline='',encoding="utf-8") as f:
            #生成csv操作对象
            writer = csv.writer(f)
            #整理数据
            lenth = len(r_list)
            #print(lenth)
            for i in range(lenth):
                #企业名
                name = r_list[i][0]
                #print(name)
                #备案号
                number = r_list[i][1]
                #域名
                domain = r_list[i][2]
                L = [name,number,domain]
                # 写入csv文件
                writer.writerow(L)
            print("[+]",r_list[0][0],"查询写入完成")
                    

    # 主函数
    def run(self):
        with open('qiye.txt','r',newline='',encoding="utf-8") as f:
            data = f.read().splitlines()
            lenth = len(data)
            for i in range(lenth):
                #print(data[i])
                url = self.get_url(data[i])
                self.get_html(data[/i][/i][/i][/i][/i][i][i][i][i][i][i],url)
                #生成1-3之间的浮点数
                time.sleep(random.uniform(1,2))
            print("[+]","All Finished")


if __name__ == '__main__':
    #捕捉异常错误
    try:
        spider = BeianSpider()
        spider.run()
    except Exception as e:
        print("错误:",e)

在qiye.txt里写上所有企业名称,一行一个,直接python3运行beian.py就好,然后脚本跑起来会输出到beian.csv里,同时输出success和faild的企业名,这样没找到备案的企业还能找其他站捞一波,以网上随便找的全省医院为例,结果见下图




可能代码有点垃圾,但它确实能跑,而且自用完全能满足所需了,师傅们轻喷

另外,是真的卷啊,已经加班打了一个多月,到hvv又加班

不过有一说一,攻防还是比普通项目要成长的快很多,只要有c带队,咱还能扛!!!!

感谢有师傅反映说接口太老了,跟我之前测的估计差不多,因为有集成工具能关联资产进行之后步骤的信息收集,所以按需求当时只需要一个对应企业的域名就行,然后之后再继续进行反查,这一步骤对我来说是适用的,所以当时打的项目基本上没漏太多,师傅们请测试后根据需求再用哈,或者能提供其他较好的接口,也谢谢师傅们了!!