>백엔드 개발 >파이썬 튜토리얼 >Python 스캔 프록시 및 사용 가능한 프록시 IP 예제 공유를 얻는 방법

Python 스캔 프록시 및 사용 가능한 프록시 IP 예제 공유를 얻는 방법

黄舟
黄舟원래의
2017-08-07 15:36:291710검색

다음 편집기는 Python으로 프록시를 스캔하고 사용 가능한 프록시 IP를 얻는 예를 제공합니다. 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리도록 하겠습니다. 편집자를 따라가서 살펴보겠습니다

오늘 우리는 사용 가능한 프록시를 스캔하고 얻는 매우 실용적인 도구를 작성할 것입니다

우선 Baidu에서 웹사이트 www.xicidaili.com을 찾았습니다. 예

이 웹사이트에는 국내외에서 사용 가능한 많은 IP 및 프록시 포트가 게시되어 있습니다

평소처럼 분석하겠습니다. 먼저 국내 프록시를 모두 스캔하겠습니다

국내 프록시를 검토하고 찾으려면 국내 부분을 클릭하세요. 디렉터리는 다음과 같습니다. 다음 URL:

www.xicidaili.com/nn/x

이 x는 거의 2천 페이지에 달하므로 다시 스레드 처리가 필요한 것 같습니다. . .

평소와 같이 가장 간단한 요청을 사용하여 콘텐츠를 직접 가져올 수 있는지 확인하려고 합니다.get()

503을 반환하고 간단한 헤더를 추가합니다

200을 반환합니다. OK

좋아, 웹 페이지를 분석해 보겠습니다. content 먼저 그리고 우리가 원하는 콘텐츠를 얻으세요

우리는 IP 정보가 포함된 콘텐츠가 a34de1251f0d9fe1e645927f19a896e8 태그에 있다는 것을 발견했습니다. 그래서 우리는 bs를 사용하여 태그 콘텐츠를 쉽게 얻을 수 있습니다

그런데 우리는 ip, port, The 프로토콜의 내용은 추출된 a34de1251f0d9fe1e645927f19a896e8 태그의 2번째, 3번째, 6번째 b6c5a531a458a2e790c1fd6421739d1c 태그에 있습니다. page 에서는 tr 태그가 먼저 추출되고 그 다음 tr 태그에 있는 td 태그가 추출됩니다

그래서 두 개의 bs 연산이 사용되며 두 번째로 bs 연산을 사용할 때 str 처리가 필요합니다왜냐하면 tr을 얻은 후이기 때문입니다 , 숫자 2, 3, 6 중 하나가 필요합니다. 그러나 for 루프로 i 출력을 사용하면 그룹 연산을 수행할 수 없습니다.

그래서 우리는 단순히 각 td 수프에 대해 두 번째 연산을 수행하고 직접 2를 추출합니다. ,3 ,6

 추출 후 .string을 추가하면 콘텐츠가 추출됩니다

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)

이런 방식으로 루프할 때마다 해당 프록시 사전을 생성할 수 있으므로 이를 사용하여 IP 가용성을 확인할 수 있습니다.

사전이 여기에 있습니다. 참고로, get 메소드의 프록시에 작성된 프로토콜 이름은 소문자여야 하고 웹 페이지에서는 대문자 내용을 캡처하므로 대소문자 변환이 수행되므로 유형을 소문자로 변경하는 작업이 있습니다.

IP 가용성을 확인하는 아이디어는 무엇입니까


매우 간단합니다. get과 프록시를 사용하여 웹사이트를 요청합니다.

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

이것은 다음과 같습니다. 마법의 웹사이트, 당신을 돌려줄 수 있는 외부 IP는 무엇입니까

url = 'http://1212.ip138.com/ic.asp'
r = requests.get(url = url,proxies = proxy,timeout = 6)

여기서 너무 오래 기다리는 프록시를 제거하기 위해 시간 초과를 추가해야 합니다. 저는 6초로 설정했습니다

IP로 시도해 보겠습니다. 반환된 내용 분석

페이지에서 반환된 내용은 다음과 같습니다.

<html>

<head>

<meta xxxxxxxxxxxxxxxxxx>

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

</head>

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

그런 다음 웹페이지에서 [] 내용만 추출하면 됩니다.

프록시를 사용할 수 있는 경우 프록시의 IP

반환됩니다(여기에 표시됩니다. 반환된 주소는 여전히 우리 컴퓨터의 외부 IP입니다. 비록 확실하지는 않지만 이 상황은 배제했습니다. 프록시를 사용할 수 없는 것 같습니다)


그러면 우리는 반환된 IP와 프록시 사전의 IP가 동일하면 이 IP가 사용 가능한 프록시로 간주되어 파일에 기록됩니다. 위의 코드는 다음과 같습니다.

#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()

이 방법으로 웹사이트에서 제공하는 사용 가능한 모든 프록시 IP를 ip_proxy.txt

파일에 쓸 수 있습니다.

위 내용은 Python 스캔 프록시 및 사용 가능한 프록시 IP 예제 공유를 얻는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.