建立自己的小型代理池

版权声明:董瑞 https://blog.csdn.net/qq_39226755/article/details/85255546

建立自己的小型代理池

拥有一个代理池会很大程度上的帮助我们进行工作,经过一番研究,自己写了一个代理池的小程序,删去了很多的功能,留下了最主要得。
下边为自己的逻辑。
在这里插入图片描述

因为储存和获取模块相对简单,所以合成为一个模块。

粘贴出整个模块代码。
获取的代理的网站有很多,这里只写了一个,对于我自己来说是够用了。

import requests
from lxml import etree
import time
import pymongo

class CAT_IP():
    def __init__(self):
        self.client = pymongo.MongoClient(host='localhost',port=27017)
        self.db = self.client['proxy']
        self.session = requests.Session()
        self.url = 'http://qhd.esf.fang.com/chushou/3_237041602.htm'
        self.headers={
            'Cookie':'_free_proxy_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFVEkiJWYwNzA1YmIzM2QzNTU0NGNjNmMyNWI3NDk1M2FlNmE5BjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMTQ5K3ZlRkx2dGs3ZmZMZTBjd1VLRTRHaUFCVDdKQTkxOTFIU3BYekYrdmc9BjsARg%3D%3D--8a2932ebb9c868977ffbc071eab471ef4144a1c6; Hm_lvt_0cf76c77469e965d2957f0553e6ecf59=1545528007,1545529206,1545554081; Hm_lpvt_0cf76c77469e965d2957f0553e6ecf59=1545554192',
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
            'Host':'www.xicidaili.com'
        }
        self.session.get(url=self.url, headers=self.headers)

    #获取代理
    def the_xici(self):
        baseurl = 'https://www.xicidaili.com/nn/{}'
        for i in range(3):
            time.sleep(1)
            the_url = baseurl.format(i+1)
            re = requests.get(url=the_url,headers=self.headers)
            re = re.content.decode('utf-8')
            html = etree.HTML(text=re)
            targets = html.xpath('//table[@id="ip_list"]//tr')
            del targets[0]
            for target in targets:
                target_ip = ''.join(target.xpath('./td[2]/text()'))
                target_port = ''.join(target.xpath('./td[3]/text()'))
                result = '{}:{}'.format(target_ip,target_port)
                print('获取代理{}'.format(result))
                yield {
                    'dl':result
                }

    def save_all_to_waitingArea(self,lists):
        collection = self.db['wait_area']
        collection.remove({})
        collection.insert_many(lists)
        print('储存所有代理成功')

if __name__=='__main__':
    lists = CAT_IP().the_xici()
    CAT_IP().save_all_to_waitingArea(lists)

一共有两个方法,一个是爬取免费代理的方法,另一个是将代理全部存入数据库的[‘wait_area’]表单。
在__init__方法里进行了一些参数的初始化

第二个模块是检测模块

代码如下

import pymongo
import requests
import threading

class CHECK_PROXY():
    def __init__(self):
        self.client = pymongo.MongoClient(host='localhost',port=27017)
        self.db = self.client['proxy']
        self.session = requests.Session()
        self.target_url = 'https://mp.csdn.net/mdeditor#'

    def save_one_to_useArea(self,proxy):
        conllection = self.db['use_area']
        is_live = conllection.find_one({'dl':proxy['dl']})
        if is_live == None:
            conllection.insert(proxy)
        else:
            print('已经存在{}'.format(proxy))

    def get_one_proxy(self):
        conllection = self.db['wait_area']
        proxy = conllection.find_one()
        conllection.remove(proxy)
        return proxy

    #测试代理
    def test_IP(self,IP):
        proxies = {
            "http":"http://{}".format(IP),
            "https":"http://{}".format(IP)
        }
        try:
            with self.session.get(url=self.target_url,proxies=proxies) as response:
                if response.status_code == 200:
                    print('代理{}测试成功'.format(IP))
                    return True
        except:
            print('代理{}测试失败'.format(IP))
            return False

    def check_count(self):
        conllection = self.db['wait_area']
        return conllection.count()


    def check_proxy(self):
        proxy = CHECK_PROXY().get_One_proxy()
        response = CHECK_PROXY().test_IP(proxy['dl'])
        if response == True:
            CHECK_PROXY().save_one_to_useArea(proxy=proxy)
            if CHECK_PROXY().check_count()>0:
                CHECK_PROXY().check_proxy()
        else:
            if CHECK_PROXY().check_count()>0:
                CHECK_PROXY().check_proxy()


if __name__ == "__main__":
    for t in range(7):
        thread = threading.Thread(target=CHECK_PROXY().check_proxy,args=())
        thread.start()

同样,在__init__区域进行了一些参数的初始化,save_one_to_useArea(self,proxy):为将一个代理放入数据库中的[‘use_area’]表单,用于测试成功的代理
get_one_proxy(self):用来从[‘wait_area’]表单获取一个代理IP,准备用于测试。
test_IP(self,IP):对代理进行测试,可以在__init__方法中写入自己希望测试的网站。
check_count(self):用于查询[‘wait_area’]表单中代理的数量,每次提取ip前都要查询一次。
check_proxy(self):将前几个方法集合成一个方法,只要运行这个方法,就会不断地检测代理,直到所有代理检测完毕
最后运行的时候运用了多线程,因为测试代理有时需要等好久,所以用多线程很方便。

猜你喜欢

转载自blog.csdn.net/qq_39226755/article/details/85255546
今日推荐