今天咱寫一個挺實用的工具,就是掃描并獲取可用的proxy
首先呢,我先百度找了一個網站:http://www.xicidaili.com 作為例子
這個網站里公布了許多的國內外可用的代理的ip和端口
我們還是按照老樣子進行分析,就先把所有國內的proxy掃一遍吧
點開國內部分進行審查發現,國內proxy和目錄為以下url:
http://www.xicidaili.com/nn/x
這個x差不多兩千多頁,那么看來又要線程處理了。。。
老樣子,我們嘗試是否能直接以最簡單的requests.get()獲取內容
返回503,那么我們加一個簡單的headers
返回200,成咯
好了我們先進行網頁內容分析并獲取想要的內容
我們發現,包含ip信息的內容在標簽內,于是我們就能很方便的用bs進行獲取標簽內容
但是我們隨之又發現,ip、端口、協議的內容分別在提取的標簽的第2,3,6三個標簽內
于是我們開始嘗試編寫,一下為編寫思路:
處理頁面的時候,是先提取tr標簽,再將tr標簽中的td標簽提取
所以運用了兩次bs操作,并且第二次使用bs操作時需要進行str處理
因為我們獲得tr之后,我們需要其中的2,3,6號的東西,
但是當我們用一個for循環輸出的i并不能進行組的操作
所以我們干脆分別對每一個td的soup進行第二次操作之后直接提取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)
這樣,我們每次循環都能生成對應的proxy字典,以便我們接下來驗證ip可用性所使用
字典這兒有個注意點,我們有一個將types變為小寫的操作,因為在get方法中的proxies中寫入的協議名稱應為小寫,而網頁抓取的是大寫的內容,所以進行了一個大小寫轉換
那么驗證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)
這里我們需要加上timeout去除掉那些等待時間過長的代理,我設置為6秒
我們以一個ip進行嘗試,并且分析返回的頁面
返回的內容如下:
您的IP地址
您的IP是:[xxx.xxx.xxx.xxx] 來自:xxxxxxxx
那么我們只需要提取出網頁內[]的內容即可
如果我們的代理可用,就會返回代理的ip
(這里會出現返回的地址還是我們本機的外網ip的情況,雖然我也不是很清楚,但是我把這種情況排除,應該還是代理不可用)
那么我們就能進行一個判斷,如果返回的ip和proxy字典中的ip相同,則認為這個ip是可用的代理,并將其寫入文件
我們的思路就是這樣,最后進行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()
這樣我們就能把網站上所提供的能用的代理ip全部寫入文件ip_proxy.txt文件中了
以上這篇python掃描proxy并獲取可用代理ip的實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

