>  기사  >  백엔드 개발  >  Python을 사용하여 익명 프록시 풀을 구축하는 방법은 무엇입니까? 익명 프록시 풀을 구축하는 방법

Python을 사용하여 익명 프록시 풀을 구축하는 방법은 무엇입니까? 익명 프록시 풀을 구축하는 방법

青灯夜游
青灯夜游앞으로
2018-10-26 17:53:462325검색

이 글의 내용은 Python을 사용하여 익명 프록시 풀을 구축하는 방법을 소개하는 것입니다. 익명 프록시 풀을 구축하는 방법. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

크롤러가 너무 많아 웹사이트에서 자신의 IP가 차단됐다는 불평을 자주 듣는데, 다양한 프록시 IP를 자주 사용해야 하는데, 인터넷상의 공용 프록시는 대부분 사용할 수 없기 때문에 돈을 써야 한다. .VIP 대행사에 지원하기 위해 최선을 다했지만 우여곡절 끝에 또다시 막혔습니다. 이로써 Python을 사용하여 프록시 풀을 구축하여 시간과 에너지 비용을 절감하고 자동으로 활성 프록시 IP를 얻는 기능을 실현하는 방법에 대한 기사를 작성합니다.

작동 원리

1. 웹사이트 프록시 획득

1. 무료 프록시 웹사이트의 IP 목록을 크롤링하여 사용 가능 여부와 밀도가 높은지 테스트합니다

2. 데이터베이스에 넣고 그렇지 않으면 폐기합니다.

3.

2단계를 반복합니다.

2. 실패한 프록시를 가능한 한 빨리 프록시 풀에서 선택할 수 있는지 확인합니다.

1.

크롤러 데이터베이스에서 IP를 가져옵니다.

2. IP 섹스의 가용성 및 익명성

3. 익명이 가능하다면 보관하고 그렇지 않으면 폐기하세요.

4. 1단계를 반복하세요.

지침 ①

: 크롤러 데몬(Daemon)을 만들 수 있습니다. 필요한 친구는 직접 Google에서 찾을 수 있습니다.

설명 ②

: 외부 프록시 정보 인터페이스를 구축할 수 있습니다. NodeJS를 사용하든, Flask/Django를 사용하든, PHP를 사용하든 여기서는 소개하지 않겠습니다.

구현:

권장 라이브러리: 요청, BeautifulSoup, re, sqlite3.

  그 중 요청 라이브러리는 에이전트 웹사이트 페이지를 가져오는 데 사용되고, BeautifulSoup 및 re 라이브러리는 에이전트 정보를 가져오는 데 사용되며, sqlite3은 이 정보에 액세스하는 데 사용됩니다.

필요한 경우(예: 프록시 웹사이트에 크롤러 방지 전략이 있는 경우) PhantomJS를 사용하여 요청을 대체하거나 해당 라이브러리를 데이터 정리(예: base64 디코딩)에 사용할 수 있습니다.

다음은 각 부분의 코드에 대한 간략한 데모입니다.

첫 번째는 프록시를 크롤링할 수 있고 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

다음은 프록시 풀에서 "잘못된 IP"를 제거하는 코드입니다.

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,))

Reflection

이 프로젝트에서 필기 연습을 위해 Python을 사용했습니다. 지금 돌이켜보면 로직이 충분히 엄격하지 않고, 다양한 기능이 너무 결합되어 있고, 많은 문단을 다시 작성해야 하기 때문입니다. 코드는 캠퍼스 네트워크에서 실행되지만 여전히 필요합니다. 네트워크 연결의 안정성을 고려하면 코드 부분 사이에 혼란스러운 관계가 생성됩니다.
icanhazip.com을 통해 프록시 익명성을 탐지하는 방법은 효과적일 수 있지만 X-Forwarded-For HTTP 헤더를 무시하므로 매우 위험하므로 개선해야 합니다.

에이전트 풀에 있는 에이전트의 유효성을 확인하려면 멀티스레딩이 필요하며 현재 솔루션은 너무 비효율적입니다.

완전한 코드

독자에게 자체 구현에 대한 아이디어와 참조를 제공하기 위해 프록시 풀의 핵심 코드가 포함되어 있습니다. Ubuntu 16.04 및 Kali에서 Python 2.7로 테스트할 수 있습니다.

위 내용은 Python을 사용하여 익명 프록시 풀을 구축하는 방법은 무엇입니까? 익명 프록시 풀을 구축하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제