汇总:批量挖洞从收集信息到数据存储

优采云 发布时间: 2022-11-09 18:56

  汇总:批量挖洞从收集信息到数据存储

  单个 网站 的信息采集可能并不困难。有大量的一键式信息采集工具,比如oneforall,但是如果你面对11000个目标,如何采集信息?数据应该如何使用?

  现在很多同学都在挖坑,依赖一些网络空间的搜索引擎,比如zoomeye、fofa等。这些平台采集了很多网络空间的信息,包括IP、域名、端口、网站头部、正文和即使是指纹信息,在节省时间的同时,也让我们对自己产生了依赖,所以我们放弃了自己采集信息,因为自己做需要时间和精力,效果不一定好,技术能力也不一定能满足我们愿望。

  我们是否有必要从零开始采集大量的目标数据,并将数据存储起来随时使用?我觉得有必要,毕竟网络空间搜索引擎是面向整个网络空间的,我们只关注必要的目标。另外,赛博搜索引擎的数据也不是100%覆盖的,你要的数据还有很多,他却没有。

  

  信息采集的几个步骤并没有太多新东西,无非就是子域采集(暴力枚举、爬虫、赛博引擎)、端口扫描(nmap、masscan、自研脚本)、网站指纹几个步骤。说起来容易,但实际操作起来就没那么容易了。当您的目标是数千时,许多工具无法满足您的需求,或者需要花费大量时间。你该怎么办?需要具备一定的编码能力,使用成熟工具得到的结果,对不同的数据结果进行数据归一化处理,适配不同的工具,或者自己实现各种功能,设计开发自动化的信息采集工具。

  信息采集后,数据量非常惊人。如果把所有的数据都保存成文本格式,当你想在body中搜索某个关键词的时候,你会发现很慢,甚至会消耗系统。性能,这个时候,对数据进行处理并将其存储在数据库中是非常重要的。需要的时候可以直接搜索得到想要的结果,比如:

  光看上面的图片,你可能看不到任何东西。事实上,对于采集到的数据,关键是子域名、IP、端口、服务、指纹、waf的存在、网站头、网页内容等信息。所有网页内容都存储在数据库中,数据库会非常大。没有必要。可以存储网页内容的关键部分,如jquery等,可以根据自己的经验提取关键内容,方便后续提取相关目标进行批量漏洞测试。.

  最后分享一下我目前针对信息采集的数据设计的表结构:

  

  至于以后如何使用这些数据,可以关注校长路和知识星球的公众号。我将记录和分享这些数据的使用过程和功能。如果你也想拥有自己的信息库,一个网络空间的小数据库,可以参加校长之路最后一期的公益src实战训练营,自己采集你想要的数据,并将所有数据格式化,然后入库,备用。

  训练营相关内容:

  更多精彩内容,您可以扫描下方二维码,加入知识星球,注册成长平台,参与实战训练营:

  最新版:Python爬虫源码:微信公众号单页多音频MP3 批量采集提取保存音频文件

  目前,几种有效的微信公众号采集方式:

  1.通过网页端物料管理界面

  2. 从手机到Appium

  3. 通过逆向工程暴力获得

  4. 通过第三方服务接口

  5.搜狗微信公众号界面(降温)。

  个人和小团体一般在公众号内容数量较少的情况下,采用前两种相对简单、方便、低成本的方式来获取内容,不差钱的团队肯定会购买第三方服务,通过提供微信公众号采集界面来盈利的服务绝对是逆向工程。我介绍第一个,比较简单,适合小规模采集

  1.首先,我们需要注册一个我们自己的公众号平台微信公众号的注册地址

  2.注册成功后,进入物料管理,如图所示

  3. 单击“材料管理”,然后单击“新建图形消息”,如图所示

  4. 单击新的图形消息,然后单击超链接,如图所示

  5.点击解决超链接,点击选择其他公众账号如图所示

  6.此时,您可以输入我们要获取的公众号内容名称进行搜索和查询

  7. 我们通过捕获数据包进行查看和分析

  通过抓包来分析请求参数并不难,这就像我的截图,后面会在代码中呈现,然后你也可以通过请求响应内容看到标题、链接、摘要、更新时间等内容 这里我们主要拿标题和URL,我想说明一下,我们这样得到的链接是临时链接,不是永久链接链接在手机上打开,但是我们只需要通过访问临时链接来下载内容也无妨,这个临时链接的有效持续时间其实是很长的,如果我们想转换成永久链接我们可以打开手机获取永久链接地址

  获取代码流的一般概述

  1.调用登录功能login_wechat通过网盘扫码登录微信公众号,这里不使用账号密码自动登录,因为即使输入了账号密码,还是需要扫码确认

  2. 登录获取饼干信息,保存本地饼干.txt文件

  3. 调用 采集 函数get_content获取 cookie .txt的 cookie 值并提取令牌

  4、拼接好我们需要的请求参数后,在物料管理界面中请求我们等待采集的信息

  5、通过请求界面获取文章的标题和链接,实现翻页功能

  6.获取我们正在等待采集文章的链接,并请求链接地址以下载文章内容

  7. 将标题、链接和内容保存到 CSV 文件

  # -*- coding: utf-8 -*-

import re

import csv

import json

import time

import random

import requests

from selenium import webdriver

def login_wechat():

browser = webdriver.Chrome()

browser.get("https://mp.weixin.qq.com/")

time.sleep(2)

print("请拿手机扫码二维码登录公众号")

time.sleep(30)

print("登录成功")

# 获取cookies

cookie_items = browser.get_cookies()

post = {}

# 获取到的cookies是列表形式,将cookies转成json形式并存入本地名为cookie的文本中

for cookie_item in cookie_items:

post[cookie_item['name']] = cookie_item['value']

cookie_str = json.dumps(post)

with open('cookie.txt', 'w+', encoding='utf-8') as f:

f.write(cookie_str)

print("cookies信息已保存到本地")

browser.quit()

def get_content(ky):

<p>

# ky为要爬取的公众号名称

url = &#39;https://mp.weixin.qq.com&#39; # 公众号主页

header = {

"HOST": "mp.weixin.qq.com",

"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"

}

# 读取上一步获取到的cookies

with open(&#39;cookie.txt&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:

cookie = f.read()

cookies = json.loads(cookie)

# 增加重试连接次数

session = requests.Session()

session.keep_alive = False

# 增加重试连接次数

session.adapters.DEFAULT_RETRIES = 10

time.sleep(5)

# 登录之后的微信公众号首页url变化为:https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=657944522,从这里获取token信息

response = session.get(url=url, cookies=cookies)

token = re.findall(r&#39;token=(\d+)&#39;, str(response.url))[0]

time.sleep(2)

# 搜索微信公众号的接口地址

search_url = &#39;https://mp.weixin.qq.com/cgi-bin/searchbiz?&#39;

# 搜索微信公众号接口需要传入的参数,有三个变量:微信公众号token、随机数random、搜索的微信公众号名字

query_id = {

&#39;action&#39;: &#39;search_biz&#39;,

&#39;token&#39;: token,

&#39;lang&#39;: &#39;zh_CN&#39;,

&#39;f&#39;: &#39;json&#39;,

&#39;ajax&#39;: &#39;1&#39;,

&#39;random&#39;: random.random(),

&#39;query&#39;: ky,

&#39;begin&#39;: &#39;0&#39;,

&#39;count&#39;: &#39;5&#39;

}

# 打开搜索微信公众号接口地址,需要传入相关参数信息如:cookies、params、headers

search_response = session.get(search_url,cookies=cookies,headers=header,params=query_id)

# 取搜索结果中的第一个公众号

lists = search_response.json().get(&#39;list&#39;)[0]

print(lists)

# 获取这个公众号的fakeid,后面爬取公众号文章需要此字段

fakeid = lists.get(&#39;fakeid&#39;)

# 微信公众号文章接口地址

appmsg_url = &#39;https://mp.weixin.qq.com/cgi-bin/appmsg?&#39;

# 搜索文章需要传入几个参数:登录的公众号token、要爬取文章的公众号fakeid、随机数random

query_id_data = {

&#39;token&#39;: token,

&#39;lang&#39;: &#39;zh_CN&#39;,

&#39;f&#39;: &#39;json&#39;,

&#39;ajax&#39;: &#39;1&#39;,

&#39;random&#39;: random.random(),

&#39;action&#39;: &#39;list_ex&#39;,

&#39;begin&#39;: &#39;0&#39;, # 不同页,此参数变化,变化规则为每页加5

&#39;count&#39;: &#39;5&#39;,

&#39;query&#39;: &#39;&#39;,

&#39;fakeid&#39;: fakeid,

&#39;type&#39;: &#39;9&#39;

}

# 打开搜索的微信公众号文章列表页

appmsg_response = session.get(appmsg_url,cookies=cookies,headers=header,params=query_id_data)

# 获取文章总数

max_num = appmsg_response.json().get(&#39;app_msg_cnt&#39;)

  

# 每页至少有5条,获取文章总的页数,爬取时需要分页爬

num = int(int(max_num) / 5)

print(num)

# 起始页begin参数,往后每页加5

begin = 0

seq = 0

while num + 1 > 0:

query_id_data = {

&#39;token&#39;: token,

&#39;lang&#39;: &#39;zh_CN&#39;,

&#39;f&#39;: &#39;json&#39;,

&#39;ajax&#39;: &#39;1&#39;,

&#39;random&#39;: random.random(),

&#39;action&#39;: &#39;list_ex&#39;,

&#39;begin&#39;: &#39;{}&#39;.format(str(begin)),

&#39;count&#39;: &#39;5&#39;,

&#39;query&#39;: &#39;&#39;,

&#39;fakeid&#39;: fakeid,

&#39;type&#39;: &#39;9&#39;

}

print(&#39;正在翻页:--------------&#39;, begin/5)

time.sleep(8)

# 获取每一页文章的标题和链接地址,并写入本地文本中

query_fakeid_response = session.get(appmsg_url,cookies=cookies,headers=header,params=query_id_data)

fakeid_list = query_fakeid_response.json().get(&#39;app_msg_list&#39;)

if fakeid_list:

for item in fakeid_list:

content_link = item.get(&#39;link&#39;)

content_title = item.get(&#39;title&#39;)

fileName = ky + &#39;.txt&#39;

seq += 1

content_body = session.get(content_link).text

info = [content_title, content_link, content_body]

save(ky,info)

begin = int(begin)

begin += 5

# csv head

def csv_head(ky):

ky = ky

head = [&#39;content_title&#39;, &#39;content_link&#39;, &#39;content_body&#39;,]

csvFile = open(fr&#39;{ky}.csv&#39;, &#39;w&#39;, newline=&#39;&#39;, encoding=&#39;utf-8-sig&#39;) # 设置newline,否则两行之间会空一行

writer = csv.writer(csvFile)

writer.writerow(head)

csvFile.close()

# 存储csv

def save(ky,info):

ky = ky

csvFile = open(fr&#39;{ky}.csv&#39;, &#39;a+&#39;, newline=&#39;&#39;, encoding=&#39;utf-8-sig&#39;) # 设置newline,否则两行之间会空一行

writer = csv.writer(csvFile)

writer.writerow(info)

csvFile.close()

if __name__ == &#39;__main__&#39;:

ky = &#39;肯德基&#39;

login_wechat()

csv_head(ky)

get_content(ky)

</p>

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线