題目要求
項目目標:使用多協程和隊列,爬取時光網電視劇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()