scrapy_随机ip代理池

Posted 北门吹雪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于scrapy_随机ip代理池的主要内容,如果未能解决你的问题,请参考以下文章

scrapy实现ip代理池

在scrapy中设置IP代理池(手动代理池)

scrapy按顺序启动多个爬虫代码片段(python3)

写一个scrapy中间件--ip代理池

Scrapy框架设置UA池与代理池 -- 2019-08-08 17:20:36

Scrapy框架设置UA池与代理池 -- 2019-08-08 18:00:10