一. 多协程爬虫遇到的难点
之前本着一封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

1567

被折叠的 条评论
为什么被折叠?



