scrapy_随机ip代理池

什么是ip代理?

       我们电脑访问网站,其实是访问远程的服务器,通过ip地址识别是那个机器访问了服务器,服务器就知道数据该返回给哪台机器,我们生活中所用的网络是局域网,ip是运营商随机分配的,是一种直接访问服务器的方式

       代理服务器是一种间接方式,本地机器访问ip代理服务器,ip代理服务器帮我们发起服务请求,然后代理服务器接收数据返回给本机,由于中间有了层ip代理服务器,访问的速度和稳定性取决于代理服务器的性能

       常规访问

    用户 >> ip  >> 服务器

       代理访问

    用户用户 >> ip  >> 代理ip服务器 >> 服务器

       最稳定的ip是自己的本地ip,免费ip很多人用,建议使用收费

有哪些好用的ip代理?

       西刺免费代理:

    建议选择高匿ip地址,访问服务器时候不带本地ip

如何设置ip代理池?

  1. 建立一张数据表存放ip地址,端口,请求协议

  2. 在公共方法中定义一个获取ip信息的爬虫

 

  1 2 步已经完成:http://www.cnblogs.com/2bjiujiu/p/7355234.html

 

  3. 从数据库中随机获取一行数据: select ip, port from 表名 order by rand() limit 1

  4. 检查ip是否可有,可用,返回ip和端口,不可用删除ip和再次随机新的ip再次检查是否可用

#!/usr/bin/python3

__author__ = 'beimenchuixue'
__blog__ = 'http://www.cnblogs.com/2bjiujiu/'

import pymysql
import requests


class RandomIp(object):
    headers = {
        'Referer': 'https://www.baidu.com',
    }
    
    def __init__(self):
        # 初始化连接配置和连接参数
        db_settings = {
            'host': 'localhost',
            'db': 'db_name',
            'user': 'user_name',
            'password': 'password',
            'charset': 'utf8',
            'use_unicode': True
        }
        
        # self.db_setting = crawler.settings.get('db_setting')
        self.conn = pymysql.connect(**db_settings)
        self.cursor = self.conn.cursor()
    
    # # 获取配置文件中db_settings
    # @classmethod
    # def from_crawler(cls, crawler):
    #     return cls(crawler)
    
    def get_random_ip(self):
        """获取有效的ip地址"""
        # 建立索引映射
        ip, port, ip_type = 0, 1, 2
        # sql查询语句,随机获取一行值
        sql = 'select ip, port, ip_type from ip_server order by rand() limit 1'
        try:
            # 从数据库中获取一行值
            self.cursor.execute(sql)
            # 对于查询结果不能直接获取,需要通过fetchall,索引来取每个值
            for info in self.cursor.fetchall():
                ip = info[ip]
                port = info[port]
                ip_type = info[ip_type]
        except Exception as e:
            print(e)
        else:
            effective_ip = self.check_ip(ip, port, ip_type)
            if effective_ip:
                return effective_ip
            else:
                self.del_usedless_ip(ip)
                return self.get_random_ip()
    
    def check_ip(self, ip, port, ip_type):
        """检查这个ip是否有效"""
        http_url = 'https://www.baidu.com'
        proxy_url = '{ip_type}://{ip}:{port}'.format(ip_type=ip_type.lower(), ip=ip, port=port)
        try:
            prox_dict = {
                'http': proxy_url
            }
            response = requests.get(http_url, proxies=prox_dict, headers=self.headers)
        except Exception as e:
            print(e)
            return False
        else:
            if 200 <= response.status_code <= 300:
                return proxy_url
            else:
                self.del_usedless_ip(ip)
                return False
        pass
    
    def del_usedless_ip(self, ip):
        """删除无效的ip"""
        sql = 'delete from ip_server where ip=%s' % ip
        self.cursor.execute(sql)
        self.conn.commit()
    
if __name__ == '__main__':
    # 测试
    ip = RandomIp()
    effective_ip = ip.get_random_ip()
    print(effective_ip)
    pass

  5. 在middlewares中添加以类

from tools.random_ip import RandomIp
# 导入获取随机ip的类,就是上面写的类

class RandomIpMiddleware(object):
    
    def process_request(self, request, spider):
        # 更改代理ip,但是很不稳定
        get_ip = RandomIp()
        request.meta['proxy'] = get_ip.get_random_ip()

  6. setting中注册

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'infoisland.middlewares.RandomUserAgentMiddleware': 400,
    'infoisland.middlewares.RandomIpMiddleware': 600,

}

 

如何使用第三方库?

       scrapy-proxies       文件方式读取,可自行修改       -- githup搜索

       scrapy-crawlera                -- 收费

       tor                                 -- 洋葱浏览器,多次转发,经过洋葱,实现ip匿名,安全稳定,需要vpn

posted @ 2017-08-15 21:58  梦_鱼  阅读(657)  评论(0编辑  收藏  举报