Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动测试。

首先生成项目文件

scrapy startproject spiderdata

生成成功后,会有以下目录结构,首先在spiderdata中的spider目录创建我们的spider文件。

1538017021874

备份文件扫描文件名,有两个选择,一是基于字典,二是根据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输出.





# python  

tocToc: