Python 으로 익명 에이전트 만 들 기
많은 사람들 이 자신의 IP 가 파충류 의 횟수 가 너무 많아 서 사이트 에 차단 되 어 각종 대리 IP 를 자주 사용 할 수 밖 에 없다 고 불평 하 는 것 을 자주 듣는다.그러나 인터넷 의 공개 대리 가 대부분 사용 할 수 없 기 때문에 돈 을 써 서 VIP 대 리 를 신청 해 야 하기 때문에 몇 번 의 우여곡절 끝 에 차단 되 었 다.파 이 썬 을 이용 하여 프 록 시 풀 을 만 드 는 방법 에 대한 글 을 써 서 시간 과 정력 원 가 를 낮 추고 자동화 로 활성 화 된 프 록 시 IP 를 얻 는 기능 을 실현 합 니 다.
02 작 동 원리
1.사이트 에이전트 획득
1. 무료 프 록 시 사이트 의 IP 목록 에 올 라 가 사용 가능 여부 및 은닉 여 부 를 테스트 합 니 다.
2. 만약 모두 그렇다면 데이터베이스 에 넣 어 라,그렇지 않 으 면 버 려 라.
3. 2 단계 반복
2.실 효 를 보장 하 는 대리 가 가능 한 한 빨리 대리 지 에서 뽑 힐 수 있 습 니 다.
1. 파충류 데이터베이스 에서 IP 획득
2. IP 의 가용성 과 익명 성 을 테스트 하 다
3. 사용 가능 하고 익명 이면 보류 합 니 다.그렇지 않 으 면 버 립 니 다.
4. 1 단계 반복
설명 ①:파충류 프로그램 데 몬(Daemon)을 만 들 수 있 고 이런 부분 에 필요 한 파트너 가 스스로 구 글 을 만 들 수 있 으 며 더 이상 소개 하지 않 는 다.
설명 ②:대외 대리 정보 인 터 페 이 스 를 만 들 수 있 습 니 다.NodeJS 나 Flask/Django 또는 PHP 로 써 도 괜 찮 습 니 다.여기 서 더 이상 소개 하지 않 습 니 다.
03 실현
제안 라 이브 러 리:requests,BeautifulSoup,re,sqlite 3.
그 중에서 requests 라 이브 러 리 로 프 록 시 페이지 를 얻 고 BeautifulSoup 과 re 두 라 이브 러 리 로 프 록 시 정 보 를 얻 으 며 sqlite 3 으로 이 정 보 를 액세스 합 니 다.
필요 하 다 면(예 를 들 어 프 록 시 사이트 에 반 파충류 정책 이 있 을 때)PhantomJS 로 requests 를 대체 하거나 해당 라 이브 러 리 로 데이터 청 소 를 할 수 있 습 니 다(예 를 들 어 base 64 디 코딩).
다음은 각 부분의 코드 를 간단하게 보 여 드 리 겠 습 니 다.
우선 프 록 시 를 찾 을 수 있 고 IP 가 차단 되 지 않 는 여러 개의 사 이 트 를 선택 하 십시오.여 기 는 proxy-list.org 를 예 로 들 면:
BASE_URL = "https://proxy-list.org/english/index.php?p="
#IP
Re_Pattern_IP = re.compile("(.*):")
Re_Pattern_PORT = re.compile(":(.*)")
# 11 , 11 IP
for startingURL_Param in range(1,11):
HTML_ProxyPage = requests.get(BASE_URL+str(startingURL_Param)).content
soup = bs(HTML_ProxyPage,"html.parser")
for Raw_ProxyInfo in soup.find_all("ul",{"class":None}):
# Base64 ,
ip_port = base64.b64decode(Raw_ProxyInfo.find("li",{"class":"proxy"}).text.replace("Proxy('","").replace("')",""))
#
IP = re.findall(Re_Pattern_IP, ip_port)[0]
PORT = re.findall(Re_Pattern_PORT, ip_port)[0]
TYPE = Raw_ProxyInfo.find("li",{"class":"https"}).text
, 、 、 、 :
-
class ProxyPool:
-
#
-
def __init__(self,ProxyPoolDB):
-
self.ProxyPoolDB = ProxyPoolDB
-
self.conn = sqlite3.connect(self.ProxyPoolDB, isolation_level=None)
-
self.cursor = self.conn.cursor()
-
self.TB_ProxyPool = "TB_ProxyPool"
-
self.cursor.execute("CREATE TABLE IF NOT EXISTS "+self.TB_ProxyPool+"(ip TEXT UNIQUE, port INTEGER, protocol TEXT)")
-
-
# IP
-
def addProxy(self, IP, PORT, PROTOCOL):
-
self.cursor.execute("INSERT OR IGNORE INTO " + self.TB_ProxyPool+"(ip, port, protocol) VALUES (?,?,?)", [IP,PORT,PROTOCOL])
-
-
#
-
def testConnection(self, IP, PORT, PROTOCOL):
-
proxies = { PROTOCOL: IP+":"+PORT }
-
try:
-
OrigionalIP = requests.get("http://icanhazip.com", timeout=REQ_TIMEOUT).content
-
MaskedIP = requests.get("http://icanhazip.com", timeout=REQ_TIMEOUT, proxies=proxies).content
-
if OrigionalIP != MaskedIP:
-
return True
-
else:
-
return False
-
except:
-
return False
-
-
# IP
-
def delRecord(self, IP):
-
self.cursor.execute("DELETE FROM "+self.TB_ProxyPool+" WHERE ip=?",(IP,))
“ IP” :
-
# , IP
-
def cleanNonWorking(self):
-
for info in self.cursor.execute("SELECT * FROM "+self.TB_ProxyPool).fetchall():
-
IP = info[0]
-
PORT = str(info[1])
-
PROTOCOL = info[2].lower()
-
-
isAnonymous = self.testConnection(IP,PORT,PROTOCOL)
-
if isAnonymous == False:
-
# ,
-
self.delRecord(IP)
-
-
# icanhazip.com
-
def testConnection(self, IP, PORT, PROTOCOL):
-
proxies = { PROTOCOL: IP+":"+PORT }
-
try:
-
OrigionalIP = requests.get("http://icanhazip.com", timeout=REQ_TIMEOUT).content
-
MaskedIP = requests.get("http://icanhazip.com", timeout=REQ_TIMEOUT, proxies=proxies).content
-
if OrigionalIP != MaskedIP:
-
return True
-
else:
-
return False
-
except:
-
return False
04
Python , , , , , , , 。
icanhazip.com , X-Forwarded-For HTTP , , 。
, , 。
05
, 。 Github ,Ubuntu 16.04 Kali Python 2.7 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python 함수의 귀속함수는 코드의 봉인으로 다른 프로그램에 호출될 수도 있고 함수 내부에서 호출될 수도 있으며 함수 내부에서 자신을 호출하는 방식을 함수의 귀속이라고 부른다.마치 사람이 거울 앞에 서서 거울을 보는 것과 같다. 한 사람...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.