协程大批量爬取是要被封IP的,最优秀的方法就是在被封IP时候立马切换IP

一. 多协程爬虫遇到的难点

    之前本着一封IP就切换IP的原则做了个协程爬虫。但是操作并发运行的爬虫和单线程的爬虫的难度真的是云泥之别。因为是并发运行的爬虫,用的IP是同一个,被封的时候当然是全部IP一起封了。

    而执行操作的时候,又会每个协程换一次,这就会导致IP的浪费和爬虫运行的缓慢。

二. 解决方案

    并发问题,自然要用到协程间通讯,Event。具体思想就是,当一个协程被封IP了,在切换IP的方法中,只让一条协程运行,其他全部休眠,待到IP切换成功再唤醒其余的协程。


为了方便调试,做了个socket服务端和客户端来模拟。

服务端:

#-*- coding:utf-8 -*-
from gevent import monkey; monkey.patch_all()

import socket
import json
import gevent
import threading

s = socket.socket()
host = '127.0.0.1'
port = 9991
s.bind((host, port))
ban_ip = []
ips = []

def processSocket(c):
	msg = c.recv(1024)
	json_msg = json.loads(msg.decode('utf-8').replace('\'', '"'))

	if json_msg['url'] == 'break':
		print('接收到消息, 退出')
		c.send('已成功退出,谢谢!!'.encode('utf-8'))
		c.close()
		s.close()
	else:
		if json_msg['ip'] in ban_ip:
			print(json_msg['ip'])
			print('恶意IP,查封!!')
			c.send('304'.encode('utf-8'))
			c
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值