问题发现:
前段时间项目中,为了防止被封号(提供的可用账号太少),对于能不登录就可以抓取的内容采用不带cookie的策略,只有必要的内容才带上cookie去访问。
本来想着很简单:在每个抛出来的Request的meta中带上一个标志位,通过在CookieMiddleware中查看这个标志位,决定是否是给这个Request是否装上Cookie。
实现的代码大致如下:
class CookieMiddleware(object):
"""
每次请求都随机从账号池中选择一个账号去访问
"""
def __init__(self):
client = pymongo.MongoClient(MONGO_URI)
self.account_collection = client[MONGO_DATABASE][ACCOUNT_COLLECTION]
def process_request(self, request, spider):
if 'target' in request.meta:
logging.debug('进入到process_request了')
flag = request.meta['target']
if flag != 'no':
all_count = self.account_collection.find({'status': 'success'}).count()
if all_count == 0:
raise Exception('当前账号池为空')
random_index = random.randint(0, all_count - 1)
random_account = self.account_collection.find({'status': 'success'})[random_index]
request.cookies = json.loads(random_account['cookie'])
else:
logging.debug(