[爬虫练习]爬取同程安全应急响应公开漏洞列表以及详情

附图一张:

  今天闲来无事做,就想起同程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
原文地址:https://www.cnblogs.com/poacher/p/7384451.html