class UserAgentMiddleware:
def process_request(self,request,spider):
request.headers.setdefault(b'User-Agent',choice(USER_AGENT))
class ChangeProxy:
def __init__(self):
'''
初始化变量
get_url 是请求的api
temp_url 是验证的地址
ip_list 是ip
'''
self.get_url = 'http://api.xdaili.cn/xdaili-api//greatRecharge/getGreatIp?spiderId=c7b4dc1d89bc461da66f043d2ea170fa&orderno=YZ20217168971sSXnSs&returnType=2&count=10'
self.temp_url = 'http://httpbin.org/get'
self.ip_list = []
# 默认的是用来记录使用ip的个数,或者目前正在使用的是第几个ip,本程序,一次性获得了10个ip,所以count最大默认为10
self.count = 0
# 用来记录每个ip的使用次数,此程序,设置为最大使用3次换下一个ip
self.evecount = 0
def getIPDate(self):
'''
这部分是获得ip,并放入ip池(先清空原有的ip池0)
:return:
'''
temp_data = requests.get(url=self.get_url).text
self.ip_list.clear()
for eve_ip in json.loads(temp_data)['RESULT']:
print(eve_ip)
self.ip_list.append({
'ip': eve_ip['ip'],
'port': eve_ip['port']
})
def changeProxy(self, request):
'''
修改代理ip
:param request:对象
:return:
'''
request.meta['proxy'] = 'http://' + str(self.ip_list[self.count-1]['ip']) + ':' + str(self.ip_list[self.count-1]['port'])
def yanzheng(self):
'''
验证代理ip是否可以,默认超时5S
:return:
'''
pass
requests.get(url=self.temp_url,
proxies={'http':str(self.ip_list[self.count-1]['ip']) + ':' + str(self.ip_list[self.count-1]['port'])},
timeout=5)
def ifUsed(self, request):
'''
切换代理ip的跳板
:param request: 对象
:return:
'''
try:
self.changeProxy(request)
self.yanzheng()
except:
if self.count == 0 or self.count == 10:
self.getIPDate()
self.count = 1
self.count = self.count + 1
self.ifUsed(request)
def process_request(self, request, spider):
if self.count == 0 or self.count == 10:
self.getIPDate()
self.count = 1
if self.evecount == 3:
self.count = self.count + 1
self.evecount = 0
else:
self.evecount = self.evecount + 1
self.ifUsed(request)
我在scrapy加入了代理ip池,爬取网站的时候为什么会出现301跳转?还有让ip池与splash结合啊,我现在直接报错503,这两个问题我弄了好几天,一直没搞懂
不知道你这个问题是否已经解决, 如果还没有解决的话: