python爬取工控行业漏洞心得

爬虫入门爬取工控行业漏洞

  • 欢迎来到TiezhuLee的CSDN
    • 流程
    • 完整代码如下
    • 谢谢

欢迎来到TiezhuLee的CSDN

你好!这个任务也是最近需要用到工控行业系统漏洞才去做的,然而爬取的时候可以说CNVD有着各种各样的反爬措施,以下是我的几点心得:
①CNVD需要cookies才能使用requests.get访问到。
②CNCD检测到你访问的频率过高就会自动断开你的连接,过一段时间再恢复。(本人亲自尝试发现即便是通过手动点击,再连续点击十几条之后也会被禁掉)
③设置访问间隔?本人给每次爬虫睡眠20s可是在爬了一段时间之后还是被禁
④IP代理池,本人未尝试,但是应该是有效的。

流程

上边说了这么多,你肯定还是懵逼的,当然我也懵逼,因为在尝试了很多次之后,我换了一种方法,那就是我发现有一个和官方网站信息同步的网站,二这个网站的反爬措施几乎没有,所以嘛,嘿嘿~
附上网址

http://ivd.winicssec.com/

接下来是我整个爬虫的逻辑过程:

  1. 通过观察我发现漏洞网址构成是http://ivd.winicssec.com/index.php/Home/Index/index/p/ + 页码 ,+ “.html”,因此我第一步就是构建所有要爬取的链接。
  2. 使用 etree.HTML 来解析返回的内容;
  3. 通过访问a标签来获取所有的详情页的链接,病使用list将其存起来nexturl = html.xpath(’//tbody//tr//td//a[contains(@class,“list_vulner_name txt_overflow”)]/@href’)
  4. **反爬机制出现:**其实也不能叫做反爬机制,但是对于像我这样的小白,确实是拥有不小的难度。

    漏洞类型: SQL注入

    其p标签拥有两块内容,如果直接使用text()那么会拿到所有的文本内容如sql注入这几个字,但是用span的class又只能爬到漏洞类型这几个字,经过研究我使用了如下几种方法获取不同的内容`
  5. item[‘标题’] = str(html.xpath(’//div[@class=“page-header”]/h1/text()’))
    item[‘漏洞类型’] = html.xpath(’//div[@class=“panel-body”]/p/span[text()=“漏洞类型:”]/…//text()’)[1]
    item[‘危险级别’] = html.xpath(’//div[@class=“panel-body”]/p/span[text()=“危险级别:”]/…//text()’)[1]
    item[‘CVE编号’] = html.xpath(’//div[@class=“panel-body”]/p/a[contains(@href,“cve”)]//text()’)
    item[‘CNVD编号’] = html.xpath(’//div[@class=“panel-body”]/p/a[contains(@href,“cnvd”)]//text()’)
    item[‘CNNVD编号’] = html.xpath(’//div[@class=“panel-body”]/p/a[contains(@href,“cnnvd”)]//text()’)
    item[‘发布时间’] = html.xpath(’//div[@class=“panel-body”]/p/span[text()=“发布时间:”]/…//text()’)[1]
    item[‘产品’] = ‘’.join([i.strip() for i in html.xpath(’//div[@class=“panel panel-success”]//div[text()=“受影响的平台和产品”]/following-sibling::[1]//p//text()’)])
    item[‘漏洞描述’] = ‘’.join([i.strip() for i in html.xpath(’//div[@class=“panel panel-success”]//div[text()=“漏洞描述”]/following-sibling::
    [1]//p//text()’)])
    item[‘解决方案’] = ‘’.join([i.strip() for i in html.xpath(’//div[@class=“panel panel-success”]//div[text()=“安全建议&解决方案”]/following-sibling:?[1]//text()’)])`;
  6. 将爬取内容存储到表格中;

完整代码如下

headers根据自己需要输入,配置对应的包即可使用。

// An highlighted block
import requests
from lxml import etree
from urllib.parse import urlencode
import pymysql
import time
import xlwt
import xlrd

def save_data(index, item, workbook):
    filename = '工程控制系统漏洞.xls'
    sheet = workbook.get_sheet('sheet1')  # 创建一个sheet表格
    for col, value in enumerate(item.values()):
        sheet.write(index, col, value)
    workbook.save(filename)
    print('保存成功')

def excel_prepare(heads):
    workbook = xlwt.Workbook()
    sheet = workbook.add_sheet('sheet1', cell_overwrite_ok=True)  # 创建一个sheet表格
    for col, value in enumerate(heads):
        sheet.write(0, col, value)
    return workbook

def makeurl(heads):
    # http://ics.cnvd.org.cn/?tdsourcetag=s_pctim_aiomsg&max=20&offset=0
    baseurl = 'http://ivd.winicssec.com'
    headers = {
        'User-Agent': '',
    }
    workbook = excel_prepare(heads)
    # filename = '工程控制系统漏洞.xls'
    index = 1
    list = []
    item = {}
    URLlist = []
    for i in range(1,355,1):
        print ('现在到达第' + str(i) + '页')
        Eurl = "http://ivd.winicssec.com/index.php/Home/Index/index/p/" + str(i) + ".html"
        resp = requests.get(Eurl, headers=headers)
        html = etree.HTML(resp.content)

        nexturl = html.xpath('//tbody//tr//td//a[contains(@class,"list_vulner_name txt_overflow")]/@href')
        for n in nexturl:
            list.append(n)
            print (n)
        for ele in list:
            print ('这是进来的index:' + str(index))
            print ('这是list的长度:' +str(len(list)))
            url = baseurl + ele
            response = requests.get(url, headers=headers)
            html = etree.HTML(response.text)
            item['url'] = url
            item['标题'] = str(html.xpath('//div[@class="page-header"]/h1/text()'))
            item['漏洞类型'] = html.xpath('//div[@class="panel-body"]/p/span[text()="漏洞类型:"]/..//text()')[1]
            item['危险级别'] = html.xpath('//div[@class="panel-body"]/p/span[text()="危险级别:"]/..//text()')[1]
            item['CVE编号'] = html.xpath('//div[@class="panel-body"]/p/a[contains(@href,"cve")]//text()')
            item['CNVD编号'] = html.xpath('//div[@class="panel-body"]/p/a[contains(@href,"cnvd")]//text()')
            item['CNNVD编号'] = html.xpath('//div[@class="panel-body"]/p/a[contains(@href,"cnnvd")]//text()')
            item['发布时间'] = html.xpath('//div[@class="panel-body"]/p/span[text()="发布时间:"]/..//text()')[1]
            item['产品'] = ''.join([i.strip() for i in html.xpath('//div[@class="panel panel-success"]//div[text()="受影响的平台和产品"]/following-sibling::*[1]//p//text()')])
            item['漏洞描述'] = ''.join([i.strip() for i in html.xpath('//div[@class="panel panel-success"]//div[text()="漏洞描述"]/following-sibling::*[1]//p//text()')])
            item['解决方案'] = ''.join([i.strip() for i in html.xpath('//div[@class="panel panel-success"]//div[text()="安全建议&解决方案"]/following-sibling::*[1]//text()')])
            # print ('这是链接:' + url)
            # print ('这是标题:' +item['标题'])
            # print (item['漏洞类型'])
            # print (item['危险级别'])
            # print (item['CVE编号'])
            # print (item['CNVD编号'])
            # print (item['CNNVD编号'])
            # print ('这是产品:' +item['产品'])
            # print ('这是漏洞描述:' +item['漏洞描述'])
            # print ('这是解决方案:' + item['解决方案'])
            print ('这是第' + str(index) + '条')
            save_data(index, item, workbook)
            index = index + 1
        del list[:]
        print ('这是清空后的list:' + str(len(list)))

    return item

if __name__ == '__main__':
    heads = ['url',
             '标题',
             '漏洞类型',
             '危险级别',
             'CVE编号',
             'CNVD编号',
             'CNNVD编号',
             '发布时间',
             '产品',
             '漏洞描述',
             '解决方案',
             ]
    makeurl(heads)

谢谢

你可能感兴趣的:(学习笔记)