批量场景-效率提升
搜索对象太多的话,怎么能批量完成搜索呢?
Q:使用高级搜索功能或者 or参数拼接多个site?
A:谷歌搜索的功能字符串限制不得超过32
办法:可以使用 自定义搜索引擎 来批量搜索结果~
详细步骤见 Custom Search JSON API:简介 | Programmable Search Engine | Google Developers - https://developers.google.com/custom-search/v1/introduction?hl=zh-cn
步骤:
1、注册谷歌账号、新建搜索引擎
https://programmablesearchengine.google.com/controlpanel/create
设置成功后会看见 https://programmablesearchengine.google.com/controlpanel/all 下的项目 即你自定义的搜索引擎
这个公开网址打开就是一个可用的引擎界面 不用python 直接用前端也行
【搜索内容限定】创建引擎时可以添加你的目标网站,添加时会校验是否符合规则,需要一个个加。接口抓包加不会生效的。
【概览-搜索设置-要搜索的网站】创建时如果你忘记设置限定网站,创建完成后仍可以设置该配置。可以接口抓包后批量改域名。
https://programmablesearchengine.google.com:443/_/PropaneUi/data/batchexecute?rpcids=&source-path=%2Fcontrolpanel%2Foverview
这样就可以不用管site啦 site在设置里控制 专注在查询参数上 次数也很够用了 适用于类型1
要排除的站点 也可以设置 相当于直接搜索 -site: 适用于类型2
2、获取key、管理 Google Search API 密钥
Google Cloud Console 控制台-左侧导航栏中选择 "API 和服务"- "凭据":可以通过限制IP地址等方式来避免被恶意盗用 其他ip调用会提示无权限 returned "The provided API key has an IP address restriction
保存好项目的CSE_ID 搜索引擎编号 和API_KEY 密钥
3、设置搜索功能
设置入口 https://programmablesearchengine.google.com/controlpanel/searchfeatures?cx=
【网页限制-实体】可以把搜索结果限制在与实体有关的页面上。(不过实体能匹配上的有限)
【高级搜索-网页搜索限制】
如果你的搜索引擎创建时没有限制搜索结果,在这里可以设置 限制输入1000长度字符串
为了减少搜索次数,每页结果数量设置成最大20
4、安装 Google API Python 客户端并使用 Google Search API 进行批量搜索
要使用v2版本的 https://github.com/googleapis/google-api-python-client/blob/main/UPGRADING.md
v1版本存在缓存读取异常 报错An error occurred: [Errno 2] No such file or directory 或 file_cache is only supported with oauth2client<4.0.0)
pip install --upgrade pip
pip install google-api-python-client==2.0.0
from googleapiclient.discovery import build
API_KEY =
CSE_ID =
CSE_ID_OUT =
storewebsites= ['','']
def google_search(search_term, **kwargs):
service = build('customsearch', 'v1', static_discovery=False, developerKey=API_KEY)
res = service.cse().list(q=search_term, cx=CSE_ID, **kwargs).execute()
print('搜索'+search_term)
if 'items' in res:
total_results = res['searchInformation']['totalResults']
print('搜索到 %s 个结果' % total_results)
results = res['items']
for result in results:
print('标题:', result['title'])
print('URL:', result['link'])
else:
# 处理搜索结果为空的情况
print('搜索结果为空')
if __name__ == '__main__':
#内网域名泄漏公网
querys = ['inurl:dev',
'inurl:test',
'inurl:admin',
'inurl:debug']
for query in querys:
google_search(query,CSE_ID,num=20)
#资源盗用
for storewebsite in storewebsites:
google_search_out('intext:'+storewebsite)
google_search_out('link to:' + storewebsite)
注意,Google Search API 只允许每天每个引擎免费请求100次,超过请求会返回异常 returned "Quota exceeded for quota metric 'Queries' and limit 'Queries per day' of service
调试的时候可以多新建几个引擎 搜索次数100*n~
详细的接口文档见 Method: cse.list | Custom Search JSON API | Google Developers - https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list?hl=zh-cn
接口返回的参数详见 https://developers.google.com/custom-search/v1/reference/rest/v1/Search?hl=zh-cn
其中针对场景1
list接口的参数相关的有
fileType 将结果限制为指定扩展名的文件-string
q 搜索关键字-string
num 每页返回的结果数量 (如果在引擎里已经手动设置了 在代码里就不能再设置 会报错
"Request contains an invalid argument.". Details: "[{'message': 'Request contains an invalid argument.', 'domain': 'global', 'reason': 'badRequest'}]">)
siteSearchFilter 控制是否包含或排除来自 siteSearch 参数中指定的网站的结果。-enum
可接受的值包括:
"e":排除
"i":包含
websites = ['a.com','b.com']
siteSearch = " ".join([f"site:{site}" for site in websites])
google_search(query, num=10, siteSearch=siteSearch, siteSearchFilter="i")
(但是这个参数怪怪的 好像没生效 搜索结果没有被限制住站点 建议从新建引擎那里就先限制好 不然次数很快就用完了)
num 搜索结果显示数量 默认10 支持1-20 如果返回结果很多 还需要分页获取
效果:可以通过定时任务 自动启动脚本 定期自动批量搜索 基本满足监控搜索引擎相关的风险
5、监控
可以查看接口的被使用情况 https://console.cloud.google.com/apis/api/customsearch.googleapis.com/metrics
课后作业
谷歌搜索的更新时间?
搜索结果能等同于公网资产吗?——不能
网站有robots.txt文件限制了谷歌的爬取。robots.txt是一个包含指令的文件,告诉搜索引擎哪些页面可以被抓取,哪些不能被抓取。如果一个网站的robots.txt文件中禁止谷歌爬取某些页面,那么这些页面就不会出现在谷歌搜索结果中。
网站新建不久,还没有被谷歌收录。谷歌在爬取新网站时需要一定的时间,如果网站新建不久,谷歌可能还没有来得及爬取。
网站被谷歌索引但排名很低。如果一个网站在搜索结果中排名很低,用户很难通过搜索找到它。可能需要优化网站的SEO,提高排名。
网站没有良好的内容和结构。如果一个网站缺少良好的内容和结构,谷歌就很难将其视为一个有价值的网站,自然也不会对其进行高度排名。
网站可能被谷歌误识别为不安全的网站,被谷歌封禁。如果网站被谷歌误识别为不安全的网站,谷歌就会封禁它,使得其不会出现在搜索结果中。
这个方式本身会不会造成信息泄漏?
当确认为信息泄漏后,如何处理可以取消收录?向搜索引擎主动提交更新收录源内容
反搜索引擎爬取的设置?
其他更多的搜索引擎呢?
其他搜索引擎无法收录的内容怎么办?
评论区