爬蟲獲取代理IP并檢驗可用性與識別指紋
前段時間在做有關代理IP與路由器的學習,基于FreeBuf上feiniao的文章http://www.freebuf.com/articles/web/159172.html,自己總結并修改了部分代碼,實現了代理IP的爬取以及簡單的分析,在此將自己的動手過程簡單記錄下來。
代理IP能實現IP隱藏,通過大量獲取可用的代理IP,能夠實現反追蹤的滲透測試行為,在網絡上有許多搜索代理IP的網站,要獲取可用的代理IP,采取簡單的辦法,直接爬取那些網上的IP就行,http://www.xicidaili.com這個網站可以來進行代理IP的收集,需要注意的是,這個網站也采取了一定的反爬蟲機制,有時候會把進行爬蟲行為的主機IP給封掉,被封掉后再訪問這個網站只會出現一個“block”內容的頁面,在爬蟲的時候可以開啟全局代理,或者使用其他方法更換IP就好。
在獲取到代理IP之后,需要對IP的可用性進行驗證,因為獲取到的代理IP不是所有都是可用的,基于FreeBuf上的驗證方法,是使用每一個IP自己發送http包,將http的proxy設置成要驗證的代理IP,對百度www.baidu.com進行訪問,如果返回的數據包的應答值是200說明此IP可用,但是在使用的過程中也發現了一些問題,原文章中使用的get函數時延為10,但是有很多代理IP的反應速度比較慢,就算是可用的也會識別為不可用的。為什么不把時延值提高呢,是由于就算在10的時延下,程序運行起來也非常的慢,在和幾個同學一起做的過程中,發現平均驗證一個IP就要花掉2~4秒鐘,這種速率在我們3萬多條待驗證的代理IP下實在太慢,所以把時延調高的話就會更慢了。。。。。。
為了增快檢驗速度,稍微采取了一下多線程的方法,間隔0.1秒不斷生成檢驗可用性的線程,在這個情況下遍歷完、3萬多條IP大概要兩個小時,但是后面發現的一個問題是3萬多條IP中只檢測出來符合條件的只有30個左右,不太符合預期,可能是檢驗可用性的代碼設計本身的問題,具體如何改良后面沒有繼續深究,以后有時間會找一個更高效識別率更高的檢驗方法出來。
對檢驗到的可用的代理IP進行保存,使用代理IP構造http包,分析http響應包報頭,識別出服務器版本信息,當成代理IP的指紋。
整個流程的一次性實現代碼如下,在本人的PyCharm環境下驗證可有效運行。
#coding:utf-8
from requests import *
import re
import time
import _thread
pattern1 = re.compile(r'[0-9]{0}([0-9]|[.])*')
pattern = re.compile(r'\s+[0-9]+\s')
headers1 = { "accept":"text/html,application/xhtml+xml,application/xml;",
"accept-encoding":"gzip", "accept-language":"zh-cn,zh;q=0.8",
"referer":"Mozilla/5.0(compatible;Baiduspider/2.0;+http://www.baidu.com/search/spider.html)",
"connection":"keep-alive",
"user-agent":"mozilla/5.0(windows NT 6.1;wow64) applewebkit/537.36 (khtml,like gecko)chrome/42.0.2311.90 safari/537.36" }
headers2 = {
"Host": "www.baidu.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0",
"Accept": "*/*",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate",
"Referer": "https://www.baidu.com/"
}
headers3 = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0",
"Accept": "*/*",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate",
}
urlb = 'https://www.baidu.com'
j=0
def fun(proxy):
proxy = proxy.replace('\n', '')
proxies = {"https": proxy}
try:
html = get(urlb, timeout=10, headers=headers2, proxies=proxies)
if html.status_code == 200:
proxy = proxy.split('https://')[1]
f = open('proxyip.txt', 'a')
f.write(proxy)
f.write("\n")
except Exception as e:
print(e)
pass
for i in range(1,835):
url = 'http://www.xicidaili.com'
url = url + '/wn/'
url = url + str(i)
html = get(url, timeout=100, headers=headers1)
html.encoding = html.apparent_encoding
proxyip = r'(<td>.*</td>)'
iplist = re.findall(proxyip, html.text)
for ip in iplist:
ip = (ip.split('<td>')[1]).split('</td>')[0]
f = open("ip.txt", 'a')
if j%5==0:
f.write("\n")
f.write(ip)
f.write("\t")
else:
f.write(ip)
f.write("\t")
j=j+1
print("IP 代理信息爬取完畢,開始提取IP地址與端口號.......")
time.sleep(3)
for line in open("ip.txt"):
match1 = pattern1.match(line)
match2 = pattern.findall(line)
if match1 and match2:
f=open("https.txt",'a')
str="https://"+match1.group()+':'+match2[0].strip()
f.write(str)
f.write("\n")
print("Https代理格式文件生成完畢,開始檢驗是否可用.........")
time.sleep(3)
for line in open("https.txt",'r'):
_thread.start_new_thread(fun,(line,))
time.sleep(0.2)
print("可用性檢驗完畢,開始分析指紋信息.......")
time.sleep(3)
for url in open("proxyip.txt"):
url = "http://"+ url.split('\n')[0]
try:
html = get(url,timeout=100,headers=headers3)
html = html.headers['server']
f = open("proxyanalysis.txt", 'a')
f.write(url)
f.write(html)
f.write("\n")
except Exception as e:
pass
print("分析完畢")
運行后會生成四個txt文件,分別是ip.txt(初步爬到的代理IP信息,信息包括IP地址、端口號、代理協議類型、存活時間、爬取時間),https.txt是對ip.txt整理后得到的格式統一為https://IP地址:端口號的IP,然后對其進行可用性檢測,生成的可用IP保存在proxy.txt中,最后分析IP指紋,保存在proxyanalysis.txt中。最后得到的結果下:
http://180.173.71.250:9797Mikrotik HttpProxy
http://112.95.95.180:9999Mikrotik HttpProxy
http://183.51.191.22:9999Mikrotik HttpProxy
http://183.30.197.39:9797Mikrotik HttpProxy
http://123.138.89.133:9999Mikrotik HttpProxy
http://222.85.22.19:43080squid/3.5.20
http://218.20.55.168:9999Mikrotik HttpProxy
http://1.196.161.165:9999Mikrotik HttpProxy
http://211.159.171.58:80Apache/2.4.6 (CentOS)
http://61.144.102.150:9797Mikrotik HttpProxy
http://183.30.197.39:9797Mikrotik HttpProxy
http://58.220.95.107:8080Zscaler/6.0
以上的代碼存在著一些問題導致獲取到的可用代理IP數量過少,在今后的學習中會對其進行改良、尋找更高效的方法,獲取更多的代理IP,方便進行下一步的項目工作。
智能推薦
RHCS 集群套件的搭建(Fence)以及高可用集群的實現(httpd為例)
一、基礎概念 1.什么是集群? 是指一組相互獨立的計算機,利用高速通信網絡組成的一個較大的計算機服務系統,每個集群節點都是運行各自服務的獨立服務器,這些服務器之間可以彼此通信,協同向用戶提供應用程序,系統資源和數據,并以單一系統的模式加以管理。 2.集群的優點 高性能;價格有效性;可伸縮性;高可用;透明性;可管理;可編程 3.什么是RHCS? RHCS是Red Hat Cluster Suite的...
Windows上超詳細安裝 MySQL(包含解決VCRUNTIME140_1.dll丟失)
1.下載 到MySQL官網:https://www.mysql.com/downloads/ 或者到百度云:鏈接:https://pan.baidu.com/s/1sf1wGV_sIhrHZW4z1zdGlA 提取碼:p0g3 拉到下面點擊: 選擇紅框: 2.解壓安裝: 解壓下載的文件,一般(在C盤的Program Files文件里建一個MySQL文件夾)把文件解壓到那里面,我直接解壓在D盤;這個...
Linux學習(8)——Shell變量
目錄 概述 Bash變量之什么是變量與變量分類 1、變量命名規則 2、變量按照存儲數據分類 3、變量的分類 Bash變量之用戶自定義變量 1、定義變量 2、變量調用 3、變量疊加 4、變量查看 5、刪除變量 Bash變量之環境變量 1、設置環境變量 2、查看環境變量 3、刪除環境變量 4、常用環境變量 5、PATH環境變量 6、PS1環境變量 Bash變量之語系變量 1、當前語系查詢 2、語系變量...
Android View繪制(二)-繪制流程分發
Android View繪制(二)-繪制流程分發 Android View繪制(二)-繪制流程分發 從 addView() 說起 View.requestLayout() 方法 ViewRootImpl.requestLayout() 總結-android View 繪制流程 在上一篇文章,我們了解了 Android inflate 的流程,也就是布局文件 inflate 成 View 的簡要流程...
Java作業5
1. 實驗:利用IDE的debug功能給例6.4和例6.6的new語句設置斷點,使用單步調試(step into/step over)跟蹤子類對象實例化(初始化)的執行順序,并總結該過程。 1.為子類對象分配空間,對域變量默認初始化。 2.綁定構造方法,將new中的參數傳遞給構造方法的形式參數。 3.調用this或super語句。二者必居其一,不能同時存在。 4.進行實例變量的顯式初始化操作如: ...
猜你喜歡
蒙特卡羅模擬賭徒人生
在學習的過程中也要多思考。 模擬賭徒的人生,每一次都是隨機的過程,模擬完整個過程,根據結果可以判斷賭徒最后的輸贏情況。 代碼如下: 需要注意的是,每次運行的結果都是不一樣的,最后可能輸錢也可能贏錢,在這過程中,要遵守的原則是,如果在賭場中玩家錢已經輸完了,那他得退出游戲。...
Object類
經過了一系列的學習可以發現有一個最麻煩的問題出現了:現在有對象、數組接口,那么這么多數據怎么能夠進行統一呢?于是就有了Object類的設計。 一、Object類的基本定義 Object類是所有類的父類,也就是說任何一個類在定義的時候如果沒有明確的繼承一個父類的話,那么它就是Object類的子類,也就是說,以下兩種類定義的最終效果是完全相同的: class Book{} class&nbs...
springboot集成swagger2
簡介 當前很多項目需要前后端分離,一般主流的架構是vue+springboot。 前端團隊:于前端控制層+視圖層 后端團隊:后端控制層+服務層+數據訪問層 當前后端分離后,前端需要去調用后端的接口,如果能讓前端及時的了解后端接口的情況,就能夠減少前端和后端的溝通成本,就有了swagger springboot集成swagger 新建一個maven 項目 引入jar包,在pom.xml中引入swag...
Leetcode算法題(五)---------羅馬數字轉整數
Leetcode算法題(五)---------羅馬數字轉整數 題目:羅馬數字包含以下七種字符: I, V, X, L,C,D 和 M。 例如, 羅馬數字 2 寫做 II ,即為兩個并列的 1。12 寫做 XII ,即為 X + II 。 27 寫做 XXVII, 即為 XX + V + II 。 通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 IIII,而是 IV。...
RabbitMQ:Exchange的Direct類型的介紹和使用
1.聲明 當前內容用于本人學習和復習RabbitMQ的使用,當前內容主要用于分析和使用Exchange的Direct類型,發現其中的使用方式和具體操作 2.Direct Exchange的介紹 這里主要參考:RabbitMQ的Direct Exchange 直接交換基于消息路由**將消息傳遞到隊列。直接交換是消息單播路由的理想選擇(盡管它們也可以用于多播路由)。下面是它的工作原理: 隊列使用路由*...