什么是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