《Python爬虫精进》第11关项目

题目要求

项目目标:使用多协程和队列,爬取时光网电视剧TOP100的数据(剧名、导演、主演和简介),并用csv模块将数据存储下来。时光网TOP100链接:http://www.mtime.com/top/tv/top100/

做题步骤

1、首先,打开链接,将第1-10页的链接放进队列。

2、创建crawler()爬虫函数

用get_nowait()函数可以把队列里的网址都取出。从浏览器的F12开发者工具中Network下找到请求网址的headers信息,通过requests.get()方法对目标网站发起请求。

从浏览器的F12开发工具Elements下找到我们需要的数据:剧名、导演、主演和简介。(通过左上角的箭头可快速找到我们需要的数据)通过查找,发现我们需要的数据都在【div class="mov_point"】标签下(如下图所示)。因此通过find_all函数查找所有【div class="mov_point"】标签。

《Python爬虫精进》第11关项目_第1张图片

逐一查找我们所需要的数据。展开【div class="mov_point"】标签,发现电剧名就在【div class="mov_point"】标签下的【a】标签下,如下图所示。

《Python爬虫精进》第11关项目_第2张图片

以相同的方法发现,我们需要的其他数据都在【div class="mov_point"】标签下的【p】标签下,此时我们的程序中需要用到判断语句【if】找到我们需要的数据。

《Python爬虫精进》第11关项目_第3张图片

3、创建多个爬虫

由于我们要爬取的数据较多,所以建议使用多个爬虫异步进行数据爬取。

4、创建csv文件并将爬取的数据写入csv文件中


具体程序如下:

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

work = Queue()
# 创建队列,把任务存储井队列里
url_1 = 'http://www.mtime.com/top/tv/top100/'
work.put_nowait(url_1)    # 把网址放进队列里。

for i in range(2,11):
    urls = 'http://www.mtime.com/top/tv/top100/index-{}.html'.format(i)
    work.put_nowait(urls)

# 定义爬取函数,从队列里提取出刚刚存储进去的网址,并获取需要的数据
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()        # 把队列里的网址都取出。
        res = requests.get(url,headers=headers)
        bs = BeautifulSoup(res.text,'html.parser')
        items = bs.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[:3]=='导演:':
                    director=data.text[3:].strip()
                elif data.text[:3]=='主演:':
                    actors = data.text[3:].strip()
                else:
                    remarks = data.text.strip()
                    writer.writerow([name,director,actors,remarks])

task_list = []

for x in range(4):  # 创建4个爬虫
    task = gevent.spawn(crawler)    # 创建执行crawler()函数的任务。
    task_list.append(task)

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

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

 

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