python爬虫第11关项目煲剧狂人

练习介绍
要求:
请使用多协程和队列,爬取时光网电视剧TOP100的数据(剧名、导演、主演和简介),并用csv模块将数据存储下来。

时光网TOP100链接:http://www.mtime.com/top/tv/top100/

目的:
1.练习掌握gevent的用法
2.练习掌握queue的用法

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

work=Queue()#创建队列对象,并赋值给work

url_1='http://www.mtime.com/top/tv/top100/'
work.put_nowait(url_1)#用put_nowait()函数把url_1也就是第一页的网址放进队列里

for i in range(2,11):
    url_2='http://www.mtime.com/top/tv/top100/index-{}.html'.format(i)#2-10页的网址循环遍历
    work.put_nowait(url_2)#用put_nowait()函数把2-10页的网址都放进队列里。

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()函数抓取网址。
        html=res.text
        soup=BeautifulSoup(html,'html.parser')
        items=soup.find_all('div',class_='mov_con')
        for item in items:
            name=item.find('a').text
            datas=item.find_all('p')
            for data in datas:
                if data.text[:2]=='导演':
                    director=data.text[3:].strip()
                elif data.text[:2]=='主演':
                    actor=data.text[3:].strip()
                else:
                    remarks = data.text.strip()
            writer.writerow([name,director,actor,remarks])


csv_file=open('TVtop100.csv','w',newline='',encoding='utf-8-sig')
writer=csv.writer(csv_file)
writer.writerow(['电视剧名','导演','主演','简介'])

tasks_list=[]#创建空的任务列表

for x in range(3):#相当于创建了3个爬虫
    task=gevent.spawn(crawler)#用gevent.spawn()函数创建执行crawler()函数的任务
    tasks_list.append(task)

gevent.joinall(tasks_list)#用gevent.joinall方法,执行任务列表里的所有任务,就是让爬虫开始爬取网站。

csv_file.close()


python爬虫第11关项目煲剧狂人_第1张图片

你可能感兴趣的:(python基础及爬虫)