Python—爬虫实操项目之gevent库,queue模块多协程爬虫(批量爬取多个网站)

Python—爬虫实操项目之gevent库,queue模块多协程爬虫(批量爬取多个网站)

      • 什么叫同步异步
      • 多协程的概念
      • gevent库和queue模块
      • 基于gevent库和queue模块的实操练习

什么叫同步异步

同步:结束一个任务之后才能执行下一个任务(有先后顺序之分)
异步:只要你分配,可以同时执行多个任务(无顺序之分)

多协程的概念

所谓多协程,就是非抢占式的异步技术,也就是在执行多个任务遇到等待时,可以先执行其他任务,最后再返回来执行在等待的任务。

gevent库和queue模块

gevent库:可在Python中实现多协程,下面是需要使用到的程序代码:

from gevent import monkey          #从gevent库里导入monkey模块。
monkey.patch_all()                 #monkey.patch_all()能把程序变成协作式运行,就是可以帮助程序实现异步。
import gevent                     #导入gevent
gevent.spawn()                    #创建任务,括号中填入需要被执行的函数
gevent.joinall()                  #执行任务列表里的所有任务,就是让爬虫开始爬取网站。

只用gevent库的弊端:
用gevent.spawn()创建的任务,如果有一个任务在执行的过程中,它要爬取的一个网站一直在等待响应,
哪怕其他任务都完成了多个网站的爬取,它也还是不能完成多个网站的爬取。

queue模块:基于gevent库的弊端,需要引入gevent库的queue模块,可以支持我们实现创建大量任务的爬虫程序,下面是需要新增到的程序代码。

from gevent.queue import Queue           #从gevent库里导入queue模块
work = Queue()                           #创建队列对象,并赋值给work。
work.put_nowait(url)                     #用put_nowait()函数可以把网址都放进队列里。

基于gevent库和queue模块的实操练习

上代码实际操作一遍,大家一起来敲代码吧~~~

#正解答案
from gevent import monkey                   #从gevent库里导入monkey模块。
monkey.patch_all()                          ##monkey.patch_all()能把程序变成协作式运行,就是可以帮助程序实现异步。
import gevent,requests,bs4,csv             #导入gevent、time、requests,bs
from gevent.queue import Queue            #从gevent库里导入queue模块

work = Queue()                ##创建队列对象,并赋值给work
url_1 = 'http://www.mtime.com/top/tv/top100/'
work.put_nowait(url_1)        #将网址放进队列里

url_2 = 'http://www.mtime.com/top/tv/top100/index-{page}.html'
for x in range(1,11):        #因每个小窗口的网址有细微差异,所以我们用循环实现每个网址的差异化
    real_url = url_2.format(page=x)
    work.put_nowait(real_url)              #同样将网址放进队列里

#创建爬取数据的函数
def crawler():
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}      #设置请求头
    while not work.empty():          #当队列不是空的时候,就执行下面的程序。
        url = work.get_nowait()      #用get_nowait()函数可以把队列里的网址都取出。
        res = requests.get(url,headers=headers)         #用requests库的get请求网址
        bs_res = bs4.BeautifulSoup(res.text,'html.parser')     #把网页解析为BeautifulSoup对象
        datas = bs_res.find_all('div',class_="mov_con")      #从此开始都是查找数据的部分
        for data in datas:
            TV_title = data.find('a').text
            data = data.find_all('p')
            TV_data =''
            for i in data:
                TV_data =TV_data + ''+ i.text
            writer.writerow([TV_title,TV_data])        #将数据写入表格
            print([TV_title,TV_data])

csv_file = open('timetop.csv','w',newline='',encoding='utf-8')        #创建CSV文件
writer = csv.writer(csv_file)       #写入数据

task_list = []        #创建空列表
for x in range(3):       
    task = gevent.spawn(crawler)        #创建多协程爬虫任务
    task_list.append(task)       #逐次将多协程爬虫的任务增加到空列表中
gevent.joinall(task_list)        #执行任务列表里的所有任务,就是让爬虫开始爬取网站。

你可能感兴趣的:(Python—爬虫)