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