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_COMPLETED

douban_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')
    #找到当前页面所有图片的父div
    content = 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_COMPLETED

douban_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')
    #找到当前页面所有图片的父div
    content = 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+,确实提速很多,所以,能多线程,就别单线程,让更多的资源动起来,动起来~ ~
在这里插入图片描述

最后给大家看一下,爬取的图片 是啥样子的
在这里插入图片描述

电影的图片名字都会显示。
؏؏☝ᖗ乛◡乛ᖘ☝؏؏
最后,希望大家都能爬到自己想要的小电影~ ~
但是,还得提醒一下:

适当的可以怡情,过多就伤身了啊~

猜你喜欢

转载自blog.csdn.net/wuyoudeyuer/article/details/107996727