定义
可以进行多个爬虫任务,当一个任务在执行中遇到等待,就先执行另一个任务,提高效率,节省时间。
安装
Pip install gevent
使用
from gevent import monkey
#从gevent库里导入monkey模块
monkey.patch_all()
#monkey.patch_all()能把程序变成协作式运行,就是可以帮助程序实现异步
import gevent
import time
import requests
#导入gevent、time、requests
start = time.time()
#记录程序开始时间
url_list = [
"https://www.kaikeba.com/",
"https://www.youkuaiyun.com/",
"https://www.json.cn/",
"https://cn.bing.com/",
"https://www.jianshu.com/",
"http://www.techweb.com.cn/",
"https://www.bilibili.com/",
"https://www.huxiu.com/"
]
#把8个网站封装成列表
def crawler(url):
#定义一个crawler()函数。
r = requests.get(url)
#用requests.get()函数爬取网站。
print(url,time.time()-start,r.status_code)
#打印网址、请求运行时间、状态码
tasks_list = [ ]
#创建空的任务列表。
for url in url_list:
#遍历url_list
task = gevent.spawn(crawler,url)
#gevent只能处理gevent的任务对象,不能直接调用普通函数,故用gevent.spawn()函数创建任务。gevent.spawn()的参数需为要调用的函数名及该函数的参数
tasks_list.append(task)
#往任务列表添加任务
gevent.joinall(tasks_list)
#执行任务列表里的所有任务,就是让爬虫开始爬取网站。
end = time.time()
#记录程序结束时间。
print(end-start)
#打印程序最终所需时间。
queue模块
当任务量特别多时,建议将queue模块与协程搭配使用。
from gevent import monkey
#从gevent库里导入monkey模块
monkey.patch_all()
#monkey.patch_all()能把程序变成协作式运行,就是可以帮助程序实现异步。
import gevent
import time
import requests
from gevent.queue import Queue
#从gevent库里导入queue模块
start = time.time()
url_list = [
"https://www.kaikeba.com/",
"https://www.youkuaiyun.com/",
"https://www.json.cn/",
"https://cn.bing.com/",
"https://www.jianshu.com/",
"http://www.techweb.com.cn/",
"https://www.bilibili.com/",
"https://www.huxiu.com/"
]
work = Queue()
#创建队列对象,并赋值给work
for url in url_list:
#遍历url_list
work.put_nowait(url)
#用put_nowait()函数可以把网址都放进队列里
def crawler():
while not work.empty():
#当队列不是空的时候,就执行下面的程序
url = work.get_nowait()
#用get_nowait()函数可以把队列里的网址都取出
r = requests.get(url)
#用requests.get()函数抓取网址
print(url,work.qsize(),r.status_code)
#打印网址、队列长度、抓取请求的状态码
tasks_list = [ ]
#创建空的任务列表
for x in range(2):
#相当于创建了2个爬虫
task = gevent.spawn(crawler)
#用gevent.spawn()函数创建执行crawler()函数的任务
tasks_list.append(task)
#往任务列表添加任务。
gevent.joinall(tasks_list)
#用gevent.joinall方法,执行任务列表里的所有任务,就是让爬虫开始爬取网站
end = time.time()
print(end-start)