Python3,多线程爬取某瓣小电影~ ~
生活随笔
收集整理的這篇文章主要介紹了
Python3,多线程爬取某瓣小电影~ ~
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
python3 爬取豆瓣電影
- 直接爬取豆瓣
- 使用線程池爬取豆瓣
由于今年的疫情原因,我們不能到電影院消費,就無法體驗右手牽女友,左手牽女友閨蜜的樂趣。
但是,即使在家里,也得撒一波…
直接爬取豆瓣
以上說的都不是重點,重點是,我們要看看怎么爬…
別想歪了,我們是爬取網站的電影,不是爬山哈 !!
先看一下豆瓣網,每頁顯示的電影數量
這里直接上代碼,我們不用線程池,看看,10頁電影圖片,需要多少時間
# -*- coding: utf-8 -*- """ @ auth : carl_DJ @ time : 2020-8-14 """import os import time import requests from bs4 import BeautifulSoup from urllib.request import urlretrieve from concurrent.futures import ThreadPoolExecutor ,wait,ALL_COMPLETEDdouban_path = '../py_class/pict' if not os.path.exists(douban_path):os.mkdir(douban_path)def down_load(url):#添加請求頭信息,防止被網站屏蔽掉headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}r = requests.get(url,headers=headers)soup = BeautifulSoup(r.text,'lxml')#找到當前頁面所有圖片的父divcontent = soup.find('div',class_= 'article') #獲取所有電影圖片的標簽images = content.find_all('img')#所有圖片的下載鏈接pic_link_list = [image['src'] for image in images] #獲取所有圖片的名字 pic_name_list =[image['alt'] for image in images] for name,link in zip(pic_name_list,pic_link_list):#urlretrieve暫時對 python3.7的支持,不太穩定,運行時報錯,# urlretrieve(link,f'{douban_path}/{name}.jpg')#運用老方法來讀寫html = requests.get(link)with open(f'{douban_path}/{name}.jpg','wb') as f :f.write(html.content)print(f'{url}所有電影下載完成')def main():stat_urls = ['https://movie.douban.com/top250',]#使用參數start={25*i},因為每頁顯示25個電影for i in range(1,10):stat_urls.append(f'https://movie.douban.com/top250?start={25*i}&filter=')# print(stat_urls)#開始時間start_time = time.time()#執行下載動作for url in stat_urls:down_load(url)#結束時間end_time = time.time()print('='*50)print(f'運行時按{end_time - start_time}')if __name__ == '__main__':main()我們尋找class = ‘article’ 這邊標簽
content = soup.find('div',class_= 'article')是因為 我們要爬取的各個電影的圖片,是class = ‘article’ 的子類
有句老話說的好:找到了老子, 還怕找不到小子嗎??
最后,爬取的時間 是 49s+
使用線程池爬取豆瓣
我們要看看,使用多線程,到底能提速多少
""" @ auth : carl_DJ @ time : 2020-8-14 """import os import time import requests from bs4 import BeautifulSoup from urllib.request import urlretrieve from concurrent.futures import ThreadPoolExecutor ,wait,ALL_COMPLETEDdouban_path = '../py_class/pict' if not os.path.exists(douban_path):os.mkdir(douban_path)def down_load(url):headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}r = requests.get(url,headers=headers)soup = BeautifulSoup(r.text,'lxml')#找到當前頁面所有圖片的父divcontent = soup.find('div',class_= 'article') #獲取所有電影圖片的標簽images = content.find_all('img')#所有圖片的下載鏈接pic_link_list = [image['src'] for image in images] #獲取所有圖片的名字 pic_name_list =[image['alt'] for image in images] for name,link in zip(pic_name_list,pic_link_list):#urlretrieve暫時對 python3.7的支持,不太穩定,運行時報錯,# urlretrieve(link,f'{douban_path}/{name}.jpg')#運用老方法來讀寫html = requests.get(link)with open(f'{douban_path}/{name}.jpg','wb') as f :f.write(html.content)print(f'{url}所有電影下載完成')def main():stat_urls = ['https://movie.douban.com/top250',]for i in range(1,10):stat_urls.append(f'https://movie.douban.com/top250?start={25*i}&filter=')# print(stat_urls)#開始時間start_time = time.time()#定義10個線程with ThreadPoolExecutor(max_workers=10) as executor:futures = [] #獲取運行結果for url in stat_urls:future = executor.submit(down_load,url)futures.append(future)#等到所有線程執行完成,在進行后續邏輯wait(futures,return_when=ALL_COMPLETED)#結束時間end_time = time.time()print('='*50)#打印時間差print(f'運行時按{end_time - start_time}')if __name__ == '__main__':main()我們看看運行結果,20s+,確實提速很多,所以,能多線程,就別單線程,讓更多的資源動起來,動起來~ ~
最后給大家看一下,爬取的圖片 是啥樣子的
電影的圖片 和名字都會顯示。
????乛?乛????
最后,希望大家都能爬到自己想要的小電影~ ~
但是,還得提醒一下:
適當的可以怡情,過多就傷身了啊~
總結
以上是生活随笔為你收集整理的Python3,多线程爬取某瓣小电影~ ~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Angular】Angular使用HT
- 下一篇: 增量式PID是什么?不知道你就落伍了