다음 편집기는 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 = '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) try: proxy_check(proxy,ip) except Exception,e: print e pass def proxy_check(proxy,ip): url = 'http://1212.ip138.com/ic.asp' r = requests.get(url = url,proxies = proxy,timeout = 6) f = open('E:/url/ip_proxy.txt','a+') soup = bs(r.text,'html.parser') data = soup.find_all(name = 'center') for i in data: a = re.findall(r'\[(.*?)\]',i.string) if a[0] == ip: #print proxy f.write('%s'%proxy+'\n') print 'write down' f.close() #proxy_spider() def main(): queue = Queue.Queue() for i in range(1,2288): queue.put('http://www.xicidaili.com/nn/'+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's down,sir!" if __name__ == '__main__': main()
이 방법으로 웹사이트에서 제공하는 사용 가능한 모든 프록시 IP를 ip_proxy.txt
파일에 쓸 수 있습니다.위 내용은 Python 스캔 프록시 및 사용 가능한 프록시 IP 예제 공유를 얻는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!