内容简介:众所周知信息收集是渗透测试最先且最重要一步,而且不仅渗透,平时做的很多事情都需要用到爬虫。所以我也自己经常写爬虫脚本。这一个是去年底时写的超迷你爬虫,一方面是有需要,一方面是写着玩,于是把代码使用各种装逼型写法缩到行数最少。之后也在不断地使用中优化,目前应该不会有太大的改动,也欢迎大家提 issue。代码的写法上,尽量让代码量少而精、通用、易用,以便于实现日常的大量爬虫需求。可以随时集成到其它工具当中。
众所周知信息收集是渗透测试最先且最重要一步,而且不仅渗透,平时做的很多事情都需要用到爬虫。所以我也自己经常写爬虫脚本。这一个是去年底时写的超迷你爬虫,一方面是有需要,一方面是写着玩,于是把代码使用各种装逼型写法缩到行数最少。之后也在不断地使用中优化,目前应该不会有太大的改动,也欢迎大家提 issue。
简介
Tiny Crawler
是一个 150 行代码实现的简单爬虫,是一个 python class 文件。它能够应付日常的渗透测试工作,因为它具备多种功能。
代码的写法上,尽量让代码量少而精、通用、易用,以便于实现日常的大量爬虫需求。可以随时集成到其它 工具 当中。
代码地址: github.com/Martin2877/…
语言: python3
行数:去掉注释约150行
执行流程
用法示例
0 最基本用法
直接两步,一步是初始化实例,一步是爬取,最后便可以通过实例中的 urls
变量看到爬取结果。默认为爬取深度为1的同源地址。
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 复杂功能
- 代理
- 设置cookie
- 链接匹配
- 设定爬取数量
- 以正则的方式获取链接
这些不一一介绍,下面以爬取的示例展示
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
因为平时还会有一些其它的需求,比如爬取时候,同一类型的相似地址爬取过多,或要根据页面内容来过滤链接等,所以本爬虫还在不断改进中。
- 内容爬虫
- 通过页面内容过滤链接
- 根据页面内容匹配去重
一些装逼型的代码写法说明
为了将代码量和行数缩减到最少,脚本中包含了大量装逼型代码写法,下面罗列一些,仅供欣赏。
1、检查已经存在的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。
2、循环爬取
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
方法进行比较提取。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Nodejs爬虫,使用cheerio+request+phantomjs实现超简单爬虫
- 如何实现一个Python爬虫框架
- Golang实现简单爬虫框架(4)——队列实现并发任务调度
- [python实例] 爬虫实现自动登录、签到
- 基于 ZooKeeper 实现爬虫集群的监控
- 如何 5 分钟零代码实现豆瓣小组爬虫
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
区块链核心算法解析
【瑞士】Roger Wattenhofer(罗格.瓦唐霍费尔) / 陈晋川、薛云志、林强、祝庆 / 电子工业出版社 / 2017-8 / 59.00
《区块链核心算法解析》介绍了构建容错的分布式系统所需的基础技术,以及一系列允许容错的协议和算法,并且讨论一些实现了这些技术的实际系统。 《区块链核心算法解析》中的主要概念将独立成章。每一章都以一个小故事开始,从而引出该章节的内容。算法、协议和定义都将以形式化的方式描述,以便于读者理解如何实现。部分结论会在定理中予以证明,这样读者就可以明白为什么这些概念或算法是正确的,并且理解它们可以确保实现......一起来看看 《区块链核心算法解析》 这本书的介绍吧!