作为一个安全测试人员,面对一个大型网站的时候,手工测试很有可能测试不全,这时候就非常需要一个通用型的网站扫描器。当然能直接扫出漏洞的工具也有很多,但这样你只能算是一个工具使用者,对于安全测试你还远远不够。这时候应该怎么做呢?对于那些大量且重复性工作,尽量能用工具实现就用工具实现,然后打包成自己的工具包。如今天的这个url爬取工具。当我们把整站url都爬取出来之后,可以对url进行分析分类,然后有针对性的进行手工测试。

注:此方法只能爬取网页链接性的url,不能爬取js动态生成的url

#python3.5

#urlScan.py

#Author:FrankHacker

import requests

import re

def url_is_correct():

'''

使用requests.get方法判断url是否正确,并返回url

:return:

'''

try:

url = input("Please input the target test url:")

#url = "http://10.70.18.47:8080" 这是我内网环境的测试地址

requests.get(url)

return url

except:

print('please input the correct url!!!')

#exit(-1) #如果url是固定写入的,那么必须添加此句,否则会一直循环

return url_is_correct()

url = url_is_correct() #将验证为正确的url地址赋值给url
def url_protocol(url):

'''

获取输入的url地址的协议,是http、https等

'''

print('该站使用的协议是:' + re.findall(r'.*(?=://)',url)[0])

return re.findall(r'.*(?=://)',url)[0]

urlprotocol = url_protocol(url)

def same_url(url):

'''

处理用户输入的url,并为后续判断是否为一个站点的url做准备,爬取的时候不能爬到其它站,那么爬取将无止境

:return: sameurl

'''

#将完整的url中的http://删除

url = url.replace(urlprotocol + '://','')

#判断删除http://之后的url有没有www,如果没有就加上‘www.’,但不存储,

#只是为了同化所有将要处理的url,都有了‘www.’之后,

#就可以找以‘www.’开始的到第一个‘/’结束中的所有字符串作为该站的主域名

if re.findall(r'^www',url) == []:

sameurl = 'www.' + url

if sameurl.find('/') != -1:

sameurl = re.findall(r'(?<=www.).*?(?=/)', sameurl)[0]

else:

sameurl = sameurl + '/'

sameurl = re.findall(r'(?<=www.).*?(?=/)', sameurl)[0]

else:

if url.find('/') != -1:

sameurl = re.findall(r'(?<=www.).*?(?=/)', url)[0]

else:

sameurl = url + '/'

sameurl = re.findall(r'(?<=www.).*?(?=/)', sameurl)[0]

print('同站域名地址:' + sameurl)

return sameurl

domain_url = same_url(url)

'''

处理url的类,对已访问过的和未访问过的进行记录,待后续使用

'''

class linkQuence:

def __init__(self):

self.visited = [] #已访问过的url初始化列表

self.unvisited = [] #未访问过的url初始化列表

def getVisitedUrl(self): #获取已访问过的url

return self.visited

def getUnvisitedUrl(self): #获取未访问过的url

return self.unvisited

def addVisitedUrl(self,url): #添加已访问过的url

return self.visited.append(url)

def addUnvisitedUrl(self,url): #添加未访问过的url

if url != '' and url not in self.visited and url not in self.unvisited:

return self.unvisited.insert(0,url)

def removeVisited(self,url):

return self.visited.remove(url)

def popUnvisitedUrl(self): #从未访问过的url中取出一个url

try: #pop动作会报错终止操作,所以需要使用try进行异常处理
return self.unvisited.pop()

except:

return None

def unvisitedUrlEmpty(self): #判断未访问过列表是不是为空

return len(self.unvisited) == 0

class Spider():

'''

真正的爬取程序

'''

def __init__(self,url):

self.linkQuence = linkQuence() #引入linkQuence类

self.linkQuence.addUnvisitedUrl(url) #并将需要爬取的url添加进linkQuence对列中

self.current_deepth = 1 #设置爬取的深度

'''

这里需要注意:

爬取分为:***先深度后广度***和***先广度和后深度***

1、如果是先深度后广度,那么给定一个url,然后从其页面中的任意一个可用链接进行深度爬取,很可能无限至循环下去

(在处理不当的时候,但一般情况下大家都会处理的很好,无非是判断哪些url是已经爬取过的,哪些是新爬取到的url)

2、如果是先广度后深度,就是将一个url页面中的所有链接进行爬取,然后分类处理过滤

(在这种处理不当的时候也会出现无限循环的可能,但一般情况下大家都会处理的很好,无非是判断哪些url是已经爬取过的,哪些是新爬取到的url)

'''

def getPageLinks(self,url):

'''

获取页面中的所有链接

'''

pageSource = requests.get(url).text

pageLinks = re.findall(r'(?<=href=\").*?(?=\")|(?<=href=\').*?(?=\')',pageSource)

#self.page_links = self.page_links + pageLinks

#print(self.page_links)

for l in pageLinks:

print(url + '该页面的源码链接有:' + l)

#for l in self.page_links:

# print(url + '该页面的源码链接有:' + l)

#return self.page_links

return pageLinks

def processUrl(self,url):

'''

判断正确的链接及处理相对路径为正确的完整url

:return:

'''

true_url = []

for l in self.getPageLinks(url):

if re.findall(r'/',l):

if re.findall(r':',l):

true_url.append(l)

else:

true_url.append(urlprotocol + '://' + domain_url + l)

#print(trueUrl)

for l in true_url:

print(url + '该url页面源码中,有效url:' + l)

return true_url

def sameTargetUrl(self,url):

'''

判断是否为同一站点链接,防止爬出站外,然后导致无限尝试爬取

'''

same_target_url = []

for l in self.processUrl(url):

if re.findall(domain_url,l):

same_target_url.append(l)

#print(self.same_target_url)

for l in same_target_url:

print(url + '该url页面源码中属于同一域的url有:' + l)

return same_target_url

def unrepectUrl(self,url):

'''

删除重复url

'''

unrepect_url = []

for l in self.sameTargetUrl(url):

if l not in unrepect_url:

unrepect_url.append(l)

for l in unrepect_url:

print(url + '该url下不重复的url有------:' + l)

#print(self.unrepect_url)

return unrepect_url

def crawler(self,crawl_deepth=1):

'''

正式的爬取,并依据深度进行爬取层级控制

'''

while self.current_deepth <= crawl_deepth:

while not self.linkQuence.unvisitedUrlEmpty():

visitedUrl = self.linkQuence.popUnvisitedUrl()

#print(visitedUrl)

if visitedUrl is None or visitedUrl == '':

continue

#self.getPageLinks(visitedUrl)

links = self.unrepectUrl(visitedUrl)

self.linkQuence.addVisitedUrl(visitedUrl)

for link in links:

self.linkQuence.addUnvisitedUrl(link)

self.current_deepth += 1

print(self.linkQuence.visited)

return self.linkQuence.visited

if __name__ == '__main__':

spider = Spider(url)

spider.crawler(2)

扫描http://www.baidu.com的结果

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com//ns0.bdstatic.com

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com//ns1.bdstatic.com

http://finance.baidu.com/该url下不重复的url有——:https://www.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://tieba.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:https://zhidao.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://music.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://image.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://v.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://map.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://wenku.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://news.baidu.com/view.html

http://finance.baidu.com/该url下不重复的url有——:http://www.baidu.com/search/news_help.html

http://finance.baidu.com/该url下不重复的url有——:http://news.baidu.com/advanced_news.html

http://finance.baidu.com/该url下不重复的url有——:http://news.baidu.com/pianhao.html

http://finance.baidu.com/该url下不重复的url有——:http://baijia.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://finance.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://yule.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://sh.news.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://sports.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://internet.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://fashion.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://auto.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://guonei.news.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://guoji.news.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://mil.news.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://shehui.news.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://media.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://cankaoxiaoxi.media.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://infzm.media.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://pengpai.media.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://nandu.media.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://21cbh.media.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://yicai.media.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://huaxi.media.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://caixin.media.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://xxcb.media.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://ynet.media.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://shipin.news.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://jian.news.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://fangchan.news.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://tech.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://lady.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://youxi.news.baidu.com/

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=1&class=stock&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=stock&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=dapan&cls=dapan

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=xingu&cls=xingu

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=gegu&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=warrant&cls=warrant

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=redianbk&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=1&class=money&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=money&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=fund&cls=fund

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=bank&cls=bank

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=nmetal&cls=nmetal

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=insurance&cls=insurance

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=forex&cls=forex

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=futures&cls=futures

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=licaianli&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=1&class=hongguan&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=hongguan&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=hg_guonei&cls=hg_guonei

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=hg_guoji&cls=hg_guoji

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=chanye&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=gonsibd&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=caijinrw&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=shenghuoxf&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://baidu.com/n?cmd=4&class=finaneval&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://finance.baidu.com/n?cmd=4&class=shenghuoxf&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://finance.baidu.com/n?cmd=10&class=vid2finance&pn=1&from=tab

http://finance.baidu.com/该url下不重复的url有——:http://finance.baidu.com/n?cmd=1&class=hongguan&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://finance.baidu.com/n?cmd=4&class=chanye&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://finance.baidu.com/n?cmd=4&class=hg_guonei&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://finance.baidu.com/n?cmd=4&class=hg_guoji&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://finance.baidu.com/n?cmd=4&class=finaneval&pn=1

http://finance.baidu.com/该url下不重复的url有——:http://finance.baidu.com/n?cmd=4&class=gonsibd&pn=1

http://finance.baidu.com/该url下不重复的url有——:

Python入门:全站url爬取的更多相关文章

  1. Python入门,以及简单爬取网页文本内容

    最近痴迷于Python的逻辑控制,还有爬虫的一方面,原本的目标是拷贝老师上课时U盘的数据.后来发现基础知识掌握的并不是很牢固.便去借了一本Python基础和两本爬虫框架的书.便开始了自己的入坑之旅 言 ...

  2. python爬虫入门10分钟爬取一个网站

    一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...

  3. 教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http://www.xiaohuar.com/,让你体验爬取校花的成就感. Scr ...

  4. 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...

  5. Python爬虫实例:爬取豆瓣Top250

    入门第一个爬虫一般都是爬这个,实在是太简单.用了 requests 和 bs4 库. 1.检查网页元素,提取所需要的信息并保存.这个用 bs4 就可以,前面的文章中已经有详细的用法阐述. 2.找到下一 ...

  6. Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取

    很多网页的信息都是通过异步加载的,本文就举例讨论下此类网页的抓取. <工作细胞>最近比较火,bilibili 上目前的短评已经有17000多条. 先看分析下页面 右边 li 标签中的就是短 ...

  7. Python爬虫实例:爬取猫眼电影——破解字体反爬

    字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...

  8. Scrapy 框架 CrawlSpider 全站数据爬取

    CrawlSpider 全站数据爬取 创建 crawlSpider 爬虫文件 scrapy genspider -t crawl chouti www.xxx.com import scrapy fr ...

  9. Python爬虫教程-17-ajax爬取实例(豆瓣电影)

    Python爬虫教程-17-ajax爬取实例(豆瓣电影) ajax: 简单的说,就是一段js代码,通过这段代码,可以让页面发送异步的请求,或者向服务器发送一个东西,即和服务器进行交互 对于ajax: ...

随机推荐

  1. [Servlet&amp;JSP] HttpSession会话管理

    我们能够将会话期间必须共享的资料保存在HttpSession中,使之成为属性.假设用户关掉浏览器接受Cookie的功能.HttpSession也能够改用URL重写的方式继续其会话管理功能. HttpS ...

  2. Android BlueDroid(二):BlueDroid蓝牙开启过程init

    关键词:bluedroid  initNative enableNative BTIF_TASK  BTU_TASKbt_hc_work_thread set_power  preload  GKI作 ...

  3. 【Android应用开发技术:基础构建】命令行下的Android应用开发

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.co ...

  4. zzulioj--1813--good string(模拟)

    1813: good string Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 93  Solved: 15 SubmitStatusWeb Boa ...

  5. Mvc 返回文件直接下载

    今天碰到一个问题,前端点击下载文件,后端判断文件是否存在,不存在则自动生成文件(图片),返回前端会自动下载文件 网上查了一些  Mvc  action中返回File类型 设置一些contentType ...

  6. Xfce4里添加登录后程序自动运行

    Xfce4里添加登录后程序自动运行 (注意该方法在登录桌面环境后才会自动运行程序. 在XUbuntu下测试过, Ubuntu下应该是类似的) 方法1: 找到这个东西, 自动添加一下 方法2: 在 .c ...

  7. asp.net导出execl和图片

    个人常用导出execl方法: #region "导出文档" /// <summary> /// Export("application/ms-excel&qu ...

  8. WLAN RTT (IEEE 802.11mc)

    WLAN RTT (IEEE 802.11mc) Android 9 中的 WLAN 往返时间 (RTT) 功能允许设备测量与其他支持设备的距离:无论它们是接入点 (AP) 还是 WLAN 感知对等设 ...

  9. CMD和AMD的区别

    CMD和AMD俩者之间的区别 AMD和CMD最大的区别是对依赖模块的执行时机处理不同 CMD和AMD都是CommonJS延伸而来的,CommonJS是随着node的出现而出现的,它是一个规范,用于定义 ...

  10. MYSQL8.0的安装方法

    1.下载zip安装包: MySQL8.0 For Windows zip包下载地址:https://dev.mysql.com/downloads/file/?id=476233,进入页面后可以不登录 ...