《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"】標籤。

逐一查找我們所需要的數據。展開【div class="mov_point"】標籤,發現電劇名就在【div class="mov_point"】標籤下的【a】標籤下,如下圖所示。

以相同的方法發現,我們需要的其他數據都在【div class="mov_point"】標籤下的【p】標籤下,此時我們的程序中需要用到判斷語句【if】找到我們需要的數據。

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()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章