初步构造代理池1.0版本

这是第一次亲手尝试写代理池,之前在网站找了很多教程都没有看懂,于是按照自己的思路写一个简易版,目前这个是雏形,后面要加进多线程来检验IP以及通过更多的代理网站来爬取有效IP,该脚本主要思路是启动程序时,会自动测试数据库里面的ip,如果有效ip少于一定数目,会进行重新爬取有效ip,然后入库,如果数量足够,则不进行爬取
这次用到的代理网站是http://www.xicidaili.com/nn/

SLC`4UQNW0U0OVA~71CRVLC.png

这是封装的数据库操作,后面还要添加很多进去

from pymongo import MongoClient,errors
from _datetime import datetime,timedelta



class mogo_queue():
    def __init__(self,db,collection):
        self.client = MongoClient()
        self.database =self.client[db]#链接数据库
        self.db = self.database[collection]#链接数据库里面这个表

    def push_ip(self,ip,port,proxy):#把代理插进数据库的操作
        try:
            self.db.insert({'_id':ip,'port':port,'proxy':proxy})
            print(proxy,'代理插入成功')
        except errors.DuplicateKeyError as e:#对于重复的ip不能插入
            print(proxy,'已经存在队列中')
    def find_proxy(self):
        proxy_list=[]#用来接收从数据库查找到的所有代理
        for i in self.db.find():
            proxy = i['proxy']
            proxy_list.append(proxy)
        return proxy_list
    def delete_proxy(self,proxy):
        self.db.remove({'proxy':proxy})
        print(proxy,'无效代理删除成功')

这是主程序

import requests
from pymongo import MongoClient
from bs4 import BeautifulSoup
from  mogodb_queue import mogo_queue
#ip_queue = mogo_queue('ip_database','proxy_collectipon')
class ip_catch(object):
    ip_queue = mogo_queue('ip_database','proxy_collection')


    def __init__(self,page=3):
        self.page = 4
        self.effective_ip_list=[]
        self.url = 'http://ip.chinaz.com/getip.aspx'这是检验代理是否生效的网站,
        简单来说就是用爬取到的ip访问这个网站,根据返回的数据判断

    def proxy_catch(self ):
        proxy_list=[]#接收爬到的代理
        ip_url=['http://www.xicidaili.com/nn/{}'.format(str(i)) for i in range(self.page)]
        header={
            'User-Agent':"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24
 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
        }
        for url in ip_url:
            data = requests.get(url,headers=header)
            all_data=BeautifulSoup(data.text,'lxml')
            all_ip = all_data.find_all('tr',class_= 'odd')
            for i in all_ip:
                ip= i.find_all('td')[1].get_text()#ip
                port = i.find_all('td')[2].get_text()#端口
                proxy= (ip+':'+port).strip()#组成成proxy代理
                proxy_list.append(proxy)
        return proxy_list

    def catch_effictive_ip(self):
        proxy_list=self.proxy_catch()

        #ip_queue = mogo_queue('ip_database','proxy_collection')#链接数据库,把有用的代理插进去

        for proxy in proxy_list:
            try:
                html = requests.get(self.url,proxies=proxy,timeout=1)#检验代理是否能正常使用
                self.effective_ip_list.append(proxy)
                print('网页返回状态码:',html,  proxy,'代理有效')
                ip= proxy.split(':')[0]#这是ip
                port= proxy.split(':')[1]#这是端口
                self.ip_queue.push_ip(ip,port,proxy)#将爬取到的代理插进数据库
                #print(ip,port,proxy)
            except:
                print(proxy,'代理无效')
    def test_proxy(self):

        proxy_list=self.ip_queue.find_proxy()
        for proxy in proxy_list:
            try:
                html = requests.get(self.url, proxies=proxy, timeout=1)  # 检验代理是否能正常使用
                self.effective_ip_list.append(proxy)
                print('网页返回状态码:', html, proxy, '代理依然有效')



            except:
                self.ip_queue.delete_proxy(proxy)
                #print(proxy, '该代理已经无效,删除处理')

    def main_method(self):
        self.test_proxy()#启用该主函数时,启动检验代理有效性,将无效的删除
        #proxy_list = self.ip_queue.find_proxy()
        print(proxy_list)#打印有效代理数量
        while True:#循环到抓到所需要的数量为止,目前脚本还没完善,每次只抓取前面4页,
        但是对于100个有效ip来说,肯定够用了,后续2.0再完善这个问题
        proxy_list = self.ip_queue.find_proxy()
            if len(proxy_list)>100:#设定当有用代理超过100时,无需爬取了,个人而言够用了
                print('有用代理超过100,无需再爬取')
                break
            else :
                print('有用代理少于100,需要重新爬取有用代理')
                self.catch_effictive_ip()#m每次爬取的是默认前面4页
ip_list=ip_catch()

ip_list.main_method()#调用主函数,启动程序

这是运行结果

Paste_Image.png

这是mogodb数据库里面的数据

Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容