python爬虫爬取补天公益SRC厂商

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pythonniu/article/details/76601908

00X0 前言

补天漏洞响应平台在七月份开始了新的活动,指定范围为公益SRC。无HACK 不兄弟
现在都八月份了,七月不刷洞八月方便面啊。趁着月初,赶紧把公益SRC的域名全部爬下来

01X0 准备活动

01X1 踩点分析

  • 公益厂商列表中可初步获取厂商的信息,此处发现显示的ID与点击提交漏洞后页面的ID一致。
    这里写图片描述
    此处的ID为59906,将鼠标再次悬浮在提交漏洞的链接上
    这里写图片描述
    两处的ID均相同。点击提交漏洞
    这里写图片描述
    从这里我们可以发现点击提交漏洞需要登录才能获取具体的信息(域名地址)

且经过一些信息收集后,发现厂商页面是由js在线生成的,所以不能直接爬取链接。

01X2 整体思路

先用游客身份爬取公益厂商列表中所有厂商的ID,然后登录补天账户获取对应的Cookies,进而遍历上一步获取的ID值再组合http://butian.360.cn/Loo/submit?cid=id链接获取每个厂商的域名信息
这里写图片描述

02x0 爬虫编写

02x1 准备环境

Python3.6
模块: requests
      BeautifulSoup
      json

02X2 关键请求

第一处为未登录厂商的一处请求,返回json数据可以遍历所有页数和厂商ID

这里写图片描述
这里写图片描述
其中 p代表当前页数,于是构造请求为
http://butian.360.cn/Reward/pub
post数据: s=1&p=1
另外一处地址为:
http://butian.360.cn/Reward/pub//Message/send
post数据一样

02x3 最终代码

import json
import requests
import time
from bs4 import BeautifulSoup

def spider():
    '''
    爬取所有公益厂商的ID
    保存为id.txt
    :return:
    '''
    headers = {
        'Host': 'butian.360.cn',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0',
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
        'Accept-Encoding': 'gzip, deflate',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'X-Requested-With': 'XMLHttpRequest',
        'Referer': 'http://butian.360.cn/Reward/pub//Message/send',
        'Cookie': 未登录时的Cookie,
        'Connection': 'keep-alive'
    }
    for i in range(1,149):
        data={
            'p': i,
            'token': ''
        }
        time.sleep(3)
        res = requests.post('http://butian.360.cn/Reward/pub/Message/send', data=data,headers=headers,timeout=(4,20))
        allResult = {}
        allResult = json.loads(res.text)
        currentPage = str(allResult['data']['current'])
        currentNum = str(len(allResult['data']['list']))
        print('正在获取第' + currentPage + '页厂商数据')
        print('本页共有' + currentNum + '条厂商')
        for num in range(int(currentNum)):
            print('厂商名字:'+allResult['data']['list'][int(num)]['company_name']+'\t\t厂商类型:'+allResult\
                  ['data']['list'][int(num)]['industry']+'\t\t厂商ID:'+allResult['data']['list'][int(num)]['company_id'])
            base='http://butian.360.cn/Loo/submit?cid='
            with open('id.txt','a') as f:
                f.write(base+allResult['data']['list'][int(num)]['company_id']+'\n')
def Url():
    '''
    遍历所有的ID
    取得对应的域名
    保存为target.txt
    :return:
    '''
    headers={
        'Host':'butian.360.cn',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
        'Accept-Encoding': 'gzip, deflate',
        'Referer':'http://butian.360.cn/Reward/pub',
        'Cookie':此处为账户登录后的Cookie,
        'Connection':'keep-alive',
        'Upgrade-Insecure-Requests': '1',
        'Cache-Control':'max-age=0'
    }
    with open('id.txt','r') as f:
        for target in f.readlines():
            target=target.strip()
            getUrl=requests.get(target,headers=headers,timeout=(4,20))
            result=getUrl.text
            info=BeautifulSoup(result,'lxml')
            url=info.find(name='input',attrs={"name":"host"})
            name = info.find(name='input', attrs={"name": "company_name"})
            lastUrl=url.attrs['value']
            print('厂商:' + name.attrs['value'] + '\t网址:' + url.attrs['value'])
            with open('target.txt','a') as t:
                t.write(lastUrl+'\n')
            time.sleep(3)
    print('The target is right!')
if __name__=='__main__':

    data = {
            's': '1',
            'p': '1',
            'token': ''
        }
    res = requests.post('http://butian.360.cn/Reward/pub/Message/send', data=data)
    allResult = {}
    allResult = json.loads(res.text)
    allPages = str(allResult['data']['count'])
    print('共' + allPages + '页')
    spider()
    Url()

03x0 效果图

第一步:
这里写图片描述
第二步:
这里写图片描述

没有更多推荐了,返回首页