150行超迷你爬蟲tinycrawler實現-Ali0th

Author: Ali0thphp

Email: martin2877@foxmail.comcss

Date: 20181104html

前言

衆所周知信息收集是滲透測試最早且最重要一步,並且不只滲透,平時作的不少事情都須要用到爬蟲。因此我也本身常常寫爬蟲腳本。這一個是去年末時寫的超迷你爬蟲,一方面是有須要,一方面是寫着玩,因而把代碼使用各類裝逼型寫法縮到行數最少。以後也在不斷地使用中優化,目前應該不會有太大的改動,也歡迎你們提 issue。(走過路過,點個讚唄。)python

簡介

Tiny Crawler是一個 150 行代碼實現的簡單爬蟲,是一個 python class 文件。它可以應付平常的滲透測試工做,由於它具有多種功能。git

代碼的寫法上,儘可能讓代碼量少而精、通用、易用,以便於實現平常的大量爬蟲需求。能夠隨時集成到其它工具當中。github

代碼地址:github.com/Martin2877/…web

語言: python3cookie

行數:去掉註釋約150行app

執行流程

在這裏插入圖片描述
在這裏插入圖片描述

用法示例

0 最基本用法

直接兩步,一步是初始化實例,一步是爬取,最後即可以經過實例中的 urls 變量看到爬取結果。默認爲爬取深度爲1的同源地址。dom

def testphp_vulnweb():
    url = "http://testphp.vulnweb.com/"
    webcrawler = Webcrawler(url)
    webcrawler.crawl()
    urls = webcrawler.urls
    print(urls)
複製代碼

在這裏插入圖片描述

1 實現深度爬取

def testphp_vulnweb():
    url = "http://testphp.vulnweb.com/"
    webcrawler = Webcrawler(url,3)
    webcrawler.crawl()
    urls = webcrawler.urls
    print(urls)
複製代碼

在這裏插入圖片描述

能夠看到,爬取的是同源的地址連接,而且對每一個新的地址進行爬取,直到達到設定的層級深度爲止。

2 實現廣度爬取

def testphp_vulnweb():
    url = "https://www.acunetix.com/"
    webcrawler = Webcrawler(url,2)
    webcrawler.crawl(None,False,None,True)
    urls = webcrawler.urls
    print(urls)
複製代碼

在這裏插入圖片描述

能夠看到,全部非同源的地址被爬取了出來。而且也是對每一個新的地址進行爬取,直到達到設定的層級廣度爲止。

3 複雜功能

  1. 代理
  2. 設置cookie
  3. 連接匹配
  4. 設定爬取數量
  5. 以正則的方式獲取連接

這些不一一介紹,下面以爬取的示例展現

def testphp_vulnweb():
    cookie = {
        'Proxy-Connection' : 'keep-alive',
        'Cache-Control' : 'max-age=0',
        'Upgrade-Insecure-Requests' : '1',
        'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
        'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Referer' : 'https://www.google.com.hk/',
        'Accept-Encoding' : 'gzip, deflate',
        'Accept-Language' : 'zh-CN,zh;q=0.9'
    }
    url = "http://testphp.vulnweb.com/"
    webcrawler = Webcrawler(url,2,"http://127.0.0.1:8081",cookie)
    match = {"css":False,"php":True} # 過濾含 css 的連接,但要 php 的
    webcrawler.crawl(match,True,100,None,None)
    # 分別意思爲:
    # 使用match過濾,同源,最多獲取 100 個連接,不找新域名,爬取 html 標籤
    urls = webcrawler.urls
    print(urls)
複製代碼

在這裏插入圖片描述

有時候,連接寫在 js 中,而不是放在 html 的中,這個時候,就要經過正則的形式去獲取。如上面的代碼修改爲下面的形式。

webcrawler.crawl(None,True,100,None,"regex")
複製代碼

在這裏插入圖片描述

結果能夠看到爬取到以匹配形式獲取的連接。

案例 : 目錄遍歷

只要引用此模塊即可快速爬取目錄遍歷的全部連接。

from tinycrawler import Webcrawler

def fetch(_url):
    webcrawler = Webcrawler(_url,5)
    webcrawler.crawl()
    print(webcrawler.urls)
複製代碼

TODO

由於平時還會有一些其它的需求,好比爬取時候,同一類型的類似地址爬取過多,或要根據頁面內容來過濾連接等,因此本爬蟲還在不斷改進中。

  • 內容爬蟲
  • 經過頁面內容過濾連接
  • 根據頁面內容匹配去重

一些裝逼型的代碼寫法說明

爲了將代碼量和行數縮減到最少,腳本中包含了大量裝逼型代碼寫法,下面羅列一些,僅供欣賞。

一、檢查已經存在的url

# check for exist url
        source = self.urls if self.new_domain else self.website
        return [x for x in _urls if x not in self.urls and comp_netloc(x,source)]
複製代碼

裝逼寫法有三,使用了 x if a else b x for x in 和 加[]返回list。

二、循環爬取

for dp in range(1,self.depth):
            urls_new = self.comp(set(self.flat_list(list(map(self.url_html,urls_new)))))
            if len(urls_new) == 0:break
            if verbose : print("[result]urls_new:{0},self.urls:{1}".format(urls_new,self.urls))
            self.urls.extend(urls_new)
複製代碼

裝逼寫法爲這裏使用 for 進行循環爬取的加載,當新地址爲 0 時才退出。而新地址 urls_new 使用了上面封裝的self.comp方法進行比較提取。

MyBlog

CSDN blog.csdn.net/u013661799

掘金 juejin.im/user/58170e…

相關文章
相關標籤/搜索