附圖一張: 今天閑來無事做,就想起同程SRC有一個公開漏洞模塊。然而閑的蛋疼的我就有了對其寫一個爬蟲將漏洞列表爬下來的衝動。有兩個版本,一個是單線程的。另一個是多線程的版本。 單線程版本: 多線程版本: 多線程使用的是Threading+Queue #coding=utf-8 import requ ...
附圖一張:
今天閑來無事做,就想起同程SRC有一個公開漏洞模塊。然而閑的蛋疼的我就有了對其寫一個爬蟲將漏洞列表爬下來的衝動。有兩個版本,一個是單線程的。另一個是多線程的版本。
單線程版本:
#coding=utf-8 import requests import re print "\033[0;31m " print ''' ●●●█〓█████████▅▄▄▄▄▄▄▄▃▃▃▃▄ ●● ▄██ 〓█★ ★█ 〓 ██▄ [ @Author:Poacher ] ▄▅██████████████████████▅▄▃ ███████████████████████████◤ ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙ ''' print "\033[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 "\033[0;31m " print ''' ●●●█〓█████████▅▄▄▄▄▄▄▄▃▃▃▃▄ ●● ▄██ 〓█★ ★█ 〓 ██▄ [ @Author:Poacher ] ▄▅██████████████████████▅▄▃ ███████████████████████████◤ ◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲⊙ ''' print "\033[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()
分享學習,如果以上代碼有什麼不應該的地方,請望指出。互相學習呀!!!還望有牛牛能優化下,然後在發一份學習學習!謝謝!!!