Python3, rastreamento multi-threaded de um pequeno filme ~ ~


Devido à epidemia deste ano, não podemos ir ao cinema para consumir, e não podemos ter a diversão de segurar uma namorada com a mão direita e uma namorada com a mão esquerda.
Mas até em casa tem onda ...

Rastrear Douban diretamente

Nenhuma das opções acima é a questão, a questão é, temos que ver como escalar ...
não pense nisso, estamos rastreando filmes em sites, não escalando montanhas! !
Vamos dar uma olhada em Douban, o número de filmes exibidos em cada página
Insira a descrição da imagem aqui

Aqui está o código diretamente, não precisamos de um pool de threads, vamos ver quanto tempo leva para 10 páginas de imagens de filmes

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

Procuramos o rótulo de classe = 'artigo'

content = soup.find('div',class_= 'article')

Porque as imagens de cada filme que queremos rastrear são subcategorias de class = 'article'

Existe um velho ditado: Eu encontrei Laozi, você tem medo de não conseguir encontrar um menino ? ?

Insira a descrição da imagem aqui
Finalmente, o tempo de rastreamento é de 49s +

Insira a descrição da imagem aqui

Use pool de threads para rastrear Douban

Temos que ver o quanto a velocidade pode ser aumentada usando multithreading

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

Vamos dar uma olhada nos resultados da execução, 20s +, ele acelera muito, então se você pode multi-thread, não single-thread, deixe mais recursos se moverem
Insira a descrição da imagem aqui

Finalmente, deixe-me mostrar como são as imagens rastreadas
Insira a descrição da imagem aqui

A imagem e o nome do filme serão exibidos.
؏؏☝ᖗ 乛 ◡ 乛 ᖘ☝؏؏
Finalmente, espero que todos possam subir para o pequeno filme que desejam ~ ~
Mas, tenho que lembrar:

Adequado pode ser agradável, muito vai machucar seu corpo ~

Acho que você gosta

Origin blog.csdn.net/wuyoudeyuer/article/details/107996727
Recomendado
Clasificación