title: 补天厂商数据爬虫
copyright: true
top: 0
date: 2019-07-11 23:04:53
tags: 爬虫
categories: 爬虫笔记
permalink:
password:
keywords: 补天爬虫
description: 一次简单的信息获取,尝试对补天厂商数据爬取
他希望快点完成这个交易,把后路给断了,没了后路就不用怕什么了,谁说的来着,想要翻过一堵高墙,最好的办法是先把自己的帽子扔过去,这样你自然就有了翻墙的决心。
补天的厂商分为专属SRC,公益SRC,以及一些以及收录但是不展示出来的厂商,本文将对这三种厂商信息进行爬取,然后对补天的一些漏洞数据进行可视化展示。
专属 SRC
专属 SRC 网址 : https://www.butian.net/Reward/plan
通过分析请求,发现数据是前端使用ajax动态获取
专属 SRC 接口 : https://www.butian.net/Reward/corps
请求方式 : POST
请求参数 :
data = {
's': '3',
'p': '2',
'sort': '2'
}
获取的数据是json格式,其中具体的数据在
jsons['data']['list']['host'] --> 域名
jsons['data']['list']['company_name'] --> 企业名称
使用代码进行获取与解析
import requests
def parse_data(jsons):
datas = (jsons['data'])
real_data = (datas['list'])
for d in real_data:
print(d['host'])
print(d['company_name'])
# 下面四行是保存数据,取消注释即可执行保存
# with open('企业域名.txt','a+',encoding='utf-8')as a:
# a.write(d['host'].replace('www.','')+'\n')
# with open('企业名称.txt','a+',encoding='utf-8')as a:
# a.write(d['company_name']+'\n')
url = 'https://www.butian.net/Reward/corps'
data = {
's': '3',
'p': '2',
'sort': '2'
}
r = requests.post(url=url, data=data)
parse_data(r.json())
返回结果:
然后将专属 SRC 的域名和企业名称保存即可,到这里补天的 专属 SRC 厂商信息获取完毕
公益 SRC
同上,先对公益 SRC 的信息进行探测,使用相同的方法得到公益 SRC 的接口
公益 SRC 接口 : https://www.butian.net/Reward/pub
请求方式 : POST
请求参数 :
data = {
's': '1',
'p': '1'
}
获取的数据是json格式,其中具体的数据在
jsons['data']['list']['company_name'] --> 企业名称
其中发现,通过修改 post 数据中的 p 参数,能够实现翻页功能,目前发现一共存在174页
可惜的是,在公益 SRC 提供的接口中,只有厂商的企业名称,并没有域名网址信息。
简单的尝试请求一下第一页获取数据:
import requests
def parse_data(jsons):
datas = (jsons['data'])
real_data = (datas['list'])
for d in real_data:
print(d['company_name'])
url = 'https://www.butian.net/Reward/pub'
data = {
's': '1',
'p': '1'
}
r = requests.post(url=url, data=data)
parse_data(r.json())
返回结果:
可以获取到数据,接下来只需要循环一下,即可获取到所有的 公益 SRC 企业名称
使用代码:
import requests
def parse_data(jsons):
datas = (jsons['data'])
real_data = (datas['list'])
for d in real_data:
print(d['company_name'])
# 下面两行的功能是保存数据,取消注释即可执行
# with open('企业名称.txt','a+',encoding='utf-8')as a:
# a.write(d['company_name']+'\n')
for i in range(1,175):
print('目前获取第 {} 页'.format(i))
url = 'https://www.butian.net/Reward/pub'
data = {
's': '1',
'p': i
}
r = requests.post(url=url, data=data)
try:
parse_data(r.json())
except Exception as e:
print(e)
返回结果:
需要注意的是,我这里并没有添加请求头headers,也没有设置cookie,但是补天并没有禁止我的数据爬取,如果出现获取不到信息,需要将自己的请求头和cookie添加进去,使用方法:
import requests
import re
import time
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh,zh-CN;q=0.9,en-US;q=0.8,en;q=0.7',
'Connection': 'keep-alive',
'Content-Length': '16',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': '这里改成你自己的cookie',
'Host': 'www.butian.net',
'Origin': 'https://www.butian.net',
'Referer': 'https://www.butian.net/Reward/plan',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
def parse_data(jsons):
datas = (jsons['data'])
real_data = (datas['list'])
for d in real_data:
print(d['company_name'])
# 下面两行的功能是保存数据,取消注释即可执行
# with open('企业名称.txt','a+',encoding='utf-8')as a:
# a.write(d['company_name']+'\n')
for i in range(1,175):
print('目前获取第 {} 页'.format(i))
url = 'https://www.butian.net/Reward/pub'
data = {
's': '1',
'p': i
}
r = requests.post(url=url, data=data)
try:
parse_data(r.json())
except Exception as e:
print(e)
到这里 公益 SRC 爬取完毕
其他 厂商 爬取
补天还有一些厂商,并没有出现在 企业和公益 SRC 中,获取的方式也比较独特,个人认为是补天数据安全策略没有做好。
首先需要注册一个补天账号,然后进入提交漏洞页面
提交网址 : https://www.butian.net/Loo/submit
按 F12,进入调试界面
然后在厂商名称输入框,输入 1
查看请求
可以看到后端数过来的数据,其中数据都是 **企业名称或者域名中带 1 **的企业信息
尝试对请求进行分析:
厂商 请求 接口 : https://www.butian.net/Home/Loo/getCompanyList
请求方式 : POST
请求参数 :
data = {
'token': 'b660ca4a609f28f575e8bb026e65cf706310cbbb',
'company_name': '1'
}
这里有两个地方必须要设置
第一个是请求头部分,这里需要cookie来伪装登陆状态
第二个是发送数据部分,这里需要这是口令token来确保每次请求的数据
获取的数据样式为:
获取的数据是json格式,其中具体的数据在
jsons['data']['company'] --> 企业名称
获取到的企业名称中,部分厂商返回的是 企业名称,另一部分返回的是厂商的域名
所以要做判断
因为涉及到多次的发起请求,所以为了不触发补天的反爬虫策略,每次请求后,随机等待一段时间
使用代码:
# -*- coding:utf-8 -*-
#__author__:langzi
#__blog__:www.langzi.fun
import requests
import time
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language':