filmes de Douban rastreando python3
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
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 ? ?
Finalmente, o tempo de rastreamento é de 49s +
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
Finalmente, deixe-me mostrar como são as imagens rastreadas
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 ~