Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动测试。
首先生成项目文件
scrapy startproject spiderdata
生成成功后,会有以下目录结构,首先在spiderdata中的spider目录创建我们的spider文件。
备份文件扫描文件名,有两个选择,一是基于字典,二是根据url的备份文件名,从以往发现备份文件的结果上看,两种方式都是经常存在使用的。
于是创建backup文件,用来生成备份文件名,创建一个列表用来存储字典文件名,另外创建一个方法用来基于url生成备份文件名。
#coding:utf-8
import urlparse
class backup(object):
def __init__(self, url):
self.url = url
self.list2 = ['/db.zip', '/fdsa.rar', '/ftp.rar', '/gg.rar', '/hdocs.rar', '/hdocs.zip', '/a.zip', '/web.zip',
'/web.rar', '/1.rar', '/bbs.rar', '/www.root.rar',
'/123.rar', '/data.rar', '/bak.rar', '/oa.rar', '/admin.rar', '/www.rar', '/2014.rar',
'/2015.rar', '/2016.rar', '/2014.zip', '/2015.zip', '/2016.zip',
'/2017.zip', '/1.zip', '/1.gz', '/1.tar.gz', '/2.zip', '/2.rar', '/123.rar', '/123.zip', '/a.rar',
'/a.zip', '/admin.rar', '/back.rar', '/backup.rar', '/bak.rar',
'/bbs.rar', '/bbs.zip', '/beifen.rar', '/beifen.zip', '/beian.rar', '/data.rar', '/data.zip',
'/HYTop.rar', '/root.rar', '/Release.rar', '/Release.zip', '/sql.rar',
'/test.rar', '/template.rar', '/template.zip', '/upfile.rar', '/vip.rar', '/wangzhan.rar',
'/wangzhan.zip', '/web.rar', '/web.zip', '/website.rar', '/www.rar',
'/www.zip', '/wwwroot.rar', '/wwwroot.zip', '/wz.rar']
def backup(self):
list_a = []
parse = urlparse.urlparse(self.url)
name = parse.netloc.split('.')
name_url = parse.netloc.replace('.', '')
for i in ['.rar', '.zip', '.tar.gz', '.7z']:
list_a.append(parse.scheme + '://' + parse.netloc + '/' + parse.netloc + i) #http://www.baidu.com/www.baidu.com.zip
if 'www' in name:
list_a.append(self.url + '/' + name[1] + i) #http://www.baidu.com/baidu.zip
list_a.append(self.url + '/' + ''.join(name[1:]) + i) #http://www.baidu.com/baiducom.zip
else:
list_a.append(self.url + '/' + name[0] + i) #http://www.baidu.com/baidu.zip
list_a.append(self.url + '/' + name_url + i) #http://www.baidu.com/wwwbaiducom.zip
for x in self.list2:
list_a.append(self.url + x)
return list_a
在spider的爬虫文件中使用以下代码
#coding:utf-8
import scrapy
from backup import backup
from ..items import SpiderdateItem
class spiderdata(scrapy.Spider):
name = "spiderdata"
content_type = ['application/x-rar','application/x-gzip','application/zip','application/octet-stream','application/x-7z-compressed']
def start_requests(self):
with open('ip.txt','r') as f:
for i in f.readlines():
ip = i.strip('\n')
back = backup(ip)
url_ip = back.backup()
for x in url_ip:
yield scrapy.Request(x, callback=self.parse,dont_filter=True)
def parse(self, response):
item = SpiderdateItem()
if response.headers['Content-Type'] in self.content_type:
print "[" + str(response.status) + "]" + u' 检测到存在备份文件的URL: '+ response.url
item['url'] = response.url
yield item
调用之前创建的备份文件名函数,使用start_requests来生成一个可迭代对象。
数据通过item来保存本地,所以在items中创建一个参数,并且在settings中开启item管道。
url = scrapy.Field()
在piplines中创建本地文件保存文件,创建一次文件对象,写入后根据 爬虫关闭后再关闭本地文件。
def __init__(self):
self.f = open("url.txt",'w')
def process_item(self, item, spider):
self.f.write(item['url'].encode("utf-8")+'\n')
return item
def close_spider(self, spider):
self.f.close()
因此只需在spiderdata中创建ip.txt文件即可,写入需要检测的url,另外如果不想看到scrapy的log输出,可以用在setting中添加如下:
LOG_LEVEL = 'WARNING'
只显示warning级的log输出.