美文网首页Python3自学 爬虫实战
初步构造代理池1.0版本

初步构造代理池1.0版本

作者: 蜗牛仔 | 来源:发表于2017-01-15 01:53 被阅读175次

这是第一次亲手尝试写代理池,之前在网站找了很多教程都没有看懂,于是按照自己的思路写一个简易版,目前这个是雏形,后面要加进多线程来检验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

相关文章

  • 初步构造代理池1.0版本

    这是第一次亲手尝试写代理池,之前在网站找了很多教程都没有看懂,于是按照自己的思路写一个简易版,目前这个是雏形,后面...

  • Swift-9.构造方法初印象

    本章包含内容: 构造方法初步 常量属性和构造方法 可选属性与构造方法 结构体的构造方法 值类型的构造器代理 闭包或...

  • 支持多线程的代理IP池

    python源码 使用示例: pool = Proxy() 构造代理池类 pool = Proxy(min_poo...

  • IP代理池2.0版本,加入多进程以及多线程

    这次对之前的代理池1.0版本进行了升级,可用性大大增加了,也增加了一些IP源头的获取,包括西刺高匿代理前50页的I...

  • 构建IP代理池爬取妹子图片

    同一个目录下创建三个文件 这个是download构建的ip代理池 最后这个是利用西刺代理的IP构造的IP池 还有我...

  • python 构建代理池1.0版

    代理池 三天小长假, 朋友圈都被刷屏了,各种的照片,景色。真是不孬。 长的帅的约会去了,有钱的旅游去了,长的丑还没...

  • 实现增强版的代理IP池

    背景 之前实现了一个版本的代理IP池:爬虫代理IP池的实现。整个过程和设计思路都是我自己想出来的,实际用下来效果还...

  • 领导者后台管理系统

    最新版本:1.0 历史版本:1.0

  • 匿名后台

    版本【1.0】版本

  • 匿名

    版本【1.0】版本

网友评论

    本文标题:初步构造代理池1.0版本

    本文链接:https://www.haomeiwen.com/subject/tikybttx.html