Python打造自己的信息收集工具,保姆式教学你也来试试吧(附源码)

Posted 程序员_宇宁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python打造自己的信息收集工具,保姆式教学你也来试试吧(附源码)相关的知识,希望对你有一定的参考价值。

介绍:

该篇章主要介绍如何编写自己的信息收集工具,主要流程如下:

1、向bing搜索引擎发起request请求,获取url数据
2、使用正则表达式对获取的数据进行处理
3、用多线程,对处理的数据进行二次请求,返回标题等数据
4、使用openyxl模块,将数据保存为.xlsx格式

请注意:

该篇章目的是熟悉Python编程,学习Python的一些常见模块,在编写程序的过程中会有很多操作和方式方法,望大家能共同加油学到东西。本文仅用于技术讨论与研究,这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。

本文涉及到模块有:

#coding:utf-8
import requests     #发起request请求
import urllib3      #处理请求https异常报错问题
import re       #使用正则表达式对请求到的数据进行处理
from optparse import OptionParser   #自定义输入参数
import threading        #多线程模块
import queue            #多线程辅助模块,使用队列的方式对多线程进行控制
from bs4 import BeautifulSoup   #与re类似 使用正则表达式对请求到的数据进行处理
import time,datetime    #获取当前的时间
from openpyxl import  * #数据处理,将获取到的数据保存在excel文件中

属性:

heads =                        #全局变量  请求头
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)                          AppleWebKit/537.36 (Khtml, like Gecko) Chrome/92.0.4515.107 Safari/537.36',   #模拟浏览器请求
'Connection':'close',
'Accept-Encoding':'gzip, deflate'

count=1                         #全局变量  用于序号字段
queueLock = threading.Lock()    #全局变量  使用线程锁处理 线程异常问题
class DoRun(threading.Thread):  #自定义 多线程运行时使用的类

方法:

def get_Input():    #获取search语句 和 page
def getUrls(search,page):       #构造搜索语句,在bing搜索引擎搜索数据并返回urls
def req(url):   #对url进行验证,返回numb,url,title,status
def init_excel(filename):  #创建.xlsx表格,并初始化内容
def Save_Date(date,filename):   #将数据存储到表格当中
def run():     #核心代码

完整代码如下:

#coding:utf-8
import requests     #发起request请求
import urllib3      #处理请求https异常报错问题
import re       #使用正则表达式对请求到的数据进行处理
from optparse import OptionParser   #自定义输入参数
import threading        #多线程模块
import queue            #多线程辅助模块,使用队列的方式对多线程进行控制
from bs4 import BeautifulSoup   #与re类似 使用正则表达式对请求到的数据进行处理
import time,datetime    #获取当前的时间
from openpyxl import  * #数据处理,将获取到的数据保存在excel文件中

heads =                        #全局变量  请求头
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36',   #模拟浏览器请求
            'Connection':'close',
            'Accept-Encoding':'gzip, deflate'
        
count=1                         #全局变量  用于序号字段
queueLock = threading.Lock()    #全局变量  使用线程锁处理 线程异常问题
class DoRun(threading.Thread):  #自定义 多线程运行时使用的类
    def __init__(self,queue,filename):
        threading.Thread.__init__(self)
        self._queue=queue
        self._filename=filename
    def run(self):
        while not self._queue.empty():
            js=req(self._queue.get())
            #print(js)
            queueLock.acquire()
            if(js):
                Save_Date(js,self._filename)
            queueLock.release()
def init_excel(filename):  #创建.xlsx表格,并初始化内容
    wb=Workbook()
    filename=filename+".xlsx"
    ws=wb.create_sheet(index=0,title="域名")
    head=['序号','域名','标题','状态']
    for i in range(0,4):
        ws.cell(1,i+1).value=head[i]
    wb.save(filename)
def Save_Date(date,filename):   #将数据存储到表格当中
    filename=filename+".xlsx"
    wb_save=load_workbook(filename)
    ws_save=wb_save.worksheets[0]
    current_row=ws_save.max_row+1
    current_col=1
    for key in date:
        ws_save.cell(date['numb']+1,current_col).value=str(date[key])
        current_col+=1
    wb_save.save(filename) 
def req(url):   #对域名进行验证,返回状态码,title
    global count
    dir='numb':0,'url':'url','title':'None','status':0
    stat=0
    title="None"

    try:
        urllib3.disable_warnings()
        response = requests.get(url=url,headers=heads,verify=False,timeout=10)   #请求漏洞的url
        if response.status_code == 200:
            bs=BeautifulSoup(response.content,"html.parser")
            title=bs.find("title").text
            stat=response.status_code
            dir['numb']=count
            dir['url']=url
            dir['title']=title
            dir['status']=stat
            count+=1
            print("[+]"+url+"\\ttitle:"+title)
            return dir
        else:
            print('[-]请求失败:\\t\\t'.format(url,response.status_code))
    except Exception as e:
        print('[-]请求失败: \\t'.format(e,url))
def getUrls(search,page):       #构造搜索语句,在bing搜索引擎 搜索数据并返回urls
    count=1
    urls=[]
    url="https://cn.bing.com/search?q=&first="
    for i in range(1,page):
        if(i!=1):
            count=(i-2)*10+9
        url=url.format(search,i)
        try:
            resp=requests.get(url=url,headers=heads)
            html=resp.text
            if(resp.status_code==200):
                res=re.findall(r'<a target="_blank" href="(.*?)"',html)
                for u in res:
                    if(u not in urls):
                        urls.append(u)
            else:
                 print('[-]请求失败:\\t\\t'.format(url,resp.status_code))
        except Exception as e:
            print('[-]请求失败: \\t'.format(e,url))

    return urls
def get_Input():    #获取search语句 和 page
    optParser = OptionParser()
    optParser.add_option('-s','--search',action = 'store',type = "string" ,dest = 'search',help='漏扫文件的目录',default="search_def")
    optParser.add_option("-p","--page", action="store", type="int",dest="page",help='要搜索的页数',default=10)
    optParser.add_option("-t","--threads", action="store", type="int",dest="threads",help='线程数量,默认为10',default=10)
    (options , args) = optParser.parse_args()
    return options.search,options.page,options.threads
def run():
    que=queue.Queue()
    print(datetime.datetime.now())              #打印开始时间
    search,page,thread_count=get_Input()        #获取输入的参数 如searce 、线程数、页面数
    if(search=="search_def"):
        print(r"[-]错误,未输入指定参数:python3 temp.py -s site:qq.com [-p 10] [-t 20] ")
        return
    print(search)
    threads=[]
    urls=getUrls(search,page)     #获取urls
    filename=''.join(re.findall("([a-z,0-9])",search))      #将输入的内容进行处理 ,作为文件的名称
    init_excel(filename)        #创建并初始化excel
    for url in urls:
        que.put(url)            #将获取的urls添加到queue中
    for i in range(thread_count):
        threads.append(DoRun(que,filename))     #使用多线程 默认调用 run()函数
    for i in threads:
        i.start()               #启动多线程
    for i in threads:
        i.join()                #等待线程结束

    print(datetime.datetime.now())      #打印结束时间
run()

使用说明:

python3 .\\bingying.py -s "site:.com" -p 10 -t 30
Options:
-h, --help  show this help message and exit
-s SEARCH, --search=SEARCH    搜索的语法(默认 site:.com)
-p PAGE, --page=PAGE          要搜索的页数(一页10条数据,默认10页)
-t THREADS, --threads=THREADS 线程数量,(默认为10)

思路分析:

Python 易学难精,不是一朝一夕就能深入掌握。在这分享我珍藏的「学 Python 知识框架图」,系统地梳理了入门 Python 的必备知识点,建议保存。

👉学习经验总结👈

(一)调整好心态

心态是一个人能否成功的关键,如果不调整好自己的心态,是很难静下心来学习的,尤其是现在这么浮躁的社会,大部分的程序员的现状就是三点一线,感觉很累,一些大龄的程序员更多的会感到焦虑,而且随着年龄的增长,这种焦虑感会越来越强烈,那么唯一的解决办法就是调整好自己的心态,要做到自信、年轻、勤奋。这样的调整,一方面对自己学习有帮助,另一方面让自己应对面试更从容,更顺利。

(二)时间挤一挤,制定好计划

一旦下定决心要提升自己,那么再忙的情况下也要每天挤一挤时间,切记不可“两天打渔三天晒网”。另外,制定好学习计划也是很有必要的,有逻辑有条理的复习,先查漏补缺,然后再系统复习,这样才能够做到事半功倍,效果才会立竿见影。

(三)不断学习技术知识,更新自己的知识储备

对于一名程序员来说,技术知识方面是非常重要的,可以说是重中之重。要面试大厂,自己的知识储备一定要非常丰富,若缺胳膊少腿,别说在实际工作当中,光是面试这一关就过不了。对于技术方面,首先基础知识一定要扎实,包括自己方向的语言基础、计算机基础、算法以及编程等等。

👉Python学习路线汇总👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

👉精品Python学习书籍👈

1.技术沉淀(学习+积累)

对于技术新人来说,无论是在大厂小厂,还是在外包公司,基本上都是做得简单的CRUD工作。很多人认为,重复简单的工作对自己的技术是没有提升的,但实际上也有人能从中杀出一条血路,所以关键是你自己是否花了心思,付出了努力。

当然,我个人也有自己的一套学习方式和习惯,平时喜欢利用碎片时间来看点什么东西,比如一些技术性的书籍或文档,还有一些视频讲解等,经常会让我有一种恍然大悟的感觉,对我的工作也起到了很大的帮助。

  • 阅读书籍文档

小白入门第一本电子书籍

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

笨办法学Python

Python数据处理

Python自动化运维

深度学习

👉Python必备开发工具👈

👉Python视频合集👈


我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

总结(获取地址)

做程序员,真的是一个学习就会有回报的职业,不看出身高低,不看学历强弱,只要你的技术达到应有的水准,就能够得到对应的回报。

有句话说得好,人生苦短,我要学 Python。如果你想要进入 Python 的编程世界,可以通过这个专栏实现 Python 开发技能的入门和突破,成长为一名专业的选手。百尺竿头,更进一步。你来不来?

看到这里,觉得有帮助的小伙伴点赞支持一下博主~

以上是关于Python打造自己的信息收集工具,保姆式教学你也来试试吧(附源码)的主要内容,如果未能解决你的问题,请参考以下文章

渗透测试面试--信息收集主要流程 (含google搜索语法)(保姆式信息收集流程)(信息收集所需网站,工具)

Python正则表达式保姆式教学,带你精通大名鼎鼎的正则!

❤️Python面向对象保姆式教学❤️,新手速成精英之路!

python如何实现点云可视化交互——Open3D实例教程(获取所选点的信息)保姆级教学

python+requests+pytest+yaml/json+Allure+jenkins+docker接口自动化框架保姆级教学

❤️Python面向对象保姆式教学❤️,新手速成精英之路!