由于今年的疫情原因,我们不能到电影院消费,就无法体验右手牵女友,左手牵女友闺蜜的乐趣。
但是,即使在家里,也得撒一波…
直接爬取豆瓣
以上说的都不是重点,重点是,我们要看看怎么爬…
别想歪了,我们是爬取网站的电影,不是爬山哈 !!
先看一下豆瓣网,每页显示的电影数量
这里直接上代码,我们不用线程池,看看,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+,确实提速很多,所以,能多线程,就别单线程,让更多的资源动起来,动起来~ ~
最后给大家看一下,爬取的图片 是啥样子的
电影的图片 和名字都会显示。
؏؏☝ᖗ乛◡乛ᖘ☝؏؏
最后,希望大家都能爬到自己想要的小电影~ ~
但是,还得提醒一下:
适当的可以怡情,过多就伤身了啊~