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代理池的主要内容,如果未能解决你的问题,请参考以下文章