自動(dòng)采集編寫(xiě)
小程序開(kāi)發(fā)(1): 使用scrapy采集數據
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 353 次瀏覽 ? 2020-08-06 15:21
農歷新年后,我一直在業(yè)余時(shí)間獨立開(kāi)發(fā)一個(gè)小程序. 主要數據是8000多個(gè)視頻和10000多個(gè)文章,并且每天都會(huì )自動(dòng)更新數據.
我將整理整個(gè)開(kāi)發(fā)過(guò)程中遇到的問(wèn)題和一些細節. 因為內容會(huì )更多,所以我將其分為三到四篇文章. 本文是該系列的第一篇文章,內容為python reptile.
本系列文章將大致介紹內容:
數據準備(python scrapy框架)
接口準備(nodejs的hapijs框架)
小型程序開(kāi)發(fā)(小型程序隨附的mpvue和組件等)
在線(xiàn)部署(小程序安全性域名以及其他配置和爬網(wǎng)程序/界面在線(xiàn)部署和維護)
數據采集
有很多方法可以獲取數據. 這次我們選擇了采集器方法. 當然,您可以使用不同的語(yǔ)言和不同的方式編寫(xiě)爬蟲(chóng). 我以前寫(xiě)過(guò)很多爬蟲(chóng),這次我們選擇了python的scrapy庫. 關(guān)于scrapy,百度百科解釋如下:
Scrapy是Python開(kāi)發(fā)的一種快速的高級屏幕抓取和Web抓取框架,用于抓取網(wǎng)站并從頁(yè)面提取結構化數據. Scrapy用途廣泛,可用于數據挖掘,監視和自動(dòng)化測試.
學(xué)習scrapy的最好方法是先閱讀文檔(Scrapy 1.6文檔),然后根據文檔中的示例進(jìn)行編寫(xiě),您將逐漸熟悉它. 有幾個(gè)重要的概念必須理解:
物品
官方對items的定義是“The main goal in scraping is to extract structured data from unstructured sources, typically, web pages.”,個(gè)人理解為數據結構,也就是要爬取數據的字段,最好能和數據庫字段對應,便于入庫。
蜘蛛
“Spiders are classes which define how a certain site (or a group of sites) will be scraped, including how to perform the crawl (i.e. follow links) and how to extract structured data from their pages (i.e. scraping items). ”,也就是爬蟲(chóng)比較核心的內容,定義爬蟲(chóng)的方式,一些策略,以及獲取那些字段等等。
管道
“蜘蛛抓取了一個(gè)項目之后,將其發(fā)送到項目管道,該管道通過(guò)依次執行的幾個(gè)組件對其進(jìn)行處理. ”,管道是我們的采集器在獲取數據后將執行的處理操作,例如可以在此處進(jìn)行操作. 如寫(xiě)入文件或鏈接到數據庫,然后保存到數據庫等.
選擇器
“When you’re scraping web pages, the most common task you need to perform is to extract data from the HTML source. ”,這部分就是如何解析html,從爬取到的html文件中解析出所需的數據,可以使用BeautifulSoup、lxml、Xpath、CSS等方法。
上面已經(jīng)解釋了幾個(gè)重要的部分.
準備環(huán)境(python3 / scrapy等),我們可以編寫(xiě)一個(gè)爬蟲(chóng)項目.
抓取的內容來(lái)自此網(wǎng)站.
創(chuàng )建項目
scrapy startproject jqhtml
修改項目
添加采集器
爬行器爬行器
編寫(xiě)管道以修改配置文件
?這樣我們就順利地完成了爬蟲(chóng)項目的編寫(xiě)。運行下,發(fā)現數據全部存到了數據庫中。
部署scrapy爬蟲(chóng)項目
對于scrapy crawler項目的部署,我們可以使用官方scrapyd,并且使用方法相對簡(jiǎn)單. 在服務(wù)器上安裝scrapyd并啟動(dòng)它,然后在本地項目中配置部署路徑,在本地安裝scrapy-client并使用命令deploy可以部署到服務(wù)器.
Scrapyd提供了一些api界面來(lái)查看項目采集器的狀態(tài),并執行或停止采集器.
因此,我們可以輕松調整這些界面來(lái)管理抓取工具任務(wù).
注意:
如何將scrapyd部署到服務(wù)器上如何將scrapyd設置為系統后臺服務(wù)和系統啟動(dòng)項
下一個(gè)
在下一篇文章中,我們將介紹并使用非常流行的nodejs背景api庫-hapijs. 完成applet所需的所有接口的開(kāi)發(fā),并使用定時(shí)任務(wù)執行采集器腳本. 查看全部
我將整理整個(gè)開(kāi)發(fā)過(guò)程中遇到的問(wèn)題和一些細節. 因為內容會(huì )更多,所以我將其分為三到四篇文章. 本文是該系列的第一篇文章,內容為python reptile.
本系列文章將大致介紹內容:
數據準備(python scrapy框架)
接口準備(nodejs的hapijs框架)
小型程序開(kāi)發(fā)(小型程序隨附的mpvue和組件等)
在線(xiàn)部署(小程序安全性域名以及其他配置和爬網(wǎng)程序/界面在線(xiàn)部署和維護)
數據采集
有很多方法可以獲取數據. 這次我們選擇了采集器方法. 當然,您可以使用不同的語(yǔ)言和不同的方式編寫(xiě)爬蟲(chóng). 我以前寫(xiě)過(guò)很多爬蟲(chóng),這次我們選擇了python的scrapy庫. 關(guān)于scrapy,百度百科解釋如下:
Scrapy是Python開(kāi)發(fā)的一種快速的高級屏幕抓取和Web抓取框架,用于抓取網(wǎng)站并從頁(yè)面提取結構化數據. Scrapy用途廣泛,可用于數據挖掘,監視和自動(dòng)化測試.
學(xué)習scrapy的最好方法是先閱讀文檔(Scrapy 1.6文檔),然后根據文檔中的示例進(jìn)行編寫(xiě),您將逐漸熟悉它. 有幾個(gè)重要的概念必須理解:
物品
官方對items的定義是“The main goal in scraping is to extract structured data from unstructured sources, typically, web pages.”,個(gè)人理解為數據結構,也就是要爬取數據的字段,最好能和數據庫字段對應,便于入庫。
蜘蛛
“Spiders are classes which define how a certain site (or a group of sites) will be scraped, including how to perform the crawl (i.e. follow links) and how to extract structured data from their pages (i.e. scraping items). ”,也就是爬蟲(chóng)比較核心的內容,定義爬蟲(chóng)的方式,一些策略,以及獲取那些字段等等。
管道
“蜘蛛抓取了一個(gè)項目之后,將其發(fā)送到項目管道,該管道通過(guò)依次執行的幾個(gè)組件對其進(jìn)行處理. ”,管道是我們的采集器在獲取數據后將執行的處理操作,例如可以在此處進(jìn)行操作. 如寫(xiě)入文件或鏈接到數據庫,然后保存到數據庫等.
選擇器
“When you’re scraping web pages, the most common task you need to perform is to extract data from the HTML source. ”,這部分就是如何解析html,從爬取到的html文件中解析出所需的數據,可以使用BeautifulSoup、lxml、Xpath、CSS等方法。
上面已經(jīng)解釋了幾個(gè)重要的部分.
準備環(huán)境(python3 / scrapy等),我們可以編寫(xiě)一個(gè)爬蟲(chóng)項目.
抓取的內容來(lái)自此網(wǎng)站.
創(chuàng )建項目
scrapy startproject jqhtml
修改項目
添加采集器
爬行器爬行器
編寫(xiě)管道以修改配置文件
?這樣我們就順利地完成了爬蟲(chóng)項目的編寫(xiě)。運行下,發(fā)現數據全部存到了數據庫中。
部署scrapy爬蟲(chóng)項目
對于scrapy crawler項目的部署,我們可以使用官方scrapyd,并且使用方法相對簡(jiǎn)單. 在服務(wù)器上安裝scrapyd并啟動(dòng)它,然后在本地項目中配置部署路徑,在本地安裝scrapy-client并使用命令deploy可以部署到服務(wù)器.
Scrapyd提供了一些api界面來(lái)查看項目采集器的狀態(tài),并執行或停止采集器.
因此,我們可以輕松調整這些界面來(lái)管理抓取工具任務(wù).
注意:
如何將scrapyd部署到服務(wù)器上如何將scrapyd設置為系統后臺服務(wù)和系統啟動(dòng)項
下一個(gè)
在下一篇文章中,我們將介紹并使用非常流行的nodejs背景api庫-hapijs. 完成applet所需的所有接口的開(kāi)發(fā),并使用定時(shí)任務(wù)執行采集器腳本. 查看全部
農歷新年后,我一直在業(yè)余時(shí)間獨立開(kāi)發(fā)一個(gè)小程序. 主要數據是8000多個(gè)視頻和10000多個(gè)文章,并且每天都會(huì )自動(dòng)更新數據.
我將整理整個(gè)開(kāi)發(fā)過(guò)程中遇到的問(wèn)題和一些細節. 因為內容會(huì )更多,所以我將其分為三到四篇文章. 本文是該系列的第一篇文章,內容為python reptile.
本系列文章將大致介紹內容:
數據準備(python scrapy框架)
接口準備(nodejs的hapijs框架)
小型程序開(kāi)發(fā)(小型程序隨附的mpvue和組件等)
在線(xiàn)部署(小程序安全性域名以及其他配置和爬網(wǎng)程序/界面在線(xiàn)部署和維護)
數據采集
有很多方法可以獲取數據. 這次我們選擇了采集器方法. 當然,您可以使用不同的語(yǔ)言和不同的方式編寫(xiě)爬蟲(chóng). 我以前寫(xiě)過(guò)很多爬蟲(chóng),這次我們選擇了python的scrapy庫. 關(guān)于scrapy,百度百科解釋如下:
Scrapy是Python開(kāi)發(fā)的一種快速的高級屏幕抓取和Web抓取框架,用于抓取網(wǎng)站并從頁(yè)面提取結構化數據. Scrapy用途廣泛,可用于數據挖掘,監視和自動(dòng)化測試.
學(xué)習scrapy的最好方法是先閱讀文檔(Scrapy 1.6文檔),然后根據文檔中的示例進(jìn)行編寫(xiě),您將逐漸熟悉它. 有幾個(gè)重要的概念必須理解:
物品
官方對items的定義是“The main goal in scraping is to extract structured data from unstructured sources, typically, web pages.”,個(gè)人理解為數據結構,也就是要爬取數據的字段,最好能和數據庫字段對應,便于入庫。
蜘蛛
“Spiders are classes which define how a certain site (or a group of sites) will be scraped, including how to perform the crawl (i.e. follow links) and how to extract structured data from their pages (i.e. scraping items). ”,也就是爬蟲(chóng)比較核心的內容,定義爬蟲(chóng)的方式,一些策略,以及獲取那些字段等等。
管道
“蜘蛛抓取了一個(gè)項目之后,將其發(fā)送到項目管道,該管道通過(guò)依次執行的幾個(gè)組件對其進(jìn)行處理. ”,管道是我們的采集器在獲取數據后將執行的處理操作,例如可以在此處進(jìn)行操作. 如寫(xiě)入文件或鏈接到數據庫,然后保存到數據庫等.
選擇器
“When you’re scraping web pages, the most common task you need to perform is to extract data from the HTML source. ”,這部分就是如何解析html,從爬取到的html文件中解析出所需的數據,可以使用BeautifulSoup、lxml、Xpath、CSS等方法。
上面已經(jīng)解釋了幾個(gè)重要的部分.
準備環(huán)境(python3 / scrapy等),我們可以編寫(xiě)一個(gè)爬蟲(chóng)項目.
抓取的內容來(lái)自此網(wǎng)站.
創(chuàng )建項目
scrapy startproject jqhtml
修改項目
添加采集器
爬行器爬行器
編寫(xiě)管道以修改配置文件
?這樣我們就順利地完成了爬蟲(chóng)項目的編寫(xiě)。運行下,發(fā)現數據全部存到了數據庫中。
部署scrapy爬蟲(chóng)項目
對于scrapy crawler項目的部署,我們可以使用官方scrapyd,并且使用方法相對簡(jiǎn)單. 在服務(wù)器上安裝scrapyd并啟動(dòng)它,然后在本地項目中配置部署路徑,在本地安裝scrapy-client并使用命令deploy可以部署到服務(wù)器.
Scrapyd提供了一些api界面來(lái)查看項目采集器的狀態(tài),并執行或停止采集器.
因此,我們可以輕松調整這些界面來(lái)管理抓取工具任務(wù).
注意:
如何將scrapyd部署到服務(wù)器上如何將scrapyd設置為系統后臺服務(wù)和系統啟動(dòng)項
下一個(gè)
在下一篇文章中,我們將介紹并使用非常流行的nodejs背景api庫-hapijs. 完成applet所需的所有接口的開(kāi)發(fā),并使用定時(shí)任務(wù)執行采集器腳本.
Python大法之告別腳本小子系列—各類(lèi)URL采集器編寫(xiě)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 450 次瀏覽 ? 2020-08-04 19:05
本文作者:i春秋簽約作家——阿甫哥哥
系列文章專(zhuān)輯:
0×00 前言
URl采集在批量刷洞中也是很重要的
0×01 目錄
0×01 前言
0×02 ZoomEyeAPI腳本編寫(xiě)
0×03 ShoDanAPI腳本編寫(xiě)
0×04 簡(jiǎn)易BaiduURL采集腳本編寫(xiě)
0×05 【彩蛋篇】論壇自動(dòng)簽到腳本
0×02 ZoomEyeAPI腳本編寫(xiě)
ZoomEye是一款對于網(wǎng)絡(luò )空間的搜索引擎,收錄了互聯(lián)網(wǎng)空間中的設備、網(wǎng)站及其使用的服務(wù)或組件等信息。
ZoomEye 擁有兩大探測引擎:Xmap 和 Wmap,分別對于網(wǎng)絡(luò )空間中的設備及網(wǎng)站, 通過(guò) 24 小時(shí)不間斷的偵測、識別,標識出互聯(lián)網(wǎng)設備及網(wǎng)站所使用的服務(wù)及部件。 研究人員可以通過(guò) ZoomEye 方便的了解組件的普及率及漏洞的危害范圍等信息。
雖然被稱(chēng)為 “黑客友好” 的搜索引擎,但 ZoomEye 并不會(huì )主動(dòng)對網(wǎng)絡(luò )設備、網(wǎng)站發(fā)起攻擊,收錄的數據也僅用于安全研究。ZoomEye更像是互聯(lián)網(wǎng)空間的一張航海圖。
ZoomEyeAPI參考手冊在這:ZoomEye API 參考手冊
先登錄,然后獲得access_token
#-*- coding: UTF-8 -*-
?
import requests
import json
?
user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
if __name__ == '__main__':
????print Login()
然后,API手冊是這樣寫(xiě)的,根據這個(gè),咱們先寫(xiě)一個(gè)HOST的單頁(yè)面采集的….
#-*- coding: UTF-8 -*-
?
import requests
import json
?
user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search():
????headers = {'Authorization': 'JWT ' + Login()}
????r = requests.get(url = 'https://api.zoomeye.org/host/search?query=tomcat&page=1',
?????????????????????????headers = headers)
????response = json.loads(r.text)
????print response
if __name__ == '__main__':
????search()
返回的信息量極大啊,但它只是個(gè)JSON數據,SO,我們可以取出IP部分…
for x in response['matches']:
????????print x['ip']
之后,HOST的單頁(yè)面采集也就OK了,WEB的也五五開(kāi),留著(zhù)他們自己分析,其實(shí)差不多,后文會(huì )貼的
接下來(lái),就是用FOR循環(huán)….獲取多頁(yè)的IP
#-*- coding: UTF-8 -*-
?
import requests
import json
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search():
????headers = {'Authorization': 'JWT ' + Login()}
????for i in range(1,int(PAGECOUNT)):
????????r = requests.get(url = 'https://api.zoomeye.org/host/search?query=tomcat&page='+str(i),
?????????????????????????headers = headers)
????????response = json.loads(r.text)
????????for x in response['matches']:
????????????print x['ip']
if __name__ == '__main__':
????user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
????passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
????PAGECOUNT = raw_input('[-] PLEASE INPUT YOUR SEARCH_PAGE_COUNT(eg:10):')
????search()
這樣就取出了你想要的頁(yè)碼的數據,然后就是完善+美觀(guān)代碼了…..
#-*- coding: UTF-8 -*-
?
import requests
import json
?
def Login(user,passwd):
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search(queryType,queryStr,PAGECOUNT,user,passwd):
????headers = {'Authorization': 'JWT ' + Login(user,passwd)}
????for i in range(1,int(PAGECOUNT)):
????????r = requests.get(url = 'https://api.zoomeye.org/'+ queryType +'/search?query='+queryStr+'&page=' + str(i),
?????????????????????????headers = headers)
????????response = json.loads(r.text)
????????try:
????????????if queryType == "host":
????????????????for x in response['matches']:
????????????????????print x['ip']
????????????if queryType == "web":
????????????????for x in response['matches']:
????????????????????print x['ip'][0]
????????except KeyError:
????????????print "[ERROR] No hosts found"
?????
def main():
????print " _____???????????????????? _____?????????? ____? "???????????????
????print "|__? /___?? ___? _ __ ___ | ____|?? _? ___/ ___|? ___ __ _ _ __"?
????print "? / // _ \ / _ \| '_ ` _ \|? _|| | | |/ _ \___ \ / __/ _` | '_ \ "
????print " / /| (_) | (_) | | | | | | |__| |_| |? __/___) | (_| (_| | | | |"
????print "/____\___/ \___/|_| |_| |_|_____\__, |\___|____/ \___\__,_|_| |_|"
????print "??????????????????????????????? |___/??????????????????????????? "
????user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
????passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
????PAGECOUNT = raw_input('[-] PLEASE INPUT YOUR SEARCH_PAGE_COUNT(eg:10):')
????queryType = raw_input('[-] PLEASE INPUT YOUR SEARCH_TYPE(eg:web/host):')
????queryStr = raw_input('[-] PLEASE INPUT YOUR KEYWORD(eg:tomcat):')
????Login(user,passwd)
????search(queryType,queryStr,PAGECOUNT,user,passwd)
if __name__ == '__main__':
????main()
0×03 ShoDanAPI腳本編寫(xiě)
Shodan是互聯(lián)網(wǎng)上更可怕的搜索引擎。
CNNMoney的一篇文章寫(xiě)道,雖然現今人們都覺(jué)得谷歌是最強勁的搜索引擎,但Shodan才是互聯(lián)網(wǎng)上更可怕的搜索引擎。
與谷歌不同的是,Shodan不是在網(wǎng)上搜索網(wǎng)址,而是直接處于互聯(lián)網(wǎng)的背后通道。Shodan可以說(shuō)是一款“黑暗”谷歌,一刻不停的在尋求著(zhù)所有跟互聯(lián)網(wǎng)關(guān)聯(lián)的服務(wù)器、攝像頭、打印機、路由器等等。每個(gè)月Shodan都會(huì )在大概5億個(gè)服務(wù)器上日夜不停地搜集信息。
Shodan所收集到的信息是非常驚人的。凡是鏈接至互聯(lián)網(wǎng)的紅綠燈、安全攝像頭、家庭自動(dòng)化設備以及加熱系統等等都會(huì )被輕易的搜索到。Shodan的使用者曾發(fā)現過(guò)一個(gè)水上公園的控制系統,一個(gè)加油站,甚至一個(gè)酒店的葡萄酒冷卻器。而網(wǎng)站的研究者也曾使用Shodan定位到了核電站的指揮跟控制系統及一個(gè)粒子回旋加速器。
Shodan真正值得注意的能力就是能找到幾乎所有跟互聯(lián)網(wǎng)相關(guān)聯(lián)的東西。而Shodan真正的可怕之處就是這些設備幾乎都沒(méi)有安裝安全攻擊措施,其可以隨意進(jìn)入。
淺安dalao寫(xiě)過(guò),介紹的也更具體…..
地址傳送門(mén):基于ShodanApi接口的讀取python版
先說(shuō)基于A(yíng)PI查詢(xún)。。。官方文檔:
每次查詢(xún)要扣除1積分…..,而用shodan庫模塊不需要….
寫(xiě)個(gè)簡(jiǎn)單的,他和Zoomeye的五五開(kāi),就不細寫(xiě)了…
#-*- coding: UTF-8 -*-
import requests
import json
?
def getip():
????????API_KEY = *************
????????url = 'https://api.shodan.io/shodan/host/search?key='+API_KEY+'&query=apache'
????????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????????req = requests.get(url=url,headers=headers)
????????content = json.loads(req.text)
????????for i in content['matches']:
????????????????print i['ip_str']
if __name__ == '__main__':
????????getip()
接下來(lái),就是基于shodan模塊的…直接引用淺安dalao的。。。我沒(méi)法寫(xiě)….
安裝:pip install shodan
#-*- coding: UTF-8 -*-
import shodan
import sys
API_KEY = ‘YOU_API_KEY’ #調用shodan api
FACETS = [
????????('country',100), # 匹配出前一百位的國家數量,100可自定義
]
FACET_TITLES = {
????'country': 'Top 100 Countries',
}
#輸入判斷
if len(sys.argv) == 1:
????print 'Search Method:Input the %s and then the keyword' % sys.argv[0]
????sys.exit()
try:
????api = shodan.Shodan(API_KEY)
????query = ' '.join(sys.argv[1:])
????print "You Search is:" + query
????result = api.count(query, facets=FACETS) # 使用count比search快
????for facet in result['facets']:
????????print FACET_TITLES[facet]
????????for key in result['facets'][facet]:
?????????????????countrie = '%s :? %s' % (key['value'], key['count'])
?????????????????print countrie
?????????????????with open(u"搜索" + " " + query + " " + u"關(guān)鍵字" +'.txt','a+') as f:
????????????????????????????f.write(countrie +"\n")
????????????????????????????f.close()
????????print " "
????????print "save is coutures.txt"????????
????????print "Search is Complete."
except Exception, e:
????print 'Error: %s' % e
0×04 簡(jiǎn)易BaiduURL采集腳本編寫(xiě)
先是爬去單頁(yè)的URL,舉個(gè)栗子是爬去阿甫哥哥這個(gè)關(guān)鍵字的URL
#-*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoup as bs
import re
def getfromBaidu(word):
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????url = 'https://www.baidu.com.cn/s?wd=' + word + '&pn=1'
????html = requests.get(url=url,headers=headers,timeout=5)
????soup = bs(html.content, 'lxml', from_encoding='utf-8')
????bqs = soup.find_all(name='a', attrs={'data-click':re.compile(r'.'), 'class':None})
????for i in bqs:
????????????r = requests.get(i['href'], headers=headers, timeout=5)
????????????print r.url
if __name__ == '__main__':
????getfromBaidu('阿甫哥哥')
然后是多頁(yè)的爬取,比如爬取前20頁(yè)的
#-*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoup as bs
import re
def getfromBaidu(word,pageout):
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????for k in range(0,(pageout-1)*10,10):
????????????url = 'https://www.baidu.com.cn/s?wd=' + word + '&pn=' + str(k)
????????html = requests.get(url=url,headers=headers,timeout=5)
????????soup = bs(html.content, 'lxml', from_encoding='utf-8')
????????bqs = soup.find_all(name='a', attrs={'data-click':re.compile(r'.'), 'class':None})
????????????for i in bqs:
????????????????????r = requests.get(i['href'], headers=headers, timeout=5)
????????????????????print r.url
if __name__ == '__main__':
????getfromBaidu('阿甫哥哥',10)
0×05 【彩蛋篇】論壇自動(dòng)簽到腳本 查看全部
系列文章專(zhuān)輯:
0×00 前言
URl采集在批量刷洞中也是很重要的
0×01 目錄
0×01 前言
0×02 ZoomEyeAPI腳本編寫(xiě)
0×03 ShoDanAPI腳本編寫(xiě)
0×04 簡(jiǎn)易BaiduURL采集腳本編寫(xiě)
0×05 【彩蛋篇】論壇自動(dòng)簽到腳本
0×02 ZoomEyeAPI腳本編寫(xiě)
ZoomEye是一款對于網(wǎng)絡(luò )空間的搜索引擎,收錄了互聯(lián)網(wǎng)空間中的設備、網(wǎng)站及其使用的服務(wù)或組件等信息。
ZoomEye 擁有兩大探測引擎:Xmap 和 Wmap,分別對于網(wǎng)絡(luò )空間中的設備及網(wǎng)站, 通過(guò) 24 小時(shí)不間斷的偵測、識別,標識出互聯(lián)網(wǎng)設備及網(wǎng)站所使用的服務(wù)及部件。 研究人員可以通過(guò) ZoomEye 方便的了解組件的普及率及漏洞的危害范圍等信息。
雖然被稱(chēng)為 “黑客友好” 的搜索引擎,但 ZoomEye 并不會(huì )主動(dòng)對網(wǎng)絡(luò )設備、網(wǎng)站發(fā)起攻擊,收錄的數據也僅用于安全研究。ZoomEye更像是互聯(lián)網(wǎng)空間的一張航海圖。
ZoomEyeAPI參考手冊在這:ZoomEye API 參考手冊
先登錄,然后獲得access_token
#-*- coding: UTF-8 -*-
?
import requests
import json
?
user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
if __name__ == '__main__':
????print Login()
然后,API手冊是這樣寫(xiě)的,根據這個(gè),咱們先寫(xiě)一個(gè)HOST的單頁(yè)面采集的….
#-*- coding: UTF-8 -*-
?
import requests
import json
?
user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search():
????headers = {'Authorization': 'JWT ' + Login()}
????r = requests.get(url = 'https://api.zoomeye.org/host/search?query=tomcat&page=1',
?????????????????????????headers = headers)
????response = json.loads(r.text)
????print response
if __name__ == '__main__':
????search()
返回的信息量極大啊,但它只是個(gè)JSON數據,SO,我們可以取出IP部分…
for x in response['matches']:
????????print x['ip']
之后,HOST的單頁(yè)面采集也就OK了,WEB的也五五開(kāi),留著(zhù)他們自己分析,其實(shí)差不多,后文會(huì )貼的
接下來(lái),就是用FOR循環(huán)….獲取多頁(yè)的IP
#-*- coding: UTF-8 -*-
?
import requests
import json
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search():
????headers = {'Authorization': 'JWT ' + Login()}
????for i in range(1,int(PAGECOUNT)):
????????r = requests.get(url = 'https://api.zoomeye.org/host/search?query=tomcat&page='+str(i),
?????????????????????????headers = headers)
????????response = json.loads(r.text)
????????for x in response['matches']:
????????????print x['ip']
if __name__ == '__main__':
????user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
????passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
????PAGECOUNT = raw_input('[-] PLEASE INPUT YOUR SEARCH_PAGE_COUNT(eg:10):')
????search()
這樣就取出了你想要的頁(yè)碼的數據,然后就是完善+美觀(guān)代碼了…..
#-*- coding: UTF-8 -*-
?
import requests
import json
?
def Login(user,passwd):
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search(queryType,queryStr,PAGECOUNT,user,passwd):
????headers = {'Authorization': 'JWT ' + Login(user,passwd)}
????for i in range(1,int(PAGECOUNT)):
????????r = requests.get(url = 'https://api.zoomeye.org/'+ queryType +'/search?query='+queryStr+'&page=' + str(i),
?????????????????????????headers = headers)
????????response = json.loads(r.text)
????????try:
????????????if queryType == "host":
????????????????for x in response['matches']:
????????????????????print x['ip']
????????????if queryType == "web":
????????????????for x in response['matches']:
????????????????????print x['ip'][0]
????????except KeyError:
????????????print "[ERROR] No hosts found"
?????
def main():
????print " _____???????????????????? _____?????????? ____? "???????????????
????print "|__? /___?? ___? _ __ ___ | ____|?? _? ___/ ___|? ___ __ _ _ __"?
????print "? / // _ \ / _ \| '_ ` _ \|? _|| | | |/ _ \___ \ / __/ _` | '_ \ "
????print " / /| (_) | (_) | | | | | | |__| |_| |? __/___) | (_| (_| | | | |"
????print "/____\___/ \___/|_| |_| |_|_____\__, |\___|____/ \___\__,_|_| |_|"
????print "??????????????????????????????? |___/??????????????????????????? "
????user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
????passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
????PAGECOUNT = raw_input('[-] PLEASE INPUT YOUR SEARCH_PAGE_COUNT(eg:10):')
????queryType = raw_input('[-] PLEASE INPUT YOUR SEARCH_TYPE(eg:web/host):')
????queryStr = raw_input('[-] PLEASE INPUT YOUR KEYWORD(eg:tomcat):')
????Login(user,passwd)
????search(queryType,queryStr,PAGECOUNT,user,passwd)
if __name__ == '__main__':
????main()
0×03 ShoDanAPI腳本編寫(xiě)
Shodan是互聯(lián)網(wǎng)上更可怕的搜索引擎。
CNNMoney的一篇文章寫(xiě)道,雖然現今人們都覺(jué)得谷歌是最強勁的搜索引擎,但Shodan才是互聯(lián)網(wǎng)上更可怕的搜索引擎。
與谷歌不同的是,Shodan不是在網(wǎng)上搜索網(wǎng)址,而是直接處于互聯(lián)網(wǎng)的背后通道。Shodan可以說(shuō)是一款“黑暗”谷歌,一刻不停的在尋求著(zhù)所有跟互聯(lián)網(wǎng)關(guān)聯(lián)的服務(wù)器、攝像頭、打印機、路由器等等。每個(gè)月Shodan都會(huì )在大概5億個(gè)服務(wù)器上日夜不停地搜集信息。
Shodan所收集到的信息是非常驚人的。凡是鏈接至互聯(lián)網(wǎng)的紅綠燈、安全攝像頭、家庭自動(dòng)化設備以及加熱系統等等都會(huì )被輕易的搜索到。Shodan的使用者曾發(fā)現過(guò)一個(gè)水上公園的控制系統,一個(gè)加油站,甚至一個(gè)酒店的葡萄酒冷卻器。而網(wǎng)站的研究者也曾使用Shodan定位到了核電站的指揮跟控制系統及一個(gè)粒子回旋加速器。
Shodan真正值得注意的能力就是能找到幾乎所有跟互聯(lián)網(wǎng)相關(guān)聯(lián)的東西。而Shodan真正的可怕之處就是這些設備幾乎都沒(méi)有安裝安全攻擊措施,其可以隨意進(jìn)入。
淺安dalao寫(xiě)過(guò),介紹的也更具體…..
地址傳送門(mén):基于ShodanApi接口的讀取python版
先說(shuō)基于A(yíng)PI查詢(xún)。。。官方文檔:
每次查詢(xún)要扣除1積分…..,而用shodan庫模塊不需要….
寫(xiě)個(gè)簡(jiǎn)單的,他和Zoomeye的五五開(kāi),就不細寫(xiě)了…
#-*- coding: UTF-8 -*-
import requests
import json
?
def getip():
????????API_KEY = *************
????????url = 'https://api.shodan.io/shodan/host/search?key='+API_KEY+'&query=apache'
????????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????????req = requests.get(url=url,headers=headers)
????????content = json.loads(req.text)
????????for i in content['matches']:
????????????????print i['ip_str']
if __name__ == '__main__':
????????getip()
接下來(lái),就是基于shodan模塊的…直接引用淺安dalao的。。。我沒(méi)法寫(xiě)….
安裝:pip install shodan
#-*- coding: UTF-8 -*-
import shodan
import sys
API_KEY = ‘YOU_API_KEY’ #調用shodan api
FACETS = [
????????('country',100), # 匹配出前一百位的國家數量,100可自定義
]
FACET_TITLES = {
????'country': 'Top 100 Countries',
}
#輸入判斷
if len(sys.argv) == 1:
????print 'Search Method:Input the %s and then the keyword' % sys.argv[0]
????sys.exit()
try:
????api = shodan.Shodan(API_KEY)
????query = ' '.join(sys.argv[1:])
????print "You Search is:" + query
????result = api.count(query, facets=FACETS) # 使用count比search快
????for facet in result['facets']:
????????print FACET_TITLES[facet]
????????for key in result['facets'][facet]:
?????????????????countrie = '%s :? %s' % (key['value'], key['count'])
?????????????????print countrie
?????????????????with open(u"搜索" + " " + query + " " + u"關(guān)鍵字" +'.txt','a+') as f:
????????????????????????????f.write(countrie +"\n")
????????????????????????????f.close()
????????print " "
????????print "save is coutures.txt"????????
????????print "Search is Complete."
except Exception, e:
????print 'Error: %s' % e
0×04 簡(jiǎn)易BaiduURL采集腳本編寫(xiě)
先是爬去單頁(yè)的URL,舉個(gè)栗子是爬去阿甫哥哥這個(gè)關(guān)鍵字的URL
#-*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoup as bs
import re
def getfromBaidu(word):
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????url = 'https://www.baidu.com.cn/s?wd=' + word + '&pn=1'
????html = requests.get(url=url,headers=headers,timeout=5)
????soup = bs(html.content, 'lxml', from_encoding='utf-8')
????bqs = soup.find_all(name='a', attrs={'data-click':re.compile(r'.'), 'class':None})
????for i in bqs:
????????????r = requests.get(i['href'], headers=headers, timeout=5)
????????????print r.url
if __name__ == '__main__':
????getfromBaidu('阿甫哥哥')
然后是多頁(yè)的爬取,比如爬取前20頁(yè)的
#-*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoup as bs
import re
def getfromBaidu(word,pageout):
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????for k in range(0,(pageout-1)*10,10):
????????????url = 'https://www.baidu.com.cn/s?wd=' + word + '&pn=' + str(k)
????????html = requests.get(url=url,headers=headers,timeout=5)
????????soup = bs(html.content, 'lxml', from_encoding='utf-8')
????????bqs = soup.find_all(name='a', attrs={'data-click':re.compile(r'.'), 'class':None})
????????????for i in bqs:
????????????????????r = requests.get(i['href'], headers=headers, timeout=5)
????????????????????print r.url
if __name__ == '__main__':
????getfromBaidu('阿甫哥哥',10)
0×05 【彩蛋篇】論壇自動(dòng)簽到腳本 查看全部
本文作者:i春秋簽約作家——阿甫哥哥
系列文章專(zhuān)輯:
0×00 前言
URl采集在批量刷洞中也是很重要的
0×01 目錄
0×01 前言
0×02 ZoomEyeAPI腳本編寫(xiě)
0×03 ShoDanAPI腳本編寫(xiě)
0×04 簡(jiǎn)易BaiduURL采集腳本編寫(xiě)
0×05 【彩蛋篇】論壇自動(dòng)簽到腳本
0×02 ZoomEyeAPI腳本編寫(xiě)
ZoomEye是一款對于網(wǎng)絡(luò )空間的搜索引擎,收錄了互聯(lián)網(wǎng)空間中的設備、網(wǎng)站及其使用的服務(wù)或組件等信息。
ZoomEye 擁有兩大探測引擎:Xmap 和 Wmap,分別對于網(wǎng)絡(luò )空間中的設備及網(wǎng)站, 通過(guò) 24 小時(shí)不間斷的偵測、識別,標識出互聯(lián)網(wǎng)設備及網(wǎng)站所使用的服務(wù)及部件。 研究人員可以通過(guò) ZoomEye 方便的了解組件的普及率及漏洞的危害范圍等信息。
雖然被稱(chēng)為 “黑客友好” 的搜索引擎,但 ZoomEye 并不會(huì )主動(dòng)對網(wǎng)絡(luò )設備、網(wǎng)站發(fā)起攻擊,收錄的數據也僅用于安全研究。ZoomEye更像是互聯(lián)網(wǎng)空間的一張航海圖。
ZoomEyeAPI參考手冊在這:ZoomEye API 參考手冊
先登錄,然后獲得access_token
#-*- coding: UTF-8 -*-
?
import requests
import json
?
user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
if __name__ == '__main__':
????print Login()
然后,API手冊是這樣寫(xiě)的,根據這個(gè),咱們先寫(xiě)一個(gè)HOST的單頁(yè)面采集的….

#-*- coding: UTF-8 -*-
?
import requests
import json
?
user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search():
????headers = {'Authorization': 'JWT ' + Login()}
????r = requests.get(url = 'https://api.zoomeye.org/host/search?query=tomcat&page=1',
?????????????????????????headers = headers)
????response = json.loads(r.text)
????print response
if __name__ == '__main__':
????search()
返回的信息量極大啊,但它只是個(gè)JSON數據,SO,我們可以取出IP部分…

for x in response['matches']:
????????print x['ip']
之后,HOST的單頁(yè)面采集也就OK了,WEB的也五五開(kāi),留著(zhù)他們自己分析,其實(shí)差不多,后文會(huì )貼的
接下來(lái),就是用FOR循環(huán)….獲取多頁(yè)的IP
#-*- coding: UTF-8 -*-
?
import requests
import json
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search():
????headers = {'Authorization': 'JWT ' + Login()}
????for i in range(1,int(PAGECOUNT)):
????????r = requests.get(url = 'https://api.zoomeye.org/host/search?query=tomcat&page='+str(i),
?????????????????????????headers = headers)
????????response = json.loads(r.text)
????????for x in response['matches']:
????????????print x['ip']
if __name__ == '__main__':
????user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
????passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
????PAGECOUNT = raw_input('[-] PLEASE INPUT YOUR SEARCH_PAGE_COUNT(eg:10):')
????search()
這樣就取出了你想要的頁(yè)碼的數據,然后就是完善+美觀(guān)代碼了…..
#-*- coding: UTF-8 -*-
?
import requests
import json
?
def Login(user,passwd):
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search(queryType,queryStr,PAGECOUNT,user,passwd):
????headers = {'Authorization': 'JWT ' + Login(user,passwd)}
????for i in range(1,int(PAGECOUNT)):
????????r = requests.get(url = 'https://api.zoomeye.org/'+ queryType +'/search?query='+queryStr+'&page=' + str(i),
?????????????????????????headers = headers)
????????response = json.loads(r.text)
????????try:
????????????if queryType == "host":
????????????????for x in response['matches']:
????????????????????print x['ip']
????????????if queryType == "web":
????????????????for x in response['matches']:
????????????????????print x['ip'][0]
????????except KeyError:
????????????print "[ERROR] No hosts found"
?????
def main():
????print " _____???????????????????? _____?????????? ____? "???????????????
????print "|__? /___?? ___? _ __ ___ | ____|?? _? ___/ ___|? ___ __ _ _ __"?
????print "? / // _ \ / _ \| '_ ` _ \|? _|| | | |/ _ \___ \ / __/ _` | '_ \ "
????print " / /| (_) | (_) | | | | | | |__| |_| |? __/___) | (_| (_| | | | |"
????print "/____\___/ \___/|_| |_| |_|_____\__, |\___|____/ \___\__,_|_| |_|"
????print "??????????????????????????????? |___/??????????????????????????? "
????user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
????passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
????PAGECOUNT = raw_input('[-] PLEASE INPUT YOUR SEARCH_PAGE_COUNT(eg:10):')
????queryType = raw_input('[-] PLEASE INPUT YOUR SEARCH_TYPE(eg:web/host):')
????queryStr = raw_input('[-] PLEASE INPUT YOUR KEYWORD(eg:tomcat):')
????Login(user,passwd)
????search(queryType,queryStr,PAGECOUNT,user,passwd)
if __name__ == '__main__':
????main()
0×03 ShoDanAPI腳本編寫(xiě)
Shodan是互聯(lián)網(wǎng)上更可怕的搜索引擎。
CNNMoney的一篇文章寫(xiě)道,雖然現今人們都覺(jué)得谷歌是最強勁的搜索引擎,但Shodan才是互聯(lián)網(wǎng)上更可怕的搜索引擎。
與谷歌不同的是,Shodan不是在網(wǎng)上搜索網(wǎng)址,而是直接處于互聯(lián)網(wǎng)的背后通道。Shodan可以說(shuō)是一款“黑暗”谷歌,一刻不停的在尋求著(zhù)所有跟互聯(lián)網(wǎng)關(guān)聯(lián)的服務(wù)器、攝像頭、打印機、路由器等等。每個(gè)月Shodan都會(huì )在大概5億個(gè)服務(wù)器上日夜不停地搜集信息。
Shodan所收集到的信息是非常驚人的。凡是鏈接至互聯(lián)網(wǎng)的紅綠燈、安全攝像頭、家庭自動(dòng)化設備以及加熱系統等等都會(huì )被輕易的搜索到。Shodan的使用者曾發(fā)現過(guò)一個(gè)水上公園的控制系統,一個(gè)加油站,甚至一個(gè)酒店的葡萄酒冷卻器。而網(wǎng)站的研究者也曾使用Shodan定位到了核電站的指揮跟控制系統及一個(gè)粒子回旋加速器。
Shodan真正值得注意的能力就是能找到幾乎所有跟互聯(lián)網(wǎng)相關(guān)聯(lián)的東西。而Shodan真正的可怕之處就是這些設備幾乎都沒(méi)有安裝安全攻擊措施,其可以隨意進(jìn)入。
淺安dalao寫(xiě)過(guò),介紹的也更具體…..
地址傳送門(mén):基于ShodanApi接口的讀取python版
先說(shuō)基于A(yíng)PI查詢(xún)。。。官方文檔:
每次查詢(xún)要扣除1積分…..,而用shodan庫模塊不需要….
寫(xiě)個(gè)簡(jiǎn)單的,他和Zoomeye的五五開(kāi),就不細寫(xiě)了…
#-*- coding: UTF-8 -*-
import requests
import json
?
def getip():
????????API_KEY = *************
????????url = 'https://api.shodan.io/shodan/host/search?key='+API_KEY+'&query=apache'
????????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????????req = requests.get(url=url,headers=headers)
????????content = json.loads(req.text)
????????for i in content['matches']:
????????????????print i['ip_str']
if __name__ == '__main__':
????????getip()
接下來(lái),就是基于shodan模塊的…直接引用淺安dalao的。。。我沒(méi)法寫(xiě)….
安裝:pip install shodan
#-*- coding: UTF-8 -*-
import shodan
import sys
API_KEY = ‘YOU_API_KEY’ #調用shodan api
FACETS = [
????????('country',100), # 匹配出前一百位的國家數量,100可自定義
]
FACET_TITLES = {
????'country': 'Top 100 Countries',
}
#輸入判斷
if len(sys.argv) == 1:
????print 'Search Method:Input the %s and then the keyword' % sys.argv[0]
????sys.exit()
try:
????api = shodan.Shodan(API_KEY)
????query = ' '.join(sys.argv[1:])
????print "You Search is:" + query
????result = api.count(query, facets=FACETS) # 使用count比search快
????for facet in result['facets']:
????????print FACET_TITLES[facet]
????????for key in result['facets'][facet]:
?????????????????countrie = '%s :? %s' % (key['value'], key['count'])
?????????????????print countrie
?????????????????with open(u"搜索" + " " + query + " " + u"關(guān)鍵字" +'.txt','a+') as f:
????????????????????????????f.write(countrie +"\n")
????????????????????????????f.close()
????????print " "
????????print "save is coutures.txt"????????
????????print "Search is Complete."
except Exception, e:
????print 'Error: %s' % e
0×04 簡(jiǎn)易BaiduURL采集腳本編寫(xiě)
先是爬去單頁(yè)的URL,舉個(gè)栗子是爬去阿甫哥哥這個(gè)關(guān)鍵字的URL
#-*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoup as bs
import re
def getfromBaidu(word):
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????url = 'https://www.baidu.com.cn/s?wd=' + word + '&pn=1'
????html = requests.get(url=url,headers=headers,timeout=5)
????soup = bs(html.content, 'lxml', from_encoding='utf-8')
????bqs = soup.find_all(name='a', attrs={'data-click':re.compile(r'.'), 'class':None})
????for i in bqs:
????????????r = requests.get(i['href'], headers=headers, timeout=5)
????????????print r.url
if __name__ == '__main__':
????getfromBaidu('阿甫哥哥')
然后是多頁(yè)的爬取,比如爬取前20頁(yè)的
#-*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoup as bs
import re
def getfromBaidu(word,pageout):
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????for k in range(0,(pageout-1)*10,10):
????????????url = 'https://www.baidu.com.cn/s?wd=' + word + '&pn=' + str(k)
????????html = requests.get(url=url,headers=headers,timeout=5)
????????soup = bs(html.content, 'lxml', from_encoding='utf-8')
????????bqs = soup.find_all(name='a', attrs={'data-click':re.compile(r'.'), 'class':None})
????????????for i in bqs:
????????????????????r = requests.get(i['href'], headers=headers, timeout=5)
????????????????????print r.url
if __name__ == '__main__':
????getfromBaidu('阿甫哥哥',10)

0×05 【彩蛋篇】論壇自動(dòng)簽到腳本
小程序開(kāi)發(fā)(1): 使用scrapy采集數據
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 353 次瀏覽 ? 2020-08-06 15:21
農歷新年后,我一直在業(yè)余時(shí)間獨立開(kāi)發(fā)一個(gè)小程序. 主要數據是8000多個(gè)視頻和10000多個(gè)文章,并且每天都會(huì )自動(dòng)更新數據.
我將整理整個(gè)開(kāi)發(fā)過(guò)程中遇到的問(wèn)題和一些細節. 因為內容會(huì )更多,所以我將其分為三到四篇文章. 本文是該系列的第一篇文章,內容為python reptile.
本系列文章將大致介紹內容:
數據準備(python scrapy框架)
接口準備(nodejs的hapijs框架)
小型程序開(kāi)發(fā)(小型程序隨附的mpvue和組件等)
在線(xiàn)部署(小程序安全性域名以及其他配置和爬網(wǎng)程序/界面在線(xiàn)部署和維護)
數據采集
有很多方法可以獲取數據. 這次我們選擇了采集器方法. 當然,您可以使用不同的語(yǔ)言和不同的方式編寫(xiě)爬蟲(chóng). 我以前寫(xiě)過(guò)很多爬蟲(chóng),這次我們選擇了python的scrapy庫. 關(guān)于scrapy,百度百科解釋如下:
Scrapy是Python開(kāi)發(fā)的一種快速的高級屏幕抓取和Web抓取框架,用于抓取網(wǎng)站并從頁(yè)面提取結構化數據. Scrapy用途廣泛,可用于數據挖掘,監視和自動(dòng)化測試.
學(xué)習scrapy的最好方法是先閱讀文檔(Scrapy 1.6文檔),然后根據文檔中的示例進(jìn)行編寫(xiě),您將逐漸熟悉它. 有幾個(gè)重要的概念必須理解:
物品
官方對items的定義是“The main goal in scraping is to extract structured data from unstructured sources, typically, web pages.”,個(gè)人理解為數據結構,也就是要爬取數據的字段,最好能和數據庫字段對應,便于入庫。
蜘蛛
“Spiders are classes which define how a certain site (or a group of sites) will be scraped, including how to perform the crawl (i.e. follow links) and how to extract structured data from their pages (i.e. scraping items). ”,也就是爬蟲(chóng)比較核心的內容,定義爬蟲(chóng)的方式,一些策略,以及獲取那些字段等等。
管道
“蜘蛛抓取了一個(gè)項目之后,將其發(fā)送到項目管道,該管道通過(guò)依次執行的幾個(gè)組件對其進(jìn)行處理. ”,管道是我們的采集器在獲取數據后將執行的處理操作,例如可以在此處進(jìn)行操作. 如寫(xiě)入文件或鏈接到數據庫,然后保存到數據庫等.
選擇器
“When you’re scraping web pages, the most common task you need to perform is to extract data from the HTML source. ”,這部分就是如何解析html,從爬取到的html文件中解析出所需的數據,可以使用BeautifulSoup、lxml、Xpath、CSS等方法。
上面已經(jīng)解釋了幾個(gè)重要的部分.
準備環(huán)境(python3 / scrapy等),我們可以編寫(xiě)一個(gè)爬蟲(chóng)項目.
抓取的內容來(lái)自此網(wǎng)站.
創(chuàng )建項目
scrapy startproject jqhtml
修改項目
添加采集器
爬行器爬行器
編寫(xiě)管道以修改配置文件
?這樣我們就順利地完成了爬蟲(chóng)項目的編寫(xiě)。運行下,發(fā)現數據全部存到了數據庫中。
部署scrapy爬蟲(chóng)項目
對于scrapy crawler項目的部署,我們可以使用官方scrapyd,并且使用方法相對簡(jiǎn)單. 在服務(wù)器上安裝scrapyd并啟動(dòng)它,然后在本地項目中配置部署路徑,在本地安裝scrapy-client并使用命令deploy可以部署到服務(wù)器.
Scrapyd提供了一些api界面來(lái)查看項目采集器的狀態(tài),并執行或停止采集器.
因此,我們可以輕松調整這些界面來(lái)管理抓取工具任務(wù).
注意:
如何將scrapyd部署到服務(wù)器上如何將scrapyd設置為系統后臺服務(wù)和系統啟動(dòng)項
下一個(gè)
在下一篇文章中,我們將介紹并使用非常流行的nodejs背景api庫-hapijs. 完成applet所需的所有接口的開(kāi)發(fā),并使用定時(shí)任務(wù)執行采集器腳本. 查看全部
我將整理整個(gè)開(kāi)發(fā)過(guò)程中遇到的問(wèn)題和一些細節. 因為內容會(huì )更多,所以我將其分為三到四篇文章. 本文是該系列的第一篇文章,內容為python reptile.
本系列文章將大致介紹內容:
數據準備(python scrapy框架)
接口準備(nodejs的hapijs框架)
小型程序開(kāi)發(fā)(小型程序隨附的mpvue和組件等)
在線(xiàn)部署(小程序安全性域名以及其他配置和爬網(wǎng)程序/界面在線(xiàn)部署和維護)
數據采集
有很多方法可以獲取數據. 這次我們選擇了采集器方法. 當然,您可以使用不同的語(yǔ)言和不同的方式編寫(xiě)爬蟲(chóng). 我以前寫(xiě)過(guò)很多爬蟲(chóng),這次我們選擇了python的scrapy庫. 關(guān)于scrapy,百度百科解釋如下:
Scrapy是Python開(kāi)發(fā)的一種快速的高級屏幕抓取和Web抓取框架,用于抓取網(wǎng)站并從頁(yè)面提取結構化數據. Scrapy用途廣泛,可用于數據挖掘,監視和自動(dòng)化測試.
學(xué)習scrapy的最好方法是先閱讀文檔(Scrapy 1.6文檔),然后根據文檔中的示例進(jìn)行編寫(xiě),您將逐漸熟悉它. 有幾個(gè)重要的概念必須理解:
物品
官方對items的定義是“The main goal in scraping is to extract structured data from unstructured sources, typically, web pages.”,個(gè)人理解為數據結構,也就是要爬取數據的字段,最好能和數據庫字段對應,便于入庫。
蜘蛛
“Spiders are classes which define how a certain site (or a group of sites) will be scraped, including how to perform the crawl (i.e. follow links) and how to extract structured data from their pages (i.e. scraping items). ”,也就是爬蟲(chóng)比較核心的內容,定義爬蟲(chóng)的方式,一些策略,以及獲取那些字段等等。
管道
“蜘蛛抓取了一個(gè)項目之后,將其發(fā)送到項目管道,該管道通過(guò)依次執行的幾個(gè)組件對其進(jìn)行處理. ”,管道是我們的采集器在獲取數據后將執行的處理操作,例如可以在此處進(jìn)行操作. 如寫(xiě)入文件或鏈接到數據庫,然后保存到數據庫等.
選擇器
“When you’re scraping web pages, the most common task you need to perform is to extract data from the HTML source. ”,這部分就是如何解析html,從爬取到的html文件中解析出所需的數據,可以使用BeautifulSoup、lxml、Xpath、CSS等方法。
上面已經(jīng)解釋了幾個(gè)重要的部分.
準備環(huán)境(python3 / scrapy等),我們可以編寫(xiě)一個(gè)爬蟲(chóng)項目.
抓取的內容來(lái)自此網(wǎng)站.
創(chuàng )建項目
scrapy startproject jqhtml
修改項目
添加采集器
爬行器爬行器
編寫(xiě)管道以修改配置文件
?這樣我們就順利地完成了爬蟲(chóng)項目的編寫(xiě)。運行下,發(fā)現數據全部存到了數據庫中。
部署scrapy爬蟲(chóng)項目
對于scrapy crawler項目的部署,我們可以使用官方scrapyd,并且使用方法相對簡(jiǎn)單. 在服務(wù)器上安裝scrapyd并啟動(dòng)它,然后在本地項目中配置部署路徑,在本地安裝scrapy-client并使用命令deploy可以部署到服務(wù)器.
Scrapyd提供了一些api界面來(lái)查看項目采集器的狀態(tài),并執行或停止采集器.
因此,我們可以輕松調整這些界面來(lái)管理抓取工具任務(wù).
注意:
如何將scrapyd部署到服務(wù)器上如何將scrapyd設置為系統后臺服務(wù)和系統啟動(dòng)項
下一個(gè)
在下一篇文章中,我們將介紹并使用非常流行的nodejs背景api庫-hapijs. 完成applet所需的所有接口的開(kāi)發(fā),并使用定時(shí)任務(wù)執行采集器腳本. 查看全部
農歷新年后,我一直在業(yè)余時(shí)間獨立開(kāi)發(fā)一個(gè)小程序. 主要數據是8000多個(gè)視頻和10000多個(gè)文章,并且每天都會(huì )自動(dòng)更新數據.
我將整理整個(gè)開(kāi)發(fā)過(guò)程中遇到的問(wèn)題和一些細節. 因為內容會(huì )更多,所以我將其分為三到四篇文章. 本文是該系列的第一篇文章,內容為python reptile.
本系列文章將大致介紹內容:
數據準備(python scrapy框架)
接口準備(nodejs的hapijs框架)
小型程序開(kāi)發(fā)(小型程序隨附的mpvue和組件等)
在線(xiàn)部署(小程序安全性域名以及其他配置和爬網(wǎng)程序/界面在線(xiàn)部署和維護)
數據采集
有很多方法可以獲取數據. 這次我們選擇了采集器方法. 當然,您可以使用不同的語(yǔ)言和不同的方式編寫(xiě)爬蟲(chóng). 我以前寫(xiě)過(guò)很多爬蟲(chóng),這次我們選擇了python的scrapy庫. 關(guān)于scrapy,百度百科解釋如下:
Scrapy是Python開(kāi)發(fā)的一種快速的高級屏幕抓取和Web抓取框架,用于抓取網(wǎng)站并從頁(yè)面提取結構化數據. Scrapy用途廣泛,可用于數據挖掘,監視和自動(dòng)化測試.
學(xué)習scrapy的最好方法是先閱讀文檔(Scrapy 1.6文檔),然后根據文檔中的示例進(jìn)行編寫(xiě),您將逐漸熟悉它. 有幾個(gè)重要的概念必須理解:
物品
官方對items的定義是“The main goal in scraping is to extract structured data from unstructured sources, typically, web pages.”,個(gè)人理解為數據結構,也就是要爬取數據的字段,最好能和數據庫字段對應,便于入庫。
蜘蛛
“Spiders are classes which define how a certain site (or a group of sites) will be scraped, including how to perform the crawl (i.e. follow links) and how to extract structured data from their pages (i.e. scraping items). ”,也就是爬蟲(chóng)比較核心的內容,定義爬蟲(chóng)的方式,一些策略,以及獲取那些字段等等。
管道
“蜘蛛抓取了一個(gè)項目之后,將其發(fā)送到項目管道,該管道通過(guò)依次執行的幾個(gè)組件對其進(jìn)行處理. ”,管道是我們的采集器在獲取數據后將執行的處理操作,例如可以在此處進(jìn)行操作. 如寫(xiě)入文件或鏈接到數據庫,然后保存到數據庫等.
選擇器
“When you’re scraping web pages, the most common task you need to perform is to extract data from the HTML source. ”,這部分就是如何解析html,從爬取到的html文件中解析出所需的數據,可以使用BeautifulSoup、lxml、Xpath、CSS等方法。
上面已經(jīng)解釋了幾個(gè)重要的部分.
準備環(huán)境(python3 / scrapy等),我們可以編寫(xiě)一個(gè)爬蟲(chóng)項目.
抓取的內容來(lái)自此網(wǎng)站.
創(chuàng )建項目
scrapy startproject jqhtml
修改項目
添加采集器
爬行器爬行器
編寫(xiě)管道以修改配置文件
?這樣我們就順利地完成了爬蟲(chóng)項目的編寫(xiě)。運行下,發(fā)現數據全部存到了數據庫中。
部署scrapy爬蟲(chóng)項目
對于scrapy crawler項目的部署,我們可以使用官方scrapyd,并且使用方法相對簡(jiǎn)單. 在服務(wù)器上安裝scrapyd并啟動(dòng)它,然后在本地項目中配置部署路徑,在本地安裝scrapy-client并使用命令deploy可以部署到服務(wù)器.
Scrapyd提供了一些api界面來(lái)查看項目采集器的狀態(tài),并執行或停止采集器.
因此,我們可以輕松調整這些界面來(lái)管理抓取工具任務(wù).
注意:
如何將scrapyd部署到服務(wù)器上如何將scrapyd設置為系統后臺服務(wù)和系統啟動(dòng)項
下一個(gè)
在下一篇文章中,我們將介紹并使用非常流行的nodejs背景api庫-hapijs. 完成applet所需的所有接口的開(kāi)發(fā),并使用定時(shí)任務(wù)執行采集器腳本.
Python大法之告別腳本小子系列—各類(lèi)URL采集器編寫(xiě)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 450 次瀏覽 ? 2020-08-04 19:05
本文作者:i春秋簽約作家——阿甫哥哥
系列文章專(zhuān)輯:
0×00 前言
URl采集在批量刷洞中也是很重要的
0×01 目錄
0×01 前言
0×02 ZoomEyeAPI腳本編寫(xiě)
0×03 ShoDanAPI腳本編寫(xiě)
0×04 簡(jiǎn)易BaiduURL采集腳本編寫(xiě)
0×05 【彩蛋篇】論壇自動(dòng)簽到腳本
0×02 ZoomEyeAPI腳本編寫(xiě)
ZoomEye是一款對于網(wǎng)絡(luò )空間的搜索引擎,收錄了互聯(lián)網(wǎng)空間中的設備、網(wǎng)站及其使用的服務(wù)或組件等信息。
ZoomEye 擁有兩大探測引擎:Xmap 和 Wmap,分別對于網(wǎng)絡(luò )空間中的設備及網(wǎng)站, 通過(guò) 24 小時(shí)不間斷的偵測、識別,標識出互聯(lián)網(wǎng)設備及網(wǎng)站所使用的服務(wù)及部件。 研究人員可以通過(guò) ZoomEye 方便的了解組件的普及率及漏洞的危害范圍等信息。
雖然被稱(chēng)為 “黑客友好” 的搜索引擎,但 ZoomEye 并不會(huì )主動(dòng)對網(wǎng)絡(luò )設備、網(wǎng)站發(fā)起攻擊,收錄的數據也僅用于安全研究。ZoomEye更像是互聯(lián)網(wǎng)空間的一張航海圖。
ZoomEyeAPI參考手冊在這:ZoomEye API 參考手冊
先登錄,然后獲得access_token
#-*- coding: UTF-8 -*-
?
import requests
import json
?
user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
if __name__ == '__main__':
????print Login()
然后,API手冊是這樣寫(xiě)的,根據這個(gè),咱們先寫(xiě)一個(gè)HOST的單頁(yè)面采集的….
#-*- coding: UTF-8 -*-
?
import requests
import json
?
user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search():
????headers = {'Authorization': 'JWT ' + Login()}
????r = requests.get(url = 'https://api.zoomeye.org/host/search?query=tomcat&page=1',
?????????????????????????headers = headers)
????response = json.loads(r.text)
????print response
if __name__ == '__main__':
????search()
返回的信息量極大啊,但它只是個(gè)JSON數據,SO,我們可以取出IP部分…
for x in response['matches']:
????????print x['ip']
之后,HOST的單頁(yè)面采集也就OK了,WEB的也五五開(kāi),留著(zhù)他們自己分析,其實(shí)差不多,后文會(huì )貼的
接下來(lái),就是用FOR循環(huán)….獲取多頁(yè)的IP
#-*- coding: UTF-8 -*-
?
import requests
import json
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search():
????headers = {'Authorization': 'JWT ' + Login()}
????for i in range(1,int(PAGECOUNT)):
????????r = requests.get(url = 'https://api.zoomeye.org/host/search?query=tomcat&page='+str(i),
?????????????????????????headers = headers)
????????response = json.loads(r.text)
????????for x in response['matches']:
????????????print x['ip']
if __name__ == '__main__':
????user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
????passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
????PAGECOUNT = raw_input('[-] PLEASE INPUT YOUR SEARCH_PAGE_COUNT(eg:10):')
????search()
這樣就取出了你想要的頁(yè)碼的數據,然后就是完善+美觀(guān)代碼了…..
#-*- coding: UTF-8 -*-
?
import requests
import json
?
def Login(user,passwd):
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search(queryType,queryStr,PAGECOUNT,user,passwd):
????headers = {'Authorization': 'JWT ' + Login(user,passwd)}
????for i in range(1,int(PAGECOUNT)):
????????r = requests.get(url = 'https://api.zoomeye.org/'+ queryType +'/search?query='+queryStr+'&page=' + str(i),
?????????????????????????headers = headers)
????????response = json.loads(r.text)
????????try:
????????????if queryType == "host":
????????????????for x in response['matches']:
????????????????????print x['ip']
????????????if queryType == "web":
????????????????for x in response['matches']:
????????????????????print x['ip'][0]
????????except KeyError:
????????????print "[ERROR] No hosts found"
?????
def main():
????print " _____???????????????????? _____?????????? ____? "???????????????
????print "|__? /___?? ___? _ __ ___ | ____|?? _? ___/ ___|? ___ __ _ _ __"?
????print "? / // _ \ / _ \| '_ ` _ \|? _|| | | |/ _ \___ \ / __/ _` | '_ \ "
????print " / /| (_) | (_) | | | | | | |__| |_| |? __/___) | (_| (_| | | | |"
????print "/____\___/ \___/|_| |_| |_|_____\__, |\___|____/ \___\__,_|_| |_|"
????print "??????????????????????????????? |___/??????????????????????????? "
????user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
????passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
????PAGECOUNT = raw_input('[-] PLEASE INPUT YOUR SEARCH_PAGE_COUNT(eg:10):')
????queryType = raw_input('[-] PLEASE INPUT YOUR SEARCH_TYPE(eg:web/host):')
????queryStr = raw_input('[-] PLEASE INPUT YOUR KEYWORD(eg:tomcat):')
????Login(user,passwd)
????search(queryType,queryStr,PAGECOUNT,user,passwd)
if __name__ == '__main__':
????main()
0×03 ShoDanAPI腳本編寫(xiě)
Shodan是互聯(lián)網(wǎng)上更可怕的搜索引擎。
CNNMoney的一篇文章寫(xiě)道,雖然現今人們都覺(jué)得谷歌是最強勁的搜索引擎,但Shodan才是互聯(lián)網(wǎng)上更可怕的搜索引擎。
與谷歌不同的是,Shodan不是在網(wǎng)上搜索網(wǎng)址,而是直接處于互聯(lián)網(wǎng)的背后通道。Shodan可以說(shuō)是一款“黑暗”谷歌,一刻不停的在尋求著(zhù)所有跟互聯(lián)網(wǎng)關(guān)聯(lián)的服務(wù)器、攝像頭、打印機、路由器等等。每個(gè)月Shodan都會(huì )在大概5億個(gè)服務(wù)器上日夜不停地搜集信息。
Shodan所收集到的信息是非常驚人的。凡是鏈接至互聯(lián)網(wǎng)的紅綠燈、安全攝像頭、家庭自動(dòng)化設備以及加熱系統等等都會(huì )被輕易的搜索到。Shodan的使用者曾發(fā)現過(guò)一個(gè)水上公園的控制系統,一個(gè)加油站,甚至一個(gè)酒店的葡萄酒冷卻器。而網(wǎng)站的研究者也曾使用Shodan定位到了核電站的指揮跟控制系統及一個(gè)粒子回旋加速器。
Shodan真正值得注意的能力就是能找到幾乎所有跟互聯(lián)網(wǎng)相關(guān)聯(lián)的東西。而Shodan真正的可怕之處就是這些設備幾乎都沒(méi)有安裝安全攻擊措施,其可以隨意進(jìn)入。
淺安dalao寫(xiě)過(guò),介紹的也更具體…..
地址傳送門(mén):基于ShodanApi接口的讀取python版
先說(shuō)基于A(yíng)PI查詢(xún)。。。官方文檔:
每次查詢(xún)要扣除1積分…..,而用shodan庫模塊不需要….
寫(xiě)個(gè)簡(jiǎn)單的,他和Zoomeye的五五開(kāi),就不細寫(xiě)了…
#-*- coding: UTF-8 -*-
import requests
import json
?
def getip():
????????API_KEY = *************
????????url = 'https://api.shodan.io/shodan/host/search?key='+API_KEY+'&query=apache'
????????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????????req = requests.get(url=url,headers=headers)
????????content = json.loads(req.text)
????????for i in content['matches']:
????????????????print i['ip_str']
if __name__ == '__main__':
????????getip()
接下來(lái),就是基于shodan模塊的…直接引用淺安dalao的。。。我沒(méi)法寫(xiě)….
安裝:pip install shodan
#-*- coding: UTF-8 -*-
import shodan
import sys
API_KEY = ‘YOU_API_KEY’ #調用shodan api
FACETS = [
????????('country',100), # 匹配出前一百位的國家數量,100可自定義
]
FACET_TITLES = {
????'country': 'Top 100 Countries',
}
#輸入判斷
if len(sys.argv) == 1:
????print 'Search Method:Input the %s and then the keyword' % sys.argv[0]
????sys.exit()
try:
????api = shodan.Shodan(API_KEY)
????query = ' '.join(sys.argv[1:])
????print "You Search is:" + query
????result = api.count(query, facets=FACETS) # 使用count比search快
????for facet in result['facets']:
????????print FACET_TITLES[facet]
????????for key in result['facets'][facet]:
?????????????????countrie = '%s :? %s' % (key['value'], key['count'])
?????????????????print countrie
?????????????????with open(u"搜索" + " " + query + " " + u"關(guān)鍵字" +'.txt','a+') as f:
????????????????????????????f.write(countrie +"\n")
????????????????????????????f.close()
????????print " "
????????print "save is coutures.txt"????????
????????print "Search is Complete."
except Exception, e:
????print 'Error: %s' % e
0×04 簡(jiǎn)易BaiduURL采集腳本編寫(xiě)
先是爬去單頁(yè)的URL,舉個(gè)栗子是爬去阿甫哥哥這個(gè)關(guān)鍵字的URL
#-*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoup as bs
import re
def getfromBaidu(word):
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????url = 'https://www.baidu.com.cn/s?wd=' + word + '&pn=1'
????html = requests.get(url=url,headers=headers,timeout=5)
????soup = bs(html.content, 'lxml', from_encoding='utf-8')
????bqs = soup.find_all(name='a', attrs={'data-click':re.compile(r'.'), 'class':None})
????for i in bqs:
????????????r = requests.get(i['href'], headers=headers, timeout=5)
????????????print r.url
if __name__ == '__main__':
????getfromBaidu('阿甫哥哥')
然后是多頁(yè)的爬取,比如爬取前20頁(yè)的
#-*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoup as bs
import re
def getfromBaidu(word,pageout):
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????for k in range(0,(pageout-1)*10,10):
????????????url = 'https://www.baidu.com.cn/s?wd=' + word + '&pn=' + str(k)
????????html = requests.get(url=url,headers=headers,timeout=5)
????????soup = bs(html.content, 'lxml', from_encoding='utf-8')
????????bqs = soup.find_all(name='a', attrs={'data-click':re.compile(r'.'), 'class':None})
????????????for i in bqs:
????????????????????r = requests.get(i['href'], headers=headers, timeout=5)
????????????????????print r.url
if __name__ == '__main__':
????getfromBaidu('阿甫哥哥',10)
0×05 【彩蛋篇】論壇自動(dòng)簽到腳本 查看全部
系列文章專(zhuān)輯:
0×00 前言
URl采集在批量刷洞中也是很重要的
0×01 目錄
0×01 前言
0×02 ZoomEyeAPI腳本編寫(xiě)
0×03 ShoDanAPI腳本編寫(xiě)
0×04 簡(jiǎn)易BaiduURL采集腳本編寫(xiě)
0×05 【彩蛋篇】論壇自動(dòng)簽到腳本
0×02 ZoomEyeAPI腳本編寫(xiě)
ZoomEye是一款對于網(wǎng)絡(luò )空間的搜索引擎,收錄了互聯(lián)網(wǎng)空間中的設備、網(wǎng)站及其使用的服務(wù)或組件等信息。
ZoomEye 擁有兩大探測引擎:Xmap 和 Wmap,分別對于網(wǎng)絡(luò )空間中的設備及網(wǎng)站, 通過(guò) 24 小時(shí)不間斷的偵測、識別,標識出互聯(lián)網(wǎng)設備及網(wǎng)站所使用的服務(wù)及部件。 研究人員可以通過(guò) ZoomEye 方便的了解組件的普及率及漏洞的危害范圍等信息。
雖然被稱(chēng)為 “黑客友好” 的搜索引擎,但 ZoomEye 并不會(huì )主動(dòng)對網(wǎng)絡(luò )設備、網(wǎng)站發(fā)起攻擊,收錄的數據也僅用于安全研究。ZoomEye更像是互聯(lián)網(wǎng)空間的一張航海圖。
ZoomEyeAPI參考手冊在這:ZoomEye API 參考手冊
先登錄,然后獲得access_token
#-*- coding: UTF-8 -*-
?
import requests
import json
?
user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
if __name__ == '__main__':
????print Login()
然后,API手冊是這樣寫(xiě)的,根據這個(gè),咱們先寫(xiě)一個(gè)HOST的單頁(yè)面采集的….
#-*- coding: UTF-8 -*-
?
import requests
import json
?
user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search():
????headers = {'Authorization': 'JWT ' + Login()}
????r = requests.get(url = 'https://api.zoomeye.org/host/search?query=tomcat&page=1',
?????????????????????????headers = headers)
????response = json.loads(r.text)
????print response
if __name__ == '__main__':
????search()
返回的信息量極大啊,但它只是個(gè)JSON數據,SO,我們可以取出IP部分…
for x in response['matches']:
????????print x['ip']
之后,HOST的單頁(yè)面采集也就OK了,WEB的也五五開(kāi),留著(zhù)他們自己分析,其實(shí)差不多,后文會(huì )貼的
接下來(lái),就是用FOR循環(huán)….獲取多頁(yè)的IP
#-*- coding: UTF-8 -*-
?
import requests
import json
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search():
????headers = {'Authorization': 'JWT ' + Login()}
????for i in range(1,int(PAGECOUNT)):
????????r = requests.get(url = 'https://api.zoomeye.org/host/search?query=tomcat&page='+str(i),
?????????????????????????headers = headers)
????????response = json.loads(r.text)
????????for x in response['matches']:
????????????print x['ip']
if __name__ == '__main__':
????user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
????passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
????PAGECOUNT = raw_input('[-] PLEASE INPUT YOUR SEARCH_PAGE_COUNT(eg:10):')
????search()
這樣就取出了你想要的頁(yè)碼的數據,然后就是完善+美觀(guān)代碼了…..
#-*- coding: UTF-8 -*-
?
import requests
import json
?
def Login(user,passwd):
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search(queryType,queryStr,PAGECOUNT,user,passwd):
????headers = {'Authorization': 'JWT ' + Login(user,passwd)}
????for i in range(1,int(PAGECOUNT)):
????????r = requests.get(url = 'https://api.zoomeye.org/'+ queryType +'/search?query='+queryStr+'&page=' + str(i),
?????????????????????????headers = headers)
????????response = json.loads(r.text)
????????try:
????????????if queryType == "host":
????????????????for x in response['matches']:
????????????????????print x['ip']
????????????if queryType == "web":
????????????????for x in response['matches']:
????????????????????print x['ip'][0]
????????except KeyError:
????????????print "[ERROR] No hosts found"
?????
def main():
????print " _____???????????????????? _____?????????? ____? "???????????????
????print "|__? /___?? ___? _ __ ___ | ____|?? _? ___/ ___|? ___ __ _ _ __"?
????print "? / // _ \ / _ \| '_ ` _ \|? _|| | | |/ _ \___ \ / __/ _` | '_ \ "
????print " / /| (_) | (_) | | | | | | |__| |_| |? __/___) | (_| (_| | | | |"
????print "/____\___/ \___/|_| |_| |_|_____\__, |\___|____/ \___\__,_|_| |_|"
????print "??????????????????????????????? |___/??????????????????????????? "
????user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
????passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
????PAGECOUNT = raw_input('[-] PLEASE INPUT YOUR SEARCH_PAGE_COUNT(eg:10):')
????queryType = raw_input('[-] PLEASE INPUT YOUR SEARCH_TYPE(eg:web/host):')
????queryStr = raw_input('[-] PLEASE INPUT YOUR KEYWORD(eg:tomcat):')
????Login(user,passwd)
????search(queryType,queryStr,PAGECOUNT,user,passwd)
if __name__ == '__main__':
????main()
0×03 ShoDanAPI腳本編寫(xiě)
Shodan是互聯(lián)網(wǎng)上更可怕的搜索引擎。
CNNMoney的一篇文章寫(xiě)道,雖然現今人們都覺(jué)得谷歌是最強勁的搜索引擎,但Shodan才是互聯(lián)網(wǎng)上更可怕的搜索引擎。
與谷歌不同的是,Shodan不是在網(wǎng)上搜索網(wǎng)址,而是直接處于互聯(lián)網(wǎng)的背后通道。Shodan可以說(shuō)是一款“黑暗”谷歌,一刻不停的在尋求著(zhù)所有跟互聯(lián)網(wǎng)關(guān)聯(lián)的服務(wù)器、攝像頭、打印機、路由器等等。每個(gè)月Shodan都會(huì )在大概5億個(gè)服務(wù)器上日夜不停地搜集信息。
Shodan所收集到的信息是非常驚人的。凡是鏈接至互聯(lián)網(wǎng)的紅綠燈、安全攝像頭、家庭自動(dòng)化設備以及加熱系統等等都會(huì )被輕易的搜索到。Shodan的使用者曾發(fā)現過(guò)一個(gè)水上公園的控制系統,一個(gè)加油站,甚至一個(gè)酒店的葡萄酒冷卻器。而網(wǎng)站的研究者也曾使用Shodan定位到了核電站的指揮跟控制系統及一個(gè)粒子回旋加速器。
Shodan真正值得注意的能力就是能找到幾乎所有跟互聯(lián)網(wǎng)相關(guān)聯(lián)的東西。而Shodan真正的可怕之處就是這些設備幾乎都沒(méi)有安裝安全攻擊措施,其可以隨意進(jìn)入。
淺安dalao寫(xiě)過(guò),介紹的也更具體…..
地址傳送門(mén):基于ShodanApi接口的讀取python版
先說(shuō)基于A(yíng)PI查詢(xún)。。。官方文檔:
每次查詢(xún)要扣除1積分…..,而用shodan庫模塊不需要….
寫(xiě)個(gè)簡(jiǎn)單的,他和Zoomeye的五五開(kāi),就不細寫(xiě)了…
#-*- coding: UTF-8 -*-
import requests
import json
?
def getip():
????????API_KEY = *************
????????url = 'https://api.shodan.io/shodan/host/search?key='+API_KEY+'&query=apache'
????????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????????req = requests.get(url=url,headers=headers)
????????content = json.loads(req.text)
????????for i in content['matches']:
????????????????print i['ip_str']
if __name__ == '__main__':
????????getip()
接下來(lái),就是基于shodan模塊的…直接引用淺安dalao的。。。我沒(méi)法寫(xiě)….
安裝:pip install shodan
#-*- coding: UTF-8 -*-
import shodan
import sys
API_KEY = ‘YOU_API_KEY’ #調用shodan api
FACETS = [
????????('country',100), # 匹配出前一百位的國家數量,100可自定義
]
FACET_TITLES = {
????'country': 'Top 100 Countries',
}
#輸入判斷
if len(sys.argv) == 1:
????print 'Search Method:Input the %s and then the keyword' % sys.argv[0]
????sys.exit()
try:
????api = shodan.Shodan(API_KEY)
????query = ' '.join(sys.argv[1:])
????print "You Search is:" + query
????result = api.count(query, facets=FACETS) # 使用count比search快
????for facet in result['facets']:
????????print FACET_TITLES[facet]
????????for key in result['facets'][facet]:
?????????????????countrie = '%s :? %s' % (key['value'], key['count'])
?????????????????print countrie
?????????????????with open(u"搜索" + " " + query + " " + u"關(guān)鍵字" +'.txt','a+') as f:
????????????????????????????f.write(countrie +"\n")
????????????????????????????f.close()
????????print " "
????????print "save is coutures.txt"????????
????????print "Search is Complete."
except Exception, e:
????print 'Error: %s' % e
0×04 簡(jiǎn)易BaiduURL采集腳本編寫(xiě)
先是爬去單頁(yè)的URL,舉個(gè)栗子是爬去阿甫哥哥這個(gè)關(guān)鍵字的URL
#-*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoup as bs
import re
def getfromBaidu(word):
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????url = 'https://www.baidu.com.cn/s?wd=' + word + '&pn=1'
????html = requests.get(url=url,headers=headers,timeout=5)
????soup = bs(html.content, 'lxml', from_encoding='utf-8')
????bqs = soup.find_all(name='a', attrs={'data-click':re.compile(r'.'), 'class':None})
????for i in bqs:
????????????r = requests.get(i['href'], headers=headers, timeout=5)
????????????print r.url
if __name__ == '__main__':
????getfromBaidu('阿甫哥哥')
然后是多頁(yè)的爬取,比如爬取前20頁(yè)的
#-*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoup as bs
import re
def getfromBaidu(word,pageout):
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????for k in range(0,(pageout-1)*10,10):
????????????url = 'https://www.baidu.com.cn/s?wd=' + word + '&pn=' + str(k)
????????html = requests.get(url=url,headers=headers,timeout=5)
????????soup = bs(html.content, 'lxml', from_encoding='utf-8')
????????bqs = soup.find_all(name='a', attrs={'data-click':re.compile(r'.'), 'class':None})
????????????for i in bqs:
????????????????????r = requests.get(i['href'], headers=headers, timeout=5)
????????????????????print r.url
if __name__ == '__main__':
????getfromBaidu('阿甫哥哥',10)
0×05 【彩蛋篇】論壇自動(dòng)簽到腳本 查看全部
本文作者:i春秋簽約作家——阿甫哥哥
系列文章專(zhuān)輯:
0×00 前言
URl采集在批量刷洞中也是很重要的
0×01 目錄
0×01 前言
0×02 ZoomEyeAPI腳本編寫(xiě)
0×03 ShoDanAPI腳本編寫(xiě)
0×04 簡(jiǎn)易BaiduURL采集腳本編寫(xiě)
0×05 【彩蛋篇】論壇自動(dòng)簽到腳本
0×02 ZoomEyeAPI腳本編寫(xiě)
ZoomEye是一款對于網(wǎng)絡(luò )空間的搜索引擎,收錄了互聯(lián)網(wǎng)空間中的設備、網(wǎng)站及其使用的服務(wù)或組件等信息。
ZoomEye 擁有兩大探測引擎:Xmap 和 Wmap,分別對于網(wǎng)絡(luò )空間中的設備及網(wǎng)站, 通過(guò) 24 小時(shí)不間斷的偵測、識別,標識出互聯(lián)網(wǎng)設備及網(wǎng)站所使用的服務(wù)及部件。 研究人員可以通過(guò) ZoomEye 方便的了解組件的普及率及漏洞的危害范圍等信息。
雖然被稱(chēng)為 “黑客友好” 的搜索引擎,但 ZoomEye 并不會(huì )主動(dòng)對網(wǎng)絡(luò )設備、網(wǎng)站發(fā)起攻擊,收錄的數據也僅用于安全研究。ZoomEye更像是互聯(lián)網(wǎng)空間的一張航海圖。
ZoomEyeAPI參考手冊在這:ZoomEye API 參考手冊
先登錄,然后獲得access_token
#-*- coding: UTF-8 -*-
?
import requests
import json
?
user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
if __name__ == '__main__':
????print Login()
然后,API手冊是這樣寫(xiě)的,根據這個(gè),咱們先寫(xiě)一個(gè)HOST的單頁(yè)面采集的….

#-*- coding: UTF-8 -*-
?
import requests
import json
?
user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search():
????headers = {'Authorization': 'JWT ' + Login()}
????r = requests.get(url = 'https://api.zoomeye.org/host/search?query=tomcat&page=1',
?????????????????????????headers = headers)
????response = json.loads(r.text)
????print response
if __name__ == '__main__':
????search()
返回的信息量極大啊,但它只是個(gè)JSON數據,SO,我們可以取出IP部分…

for x in response['matches']:
????????print x['ip']
之后,HOST的單頁(yè)面采集也就OK了,WEB的也五五開(kāi),留著(zhù)他們自己分析,其實(shí)差不多,后文會(huì )貼的
接下來(lái),就是用FOR循環(huán)….獲取多頁(yè)的IP
#-*- coding: UTF-8 -*-
?
import requests
import json
?
def Login():
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search():
????headers = {'Authorization': 'JWT ' + Login()}
????for i in range(1,int(PAGECOUNT)):
????????r = requests.get(url = 'https://api.zoomeye.org/host/search?query=tomcat&page='+str(i),
?????????????????????????headers = headers)
????????response = json.loads(r.text)
????????for x in response['matches']:
????????????print x['ip']
if __name__ == '__main__':
????user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
????passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
????PAGECOUNT = raw_input('[-] PLEASE INPUT YOUR SEARCH_PAGE_COUNT(eg:10):')
????search()
這樣就取出了你想要的頁(yè)碼的數據,然后就是完善+美觀(guān)代碼了…..
#-*- coding: UTF-8 -*-
?
import requests
import json
?
def Login(user,passwd):
????data_info = {'username' : user,'password' : passwd}
????data_encoded = json.dumps(data_info)
????respond = requests.post(url = 'https://api.zoomeye.org/user/login',data = data_encoded)
????try:
????????r_decoded = json.loads(respond.text)
????????access_token = r_decoded['access_token']
????except KeyError:
????????return '[-] INFO : USERNAME OR PASSWORD IS WRONG, PLEASE TRY AGAIN'
????return access_token
def search(queryType,queryStr,PAGECOUNT,user,passwd):
????headers = {'Authorization': 'JWT ' + Login(user,passwd)}
????for i in range(1,int(PAGECOUNT)):
????????r = requests.get(url = 'https://api.zoomeye.org/'+ queryType +'/search?query='+queryStr+'&page=' + str(i),
?????????????????????????headers = headers)
????????response = json.loads(r.text)
????????try:
????????????if queryType == "host":
????????????????for x in response['matches']:
????????????????????print x['ip']
????????????if queryType == "web":
????????????????for x in response['matches']:
????????????????????print x['ip'][0]
????????except KeyError:
????????????print "[ERROR] No hosts found"
?????
def main():
????print " _____???????????????????? _____?????????? ____? "???????????????
????print "|__? /___?? ___? _ __ ___ | ____|?? _? ___/ ___|? ___ __ _ _ __"?
????print "? / // _ \ / _ \| '_ ` _ \|? _|| | | |/ _ \___ \ / __/ _` | '_ \ "
????print " / /| (_) | (_) | | | | | | |__| |_| |? __/___) | (_| (_| | | | |"
????print "/____\___/ \___/|_| |_| |_|_____\__, |\___|____/ \___\__,_|_| |_|"
????print "??????????????????????????????? |___/??????????????????????????? "
????user = raw_input('[-] PLEASE INPUT YOUR USERNAME:')
????passwd = raw_input('[-] PLEASE INPUT YOUR PASSWORD:')
????PAGECOUNT = raw_input('[-] PLEASE INPUT YOUR SEARCH_PAGE_COUNT(eg:10):')
????queryType = raw_input('[-] PLEASE INPUT YOUR SEARCH_TYPE(eg:web/host):')
????queryStr = raw_input('[-] PLEASE INPUT YOUR KEYWORD(eg:tomcat):')
????Login(user,passwd)
????search(queryType,queryStr,PAGECOUNT,user,passwd)
if __name__ == '__main__':
????main()
0×03 ShoDanAPI腳本編寫(xiě)
Shodan是互聯(lián)網(wǎng)上更可怕的搜索引擎。
CNNMoney的一篇文章寫(xiě)道,雖然現今人們都覺(jué)得谷歌是最強勁的搜索引擎,但Shodan才是互聯(lián)網(wǎng)上更可怕的搜索引擎。
與谷歌不同的是,Shodan不是在網(wǎng)上搜索網(wǎng)址,而是直接處于互聯(lián)網(wǎng)的背后通道。Shodan可以說(shuō)是一款“黑暗”谷歌,一刻不停的在尋求著(zhù)所有跟互聯(lián)網(wǎng)關(guān)聯(lián)的服務(wù)器、攝像頭、打印機、路由器等等。每個(gè)月Shodan都會(huì )在大概5億個(gè)服務(wù)器上日夜不停地搜集信息。
Shodan所收集到的信息是非常驚人的。凡是鏈接至互聯(lián)網(wǎng)的紅綠燈、安全攝像頭、家庭自動(dòng)化設備以及加熱系統等等都會(huì )被輕易的搜索到。Shodan的使用者曾發(fā)現過(guò)一個(gè)水上公園的控制系統,一個(gè)加油站,甚至一個(gè)酒店的葡萄酒冷卻器。而網(wǎng)站的研究者也曾使用Shodan定位到了核電站的指揮跟控制系統及一個(gè)粒子回旋加速器。
Shodan真正值得注意的能力就是能找到幾乎所有跟互聯(lián)網(wǎng)相關(guān)聯(lián)的東西。而Shodan真正的可怕之處就是這些設備幾乎都沒(méi)有安裝安全攻擊措施,其可以隨意進(jìn)入。
淺安dalao寫(xiě)過(guò),介紹的也更具體…..
地址傳送門(mén):基于ShodanApi接口的讀取python版
先說(shuō)基于A(yíng)PI查詢(xún)。。。官方文檔:
每次查詢(xún)要扣除1積分…..,而用shodan庫模塊不需要….
寫(xiě)個(gè)簡(jiǎn)單的,他和Zoomeye的五五開(kāi),就不細寫(xiě)了…
#-*- coding: UTF-8 -*-
import requests
import json
?
def getip():
????????API_KEY = *************
????????url = 'https://api.shodan.io/shodan/host/search?key='+API_KEY+'&query=apache'
????????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????????req = requests.get(url=url,headers=headers)
????????content = json.loads(req.text)
????????for i in content['matches']:
????????????????print i['ip_str']
if __name__ == '__main__':
????????getip()
接下來(lái),就是基于shodan模塊的…直接引用淺安dalao的。。。我沒(méi)法寫(xiě)….
安裝:pip install shodan
#-*- coding: UTF-8 -*-
import shodan
import sys
API_KEY = ‘YOU_API_KEY’ #調用shodan api
FACETS = [
????????('country',100), # 匹配出前一百位的國家數量,100可自定義
]
FACET_TITLES = {
????'country': 'Top 100 Countries',
}
#輸入判斷
if len(sys.argv) == 1:
????print 'Search Method:Input the %s and then the keyword' % sys.argv[0]
????sys.exit()
try:
????api = shodan.Shodan(API_KEY)
????query = ' '.join(sys.argv[1:])
????print "You Search is:" + query
????result = api.count(query, facets=FACETS) # 使用count比search快
????for facet in result['facets']:
????????print FACET_TITLES[facet]
????????for key in result['facets'][facet]:
?????????????????countrie = '%s :? %s' % (key['value'], key['count'])
?????????????????print countrie
?????????????????with open(u"搜索" + " " + query + " " + u"關(guān)鍵字" +'.txt','a+') as f:
????????????????????????????f.write(countrie +"\n")
????????????????????????????f.close()
????????print " "
????????print "save is coutures.txt"????????
????????print "Search is Complete."
except Exception, e:
????print 'Error: %s' % e
0×04 簡(jiǎn)易BaiduURL采集腳本編寫(xiě)
先是爬去單頁(yè)的URL,舉個(gè)栗子是爬去阿甫哥哥這個(gè)關(guān)鍵字的URL
#-*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoup as bs
import re
def getfromBaidu(word):
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????url = 'https://www.baidu.com.cn/s?wd=' + word + '&pn=1'
????html = requests.get(url=url,headers=headers,timeout=5)
????soup = bs(html.content, 'lxml', from_encoding='utf-8')
????bqs = soup.find_all(name='a', attrs={'data-click':re.compile(r'.'), 'class':None})
????for i in bqs:
????????????r = requests.get(i['href'], headers=headers, timeout=5)
????????????print r.url
if __name__ == '__main__':
????getfromBaidu('阿甫哥哥')
然后是多頁(yè)的爬取,比如爬取前20頁(yè)的
#-*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoup as bs
import re
def getfromBaidu(word,pageout):
????headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87'}
????for k in range(0,(pageout-1)*10,10):
????????????url = 'https://www.baidu.com.cn/s?wd=' + word + '&pn=' + str(k)
????????html = requests.get(url=url,headers=headers,timeout=5)
????????soup = bs(html.content, 'lxml', from_encoding='utf-8')
????????bqs = soup.find_all(name='a', attrs={'data-click':re.compile(r'.'), 'class':None})
????????????for i in bqs:
????????????????????r = requests.get(i['href'], headers=headers, timeout=5)
????????????????????print r.url
if __name__ == '__main__':
????getfromBaidu('阿甫哥哥',10)

0×05 【彩蛋篇】論壇自動(dòng)簽到腳本


