python掃描proxy并獲取可用代理ip的實(shí)例
今天咱寫(xiě)一個(gè)挺實(shí)用的工具,就是掃描并獲取可用的proxy
首先呢,我先百度找了一個(gè)網(wǎng)站:http://www.xicidaili.com 作為例子
這個(gè)網(wǎng)站里公布了許多的國(guó)內(nèi)外可用的代理的ip和端口
我們還是按照老樣子進(jìn)行分析,就先把所有國(guó)內(nèi)的proxy掃一遍吧
點(diǎn)開(kāi)國(guó)內(nèi)部分進(jìn)行審查發(fā)現(xiàn),國(guó)內(nèi)proxy和目錄為以下url:
http://www.xicidaili.com/nn/x
這個(gè)x差不多兩千多頁(yè),那么看來(lái)又要線程處理了。。。
老樣子,我們嘗試是否能直接以最簡(jiǎn)單的requests.get()獲取內(nèi)容
返回503,那么我們加一個(gè)簡(jiǎn)單的headers
返回200,成咯
好了我們先進(jìn)行網(wǎng)頁(yè)內(nèi)容分析并獲取想要的內(nèi)容
我們發(fā)現(xiàn),包含ip信息的內(nèi)容在<tr>標(biāo)簽內(nèi),于是我們就能很方便的用bs進(jìn)行獲取標(biāo)簽內(nèi)容
但是我們隨之又發(fā)現(xiàn),ip、端口、協(xié)議的內(nèi)容分別在提取的<tr>標(biāo)簽的第2,3,6三個(gè)<td>標(biāo)簽內(nèi)
于是我們開(kāi)始嘗試編寫(xiě),一下為編寫(xiě)思路:
處理頁(yè)面的時(shí)候,是先提取tr標(biāo)簽,再將tr標(biāo)簽中的td標(biāo)簽提取
所以運(yùn)用了兩次bs操作,并且第二次使用bs操作時(shí)需要進(jìn)行str處理
因?yàn)槲覀儷@得tr之后,我們需要其中的2,3,6號(hào)的東西,
但是當(dāng)我們用一個(gè)for循環(huán)輸出的i并不能進(jìn)行組的操作
所以我們干脆分別對(duì)每一個(gè)td的soup進(jìn)行第二次操作之后直接提取2,3,6
提取之后,直接加上.string提取內(nèi)容即可
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)
這樣,我們每次循環(huán)都能生成對(duì)應(yīng)的proxy字典,以便我們接下來(lái)驗(yàn)證ip可用性所使用
字典這兒有個(gè)注意點(diǎn),我們有一個(gè)將types變?yōu)樾?xiě)的操作,因?yàn)樵趃et方法中的proxies中寫(xiě)入的協(xié)議名稱應(yīng)為小寫(xiě),而網(wǎng)頁(yè)抓取的是大寫(xiě)的內(nèi)容,所以進(jìn)行了一個(gè)大小寫(xiě)轉(zhuǎn)換
那么驗(yàn)證ip可用性的思路呢
很簡(jiǎn)單,我們使用get,加上我們的代理,請(qǐng)求網(wǎng)站:
http://1212.ip138.com/ic.asp
這是一個(gè)神奇的網(wǎng)站,能返回你的外網(wǎng)ip是什么
url = 'http://1212.ip138.com/ic.asp' r = requests.get(url = url,proxies = proxy,timeout = 6)
這里我們需要加上timeout去除掉那些等待時(shí)間過(guò)長(zhǎng)的代理,我設(shè)置為6秒
我們以一個(gè)ip進(jìn)行嘗試,并且分析返回的頁(yè)面
返回的內(nèi)容如下:
<html> <head> <meta xxxxxxxxxxxxxxxxxx> <title> 您的IP地址 </title> </head> <body style="margin:0px"><center>您的IP是:[xxx.xxx.xxx.xxx] 來(lái)自:xxxxxxxx</center></body></html>
那么我們只需要提取出網(wǎng)頁(yè)內(nèi)[]的內(nèi)容即可
如果我們的代理可用,就會(huì)返回代理的ip
(這里會(huì)出現(xiàn)返回的地址還是我們本機(jī)的外網(wǎng)ip的情況,雖然我也不是很清楚,但是我把這種情況排除,應(yīng)該還是代理不可用)
那么我們就能進(jìn)行一個(gè)判斷,如果返回的ip和proxy字典中的ip相同,則認(rèn)為這個(gè)ip是可用的代理,并將其寫(xiě)入文件
我們的思路就是這樣,最后進(jìn)行queue和threading線程的處理即可
上代碼:
#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()
這樣我們就能把網(wǎng)站上所提供的能用的代理ip全部寫(xiě)入文件ip_proxy.txt文件中了
以上這篇python掃描proxy并獲取可用代理ip的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中的opencv和PIL(pillow)轉(zhuǎn)化操作
這篇文章主要介紹了python中的opencv和PIL(pillow)轉(zhuǎn)化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Python 實(shí)現(xiàn)12306登錄功能實(shí)例代碼
這篇文章主要介紹了Python 實(shí)現(xiàn)12306登錄功能的完整代碼,需要的朋友可以參考下2018-02-02python基礎(chǔ)教程之分支、循環(huán)簡(jiǎn)單用法
這篇文章主要介紹了python基礎(chǔ)教程之分支、循環(huán)簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了Python分支及循環(huán)語(yǔ)句的簡(jiǎn)單使用方法,需要的朋友可以參考下2016-06-06jupyter notebook出現(xiàn)In[*]的問(wèn)題及解決
這篇文章主要介紹了jupyter notebook出現(xiàn)In[*]的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09python os.path.isfile()因參數(shù)問(wèn)題判斷錯(cuò)誤的解決
今天小編就為大家分享一篇python os.path.isfile()因參數(shù)問(wèn)題判斷錯(cuò)誤的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11前女友發(fā)來(lái)加密的"520快樂(lè).pdf",我用python破解開(kāi)之后,卻發(fā)現(xiàn)
520收到前女友發(fā)來(lái)的加密PDF文件,說(shuō)打開(kāi)之后有驚喜,難道是要復(fù)合?我用python破解開(kāi)之后,卻發(fā)現(xiàn)...python干貨+劇情滿滿收藏收藏2021-08-08