Der Inhalt dieses Artikels besteht darin, vorzustellen, wie man mit Python einen anonymen Proxy-Pool erstellt. So erstellen Sie einen anonymen Proxy-Pool. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird Ihnen hilfreich sein.
Ich höre oft, dass sich viele Leute darüber beschweren, dass ihre IPs von Websites blockiert werden, weil zu viele Crawler vorhanden sind und sie häufig verschiedene Proxy-IPs verwenden müssen, aber weil die meisten öffentlichen Proxys im Internet nicht verwendet werden können, und Sie müssen Geld und Energie aufwenden, um sich für einen VIP-Agenten zu bewerben, werden aber nach mehreren Wendungen blockiert. Schreiben Sie hier einen Artikel darüber, wie Sie mit Python einen Proxy-Pool erstellen, um Zeit- und Energiekosten zu reduzieren und die Funktion des automatischen Erhaltens aktiver Proxy-IPs zu realisieren.
Funktionsprinzip
1. Website-Proxy-Erfassung
1. Erklimmen Sie die IP-Liste der kostenlosen Proxy-Website, um zu testen, ob dies der Fall ist verfügbar ist und ob es hoch ist. Anonym
2. Wenn alle vorhanden sind, fügen Sie sie in die Datenbank ein, andernfalls verwerfen Sie sie.3.
Wiederholen Sie Schritt 22. Stellen Sie sicher, dass der ausgefallene Agent so schnell wie möglich aus dem Agentenpool ausgewählt werden kann
1.
Holen Sie sich die IP aus der Crawler-Datenbank2. Testen Sie die Verfügbarkeit und Anonymität der IP
Wenn verfügbar und anonym, behalten Sie es, andernfalls verwerfen Sie es.
4. Wiederholen Sie Schritt 1
Anleitung ①: Sie können einen Crawler-Daemon erstellen, der diesen Aspekt hat. Freunde, die ihn brauchen Ich kann es selbst googeln, ich werde es hier nicht vorstellen.
Erläuterung ②: Sie können eine externe Proxy-Informationsschnittstelle einrichten. Es spielt keine Rolle, ob Sie NodeJS oder Flask/Django oder PHP zum Schreiben verwenden .
Implementierung:
Empfohlene Bibliotheken: request, BeautifulSoup, re, sqlite3. Unter anderem wird die Anforderungsbibliothek verwendet, um die Seite der Agenten-Website abzurufen, die Bibliotheken BeautifulSoup und re werden verwendet, um Agenteninformationen abzurufen, und sqlite3 wird verwendet, um auf diese Informationen zuzugreifen.
Bei Bedarf (z. B. wenn die Proxy-Website über eine Anti-Crawler-Strategie verfügt) kann PhantomJS zum Ersetzen von Anforderungen verwendet werden, oder die entsprechende Bibliothek kann zur Datenbereinigung (z. B. Base64-Dekodierung) verwendet werden.
Das Folgende ist eine kurze Demonstration jedes Teils des Codes:
Die erste besteht darin, mehrere Websites auszuwählen, die Proxys crawlen können und nicht leicht durch IP blockiert werden. Hier Proxy-Liste. org wird als Beispiel verwendet:
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
Das Folgende ist ein Codestück für eine einfache Proxy-Pool-Framework-Klasse, die das Hinzufügen, Löschen, die Verbindungserkennung und die Anonymitätserkennung der Proxy-Datenbank bereitstellt:
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,))
Der folgende Code dient zum Löschen des Proxy-Pools:
#循环代理池,逐行测试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
Reflection
Dies Projekt war etwas, mit dem ich Handschrift in Python geübt habe. Rückblickend ist die Logik nicht streng genug, verschiedene Funktionen sind zu gekoppelt und viele Absätze müssen neu geschrieben werden, da der Code im Campus-Netzwerk ausgeführt wird Die Stabilität der Netzwerkverbindung muss berücksichtigt werden, was zu Inkonsistenzen zwischen einigen Codes führt.
Die Methode zur Erkennung der Proxy-Anonymität über icanhazip.com mag effektiv sein, ignoriert jedoch den HTTP-Header X-Forwarded-For, ist also sehr riskant und muss verbessert werden.
Die Überprüfung der Gültigkeit der Agenten im Agentenpool erfordert Multithreading und die aktuelle Lösung ist zu ineffizient.
Vollständiger CodeDer Kerncode des Proxy-Pools wird in diesem Artikel platziert, um den Lesern Ideen und Referenzen für ihre eigene Implementierung, Ubuntu 16.04 und Kali, zu bieten Der Test kann mit Python 2.7 ausgeführt werden.
Das obige ist der detaillierte Inhalt vonWie erstellt man mit Python einen anonymen Proxy-Pool? So erstellen Sie einen anonymen Proxy-Pool. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!