国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python掃描proxy并獲取可用代理ip的實例

2020-01-04 17:07:47
字體:
供稿:網(wǎng)友

今天咱寫一個挺實用的工具,就是掃描并獲取可用的proxy

首先呢,我先百度找了一個網(wǎng)站:http://www.xicidaili.com 作為例子

這個網(wǎng)站里公布了許多的國內(nèi)外可用的代理的ip和端口

我們還是按照老樣子進(jìn)行分析,就先把所有國內(nèi)的proxy掃一遍吧

點開國內(nèi)部分進(jìn)行審查發(fā)現(xiàn),國內(nèi)proxy和目錄為以下url:

http://www.xicidaili.com/nn/x

這個x差不多兩千多頁,那么看來又要線程處理了。。。

老樣子,我們嘗試是否能直接以最簡單的requests.get()獲取內(nèi)容

返回503,那么我們加一個簡單的headers

返回200,成咯

好了我們先進(jìn)行網(wǎng)頁內(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三個<td>標(biāo)簽內(nèi)

于是我們開始嘗試編寫,一下為編寫思路:

  處理頁面的時候,是先提取tr標(biāo)簽,再將tr標(biāo)簽中的td標(biāo)簽提取

  所以運用了兩次bs操作,并且第二次使用bs操作時需要進(jìn)行str處理

  因為我們獲得tr之后,我們需要其中的2,3,6號的東西,

  但是當(dāng)我們用一個for循環(huán)輸出的i并不能進(jìn)行組的操作

  所以我們干脆分別對每一個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)都能生成對應(yīng)的proxy字典,以便我們接下來驗證ip可用性所使用

字典這兒有個注意點,我們有一個將types變?yōu)樾懙牟僮鳎驗樵趃et方法中的proxies中寫入的協(xié)議名稱應(yīng)為小寫,而網(wǎng)頁抓取的是大寫的內(nèi)容,所以進(jìn)行了一個大小寫轉(zhuǎn)換

那么驗證ip可用性的思路呢

很簡單,我們使用get,加上我們的代理,請求網(wǎng)站:

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

這是一個神奇的網(wǎng)站,能返回你的外網(wǎng)ip是什么

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

這里我們需要加上timeout去除掉那些等待時間過長的代理,我設(shè)置為6秒

我們以一個ip進(jìn)行嘗試,并且分析返回的頁面

返回的內(nèi)容如下:

<html><head><meta xxxxxxxxxxxxxxxxxx><title> 您的IP地址 </title></head><body style="margin:0px"><center>您的IP是:[xxx.xxx.xxx.xxx] 來自:xxxxxxxx</center></body></html>

那么我們只需要提取出網(wǎng)頁內(nèi)[]的內(nèi)容即可

如果我們的代理可用,就會返回代理的ip

(這里會出現(xiàn)返回的地址還是我們本機(jī)的外網(wǎng)ip的情況,雖然我也不是很清楚,但是我把這種情況排除,應(yīng)該還是代理不可用)

那么我們就能進(jìn)行一個判斷,如果返回的ip和proxy字典中的ip相同,則認(rèn)為這個ip是可用的代理,并將其寫入文件

我們的思路就是這樣,最后進(jìn)行queue和threading線程的處理即可

上代碼:

#coding=utf-8import requestsimport refrom bs4 import BeautifulSoup as bsimport Queueimport 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   passdef 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全部寫入文件ip_proxy.txt文件中了

以上這篇python掃描proxy并獲取可用代理ip的實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網(wǎng)。

 
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 松江区| 五家渠市| 泰安市| 清水县| 黄山市| 高州市| 九龙城区| 囊谦县| 句容市| 铜山县| 甘德县| 泸溪县| 宝山区| 广东省| 霍城县| 大关县| 涿州市| 宜宾县| 伊宁市| 丁青县| 榆中县| 循化| 垣曲县| 土默特右旗| 措美县| 龙山县| 崇礼县| 绵阳市| 安达市| 巴马| 应城市| 高邑县| 贵州省| 日照市| 巴南区| 陇川县| 靖边县| 台南县| 阜康市| 东源县| 新蔡县|