附图一张:
今天闲来无事做,就想起同程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()
分享学习,如果以上代码有什么不应该的地方,请望指出。互相学习呀!!!还望有牛牛能优化下,然后在发一份学习学习!谢谢!!!