Maison  >  Article  >  développement back-end  >  proxy d'analyse python et comment obtenir le partage d'exemple d'adresse IP de proxy disponible

proxy d'analyse python et comment obtenir le partage d'exemple d'adresse IP de proxy disponible

黄舟
黄舟original
2017-08-07 15:36:291650parcourir

L'éditeur suivant vous apportera un exemple de proxy d'analyse Python et d'obtention de l'adresse IP du proxy disponible. L'éditeur le trouve plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence pour tout le monde. Suivons l'éditeur pour y jeter un œil

Aujourd'hui, nous allons écrire un outil très pratique, qui consiste à scanner et obtenir les proxys disponibles

Premier Surtout, j'ai d'abord trouvé un site Web sur Baidu : www.xicidaili.com à titre d'exemple

Ce site Web publie de nombreuses IP proxy et ports disponibles dans le pays et à l'étranger

Nous procédons toujours comme d'habitude. Pour analyse, analysons d'abord tous les proxys nationaux

Cliquez sur la partie domestique pour examiner et constater que le proxy et le répertoire nationaux sont l'URL suivante :

www.xicidaili.com/nn/x

Ce x compte près de deux mille pages, il semble donc que le traitement du fil soit à nouveau nécessaire. . .

Comme d'habitude, on essaie d'obtenir le contenu directement avec les requêtes les plus simples.get()

renvoie 503, puis on ajoute un simple en-tête

et renvoie 200, OK

D'accord, analysons d'abord le contenu Web et obtenons le contenu que nous voulons

Nous avons constaté que le contenu contenant des informations IP se trouve dans la balise a34de1251f0d9fe1e645927f19a896e8 obtenir le contenu de la balise

, mais nous avons découvert plus tard que le contenu de l'adresse IP, du port et du protocole se trouve dans les 2e, 3e et 6e balises b6c5a531a458a2e790c1fd6421739d1c 🎜>

On a donc commencé à essayer d'écrire, voici l'idée d'écriture :

Lors du traitement de la page, on extrait d'abord la balise tr, et puis tr La balise td dans la balise est extraite

Par conséquent, deux opérations bs sont utilisées et un traitement str est requis lors de la deuxième utilisation de l'opération bs

Parce qu'après avoir obtenu tr, nous en avons besoin de 2, les choses n°3 et 6,

Mais lorsque nous utilisons la sortie i par une boucle for, nous ne pouvons pas effectuer d'opérations de groupe

Nous effectuons donc simplement une deuxième opération sur la soupe de chaque td séparément Puis extraire directement 2,3,6

Après extraction, ajouter directement .string pour extraire le contenu


r = requests.get(url = url,headers = headers)
 soup = bs(r.content,"html.parser")
 data = soup.find_all(name = 'tr',attrs = {'class':re.compile('|[^odd]')})
 for i in data:

  soup = bs(str(i),'html.parser')
  data2 = soup.find_all(name = 'td')
  ip = str(data2[1].string)
  port = str(data2[2].string)
  types = str(data2[5].string).lower() 

  proxy = {}
  proxy[types] = '%s:%s'%(ip,port)
De cette façon , nous bouclons à chaque fois pour générer le dictionnaire proxy correspondant afin que nous puissions utiliser le dictionnaire

pour vérifier la disponibilité IP. Il y a un point à noter ici, nous avons une opération pour changer le type en minuscules, car. dans les proxys de la méthode get, écrivez Le nom du protocole saisi doit être en minuscules et la page Web explore le contenu en majuscules, donc une conversion de casse est effectuée

Alors, quelle est l'idée de vérifier la disponibilité de l'IP ?

C'est très simple. Nous utilisons get , plus notre agent, demandez le site :

http://1212.ip138.com/ic.asp

Il s'agit d'un site Web magique qui peut renvoyer l'adresse IP de votre réseau externe. Quoi



url = 'http://1212.ip138.com/ic.asp'
r = requests.get(url = url,proxies = proxy,timeout = 6)
Ici, nous devons ajouter un délai d'attente pour supprimer les agents qui attendent également. long. Je l'ai réglé sur 6 secondes

Nous l'essayons avec une IP et analysons la page renvoyée

Le contenu renvoyé est le suivant :


Ensuite, il suffit d'extraire le contenu de [] dans la page Web
<html>

<head>

<meta xxxxxxxxxxxxxxxxxx>

<title> 您的IP地址 </title>

</head>

<body style="margin:0px"><center>您的IP是:[xxx.xxx.xxx.xxx] 来自:xxxxxxxx</center></body></html>

Si notre proxy est disponible, l'adresse IP du proxy sera renvoyée

(l'adresse renvoyée sera l'adresse IP externe de notre machine locale) Bien que je ne sois pas très clair sur la situation, j'ai exclu cette situation. Le proxy devrait toujours être indisponible)

Ensuite, nous pourrons porter un jugement. . Si l'adresse IP renvoyée est la même que l'adresse IP dans le dictionnaire proxy, alors pensez que cette adresse IP est un proxy disponible et écrivez-la dans le fichier

C'est notre idée. Enfin, nous pouvons traiter la file d'attente et. threading threads

Le code ci-dessus :


De cette façon, nous pouvons écrire toutes les IP proxy disponibles fournies sur le site Web dans le fichier ip_proxy.txt
#coding=utf-8

import requests
import re
from bs4 import BeautifulSoup as bs
import Queue
import threading 

class proxyPick(threading.Thread):
 def __init__(self,queue):
  threading.Thread.__init__(self)
  self._queue = queue

 def run(self):
  while not self._queue.empty():
   url = self._queue.get()

   proxy_spider(url)

def proxy_spider(url):
 headers = {
   .......
  }

 r = requests.get(url = url,headers = headers)
 soup = bs(r.content,"html.parser")
 data = soup.find_all(name = &#39;tr&#39;,attrs = {&#39;class&#39;:re.compile(&#39;|[^odd]&#39;)})

 for i in data:

  soup = bs(str(i),&#39;html.parser&#39;)
  data2 = soup.find_all(name = &#39;td&#39;)
  ip = str(data2[1].string)
  port = str(data2[2].string)
  types = str(data2[5].string).lower() 


  proxy = {}
  proxy[types] = &#39;%s:%s&#39;%(ip,port)
  try:
   proxy_check(proxy,ip)
  except Exception,e:
   print e
   pass

def proxy_check(proxy,ip):
 url = &#39;http://1212.ip138.com/ic.asp&#39;
 r = requests.get(url = url,proxies = proxy,timeout = 6)

 f = open(&#39;E:/url/ip_proxy.txt&#39;,&#39;a+&#39;)

 soup = bs(r.text,&#39;html.parser&#39;)
 data = soup.find_all(name = &#39;center&#39;)
 for i in data:
  a = re.findall(r&#39;\[(.*?)\]&#39;,i.string)
  if a[0] == ip:
   #print proxy
   f.write(&#39;%s&#39;%proxy+&#39;\n&#39;)
   print &#39;write down&#39;
   
 f.close()

#proxy_spider()

def main():
 queue = Queue.Queue()
 for i in range(1,2288):
  queue.put(&#39;http://www.xicidaili.com/nn/&#39;+str(i))

 threads = []
 thread_count = 10

 for i in range(thread_count):
  spider = proxyPick(queue)
  threads.append(spider)

 for i in threads:
  i.start()

 for i in threads:
  i.join()

 print "It&#39;s down,sir!"

if __name__ == &#39;__main__&#39;:
 main()

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn