zoukankan      html  css  js  c++  java
  • [爬虫练习]爬取同程安全应急响应公开漏洞列表以及详情

    附图一张:

      今天闲来无事做,就想起同程SRC有一个公开漏洞模块。然而闲的蛋疼的我就有了对其写一个爬虫将漏洞列表爬下来的冲动。有两个版本,一个是单线程的。另一个是多线程的版本。

    单线程版本:

    #coding=utf-8
    
    import requests
    import re
    print "33[0;31m "
    print '''
    
    ●●●█〓█████████▅▄▄▄▄▄▄▄▃▃▃▃▄ ●●
    ▄██ 〓█★    ★█ 〓 ██▄
    [ @Author:Poacher ]
    ▄▅██████████████████████▅▄▃
    ███████████████████████████◤
    ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙
    '''
    print "33[0m"
    
    
    bug_url = "http://sec.ly.com/bugs"
    
    #首先获取公开漏洞一共有多少页。由于有url在href里面。直接正则将url全部匹配出来之后开始循环请求。
    
    page = requests.get(bug_url)
    pattern = re.compile('<a class="ui button" href="(.*?)">',re.S)
    page_text = re.findall(pattern,page.content)
    
    # 去除重复URL。
    page_url = list(set(page_text))
    
    # 定义函数开始获取漏洞列表以及漏洞详情
    #获取标题以及链接地址可以前提下需要获取同一个a标签里的。否则容易出现数据对不上的情况。
    bugs_count = 0
    for i in page_url:
        bugs_list = requests.get(i)
        bugs_list_pattern = re.compile('<a title="(.*?)".*? href="(.*?)">',re.S)
        bugs_list_content = re.findall(bugs_list_pattern,bugs_list.content)
        bugs_count = bugs_count + len(bugs_list_content)
        for bugs_list in bugs_list_content:
    
            # 将斜杠替换成空,避免创建文件的时候出现异常。
            bugs_title = bugs_list[0].replace('/','')
            bugs_content = requests.get("http://sec.ly.com/"+bugs_list[1])
            filename = "./bugs_list/" + str(bugs_title) + ".html"
            html = open(filename.decode('utf-8'), 'w')
            html.write(str(bugs_content.content))
            html.close()
            print "正在爬取:"+bugs_title
    
    print "爬取完成。总共:"+ str(bugs_count) +"个漏洞。"
    多线程版本:
    多线程使用的是Threading+Queue
    #coding=utf-8
    import requests
    import re
    import threading
    import time
    import Queue
    
    print "33[0;31m "
    print '''
    
    ●●●█〓█████████▅▄▄▄▄▄▄▄▃▃▃▃▄ ●●
    ▄██ 〓█★    ★█ 〓 ██▄
    [ @Author:Poacher ]
    ▄▅██████████████████████▅▄▃
    ███████████████████████████◤
    ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙
    '''
    print "33[0m"
    
    
    bug_url = "http://sec.ly.com/bugs"
    #首先获取公开漏洞一共有多少页。由于有url在href里面。直接正则将url全部匹配出来之后开始循环请求。
    page = requests.get(bug_url)
    pattern = re.compile('<a class="ui button" href="(.*?)">',re.S)
    page_text = re.findall(pattern,page.content)
    # 去除重复URL。
    page_url = list(set(page_text))
    
    class Spider_bugs(threading.Thread):
    
        def __init__(self,queue):
            threading.Thread.__init__(self)
            self._queue = queue
    
        def run(self):
            start_time = time.time()
            while not self._queue.empty():
                bugs_list = requests.get(self._queue.get())
                bugs_list_pattern = re.compile('<a title="(.*?)".*? href="(.*?)">',re.S)
                bugs_list_content = re.findall(bugs_list_pattern,bugs_list.content)
                for bugs_list in bugs_list_content:
                    # 将斜杠替换成空,避免创建文件的时候出现异常。
                    bugs_title = bugs_list[0].replace('/','')
                    bugs_content = requests.get("http://sec.ly.com/"+bugs_list[1])
                    filename = "./bugs_list/" + str(bugs_title) + ".html"
                    html = open(filename.decode('utf-8'), 'w')
                    html.write(str(bugs_content.content))
                    html.close()
                    print "正在爬取:"+bugs_title+" 耗时:"+str(time.strftime('%H:%M:%S'))
    
            print "总共耗时:"+str(time.time()-start_time)
    
    def main():
        threads = []
        thread = 7 
        queue = Queue.Queue()
    
        for url in page_url:
            queue.put(url)
    
        for i in range(thread_count):
            threads.append(Spider_bugs(queue))
    
        for i in threads:
            i.start()
    
        for i in threads:
            i.join()
    
    
    if __name__ == '__main__':
        main()

    分享学习,如果以上代码有什么不应该的地方,请望指出。互相学习呀!!!还望有牛牛能优化下,然后在发一份学习学习!谢谢!!!

    版权声明:若无注明,本文皆为“Poacher'Blog”原创,转载请保留文章出处。
    免责声明:学习网络技术是为了更好的提升自我安全意识。不允许将内容私自传播、销售或者其他任何非法用途!否则,一切后果请用户自负!如对站内文章或者软件有异议,请联系博主!联系QQ:177705712
  • 相关阅读:
    hdu 1045 Fire Net
    hdu 1044 Collect More Jewels
    hdu 1043 Eight
    hdu 1042 N!
    hdu 1041 Computer Transformation
    hdu 1040 As Easy As A+B
    CI在ngnix的配置
    angularjs表单验证checkbox
    chrome浏览器跨域设置
    angularjs向后台传参,后台收不到数据
  • 原文地址:https://www.cnblogs.com/poacher/p/7384451.html
Copyright © 2011-2022 走看看