150行超迷你爬虫tinycrawler实现-Ali0th

news/2024/7/19 10:35:15 标签: 爬虫, php, python

Author: Ali0th

Email: martin2877@foxmail.com

Date: 20181104

前言

众所周知信息收集是渗透测试最先且最重要一步,而且不仅渗透,平时做的很多事情都需要用到爬虫。所以我也自己经常写爬虫脚本。这一个是去年底时写的超迷你爬虫,一方面是有需要,一方面是写着玩,于是把代码使用各种装逼型写法缩到行数最少。之后也在不断地使用中优化,目前应该不会有太大的改动,也欢迎大家提 issue。(走过路过,点个赞呗。)

简介

Tiny Crawler是一个 150 行代码实现的简单爬虫,是一个 python class 文件。它能够应付日常的渗透测试工作,因为它具备多种功能。

代码的写法上,尽量让代码量少而精、通用、易用,以便于实现日常的大量爬虫需求。可以随时集成到其它工具当中。

代码地址:github.com/Martin2877/…

语言: python3

行数:去掉注释约150行

执行流程

用法示例

0 最基本用法

直接两步,一步是初始化实例,一步是爬取,最后便可以通过实例中的 urls 变量看到爬取结果。默认为爬取深度为1的同源地址。

python copyable">def testphp_vulnweb():
    url = "http://testphp.vulnweb.com/"
    webcrawler = Webcrawler(url)
    webcrawler.crawl()
    urls = webcrawler.urls
    print(urls)
复制代码

1 实现深度爬取

python copyable">def testphp_vulnweb():
    url = "http://testphp.vulnweb.com/"
    webcrawler = Webcrawler(url,3)
    webcrawler.crawl()
    urls = webcrawler.urls
    print(urls)
复制代码

可以看到,爬取的是同源的地址链接,并且对每个新的地址进行爬取,直到达到设定的层级深度为止。

2 实现广度爬取

python copyable">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. 以正则的方式获取链接

这些不一一介绍,下面以爬取的示例展示

python copyable">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 的中,这个时候,就要通过正则的形式去获取。如上面的代码修改成下面的形式。

python copyable">webcrawler.crawl(None,True,100,None,"regex")
复制代码

结果可以看到爬取到以匹配形式获取的链接。

案例 : 目录遍历

只要引用此模块便可快速爬取目录遍历的所有链接。

python copyable">from tinycrawler import Webcrawler

def fetch(_url):
    webcrawler = Webcrawler(_url,5)
    webcrawler.crawl()
    print(webcrawler.urls)
复制代码

TODO

因为平时还会有一些其它的需求,比如爬取时候,同一类型的相似地址爬取过多,或要根据页面内容来过滤链接等,所以本爬虫还在不断改进中。

  • 内容爬虫
  • 通过页面内容过滤链接
  • 根据页面内容匹配去重

一些装逼型的代码写法说明

为了将代码量和行数缩减到最少,脚本中包含了大量装逼型代码写法,下面罗列一些,仅供欣赏。

1、检查已经存在的url

python copyable">        # 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。

2、循环爬取

python copyable">        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…


http://www.niftyadmin.cn/n/834913.html

相关文章

CTF-MISC-基础破解-WP

0x01 思路 下载获得文件后解压获得基础破解rar文件 由于压缩文件格式为 rar,如果使用伪加密的方式那么rar打开时会报错,因此可以确定该文件没有使用伪加密。 下载 压缩文件密码破解工具 使用后调整选项,开始破解,破解后获得密码为 2563 …

Python3+Appium学习笔记08-元素定位

appium整合了不同的自动化测试驱动程序。而新版本appium desktop 中安卓是使用UI Automator2来作为驱动程序的。以前版本是使用UI Automator1或 Selendroid。所以参数中需要加上 automationName: uiautomator2指定驱动程序。第一次使用这个参数的时候,会安装一个sev…

运维常用工具

一、word软件的优化 1、校队优化 2、自动更新优化 3、键入时自动套用格式优化 4、自动套有格式 5、自动保存优化 二、notepad优化 1、 2、 3、 4、 5、 三、picpick的优化 1、常规优化 2、截取优化 3、文件名称优化 4、自动保存优化 四、everything工具查找工具 1.word-优化自动…

Github 开源 EDR项目一览

0x01 BLUESPAWN 项目地址 :https://github.com/ION28/BLUESPAWN BLUESPAWN – Windows防御集成工具 BLUESPAWN是一个主动的防御和端点检测与响应工具,这意味着防御者可以使用它来快速检测,识别和消除网络中的恶意活动和恶意软件。 bluespa…

说说这半年做的一个项目,并分享给各位

已经快一年没有写博客了,实在是太忙了,忙到已经没有时间写文章。近半年的时间一直在忙着一个新项目,最近终于有了阶段性成果,觉得很有必要写写文章来记录一下这个新的项目。趁着这两天赶路的空闲时间记录分享一下项目的经验和过程…

centos的基本命令04

零:简述linux的文档目录结构 linux的文档目录是一个树形结构,操作的时候表现为以 / 开头的树形结构,/也是系统的最顶端,也就是linux的root,也是linux系统的文件系统的入口。他的下面有很多存放不同文件的,目…

101、Service 之间如何通信?(Swarm08)

参考https://www.cnblogs.com/CloudMan6/p/7967419.html微服务架构的应用由若干 service 构成。比如有运行 httpd 的 web 前端,有提供缓存的 memcached ,有存放数据的 mysql ,每一层都是 swarm 的一个service,每个service 运行了若…

CTF-EASYRE-RE-WP

0x01 思路 下载下来解压获得 easyre.exe 直接放入IDA,获得 flag flag{this_Is_a_EaSyRe}