摘要:本次爬虫项目将会用到模块中的类,多线程豆瓣电影图片。总结通过上述两个爬虫程序的对比,我们不难发现,同样是下载豆瓣电影,个网页中的图片,在没有使用多线程的情况下,总共耗时约,而在使用多线程个线程的情况下,总共耗时约秒,效率整整提高了约倍。
爬虫项目介绍
本次爬虫项目将爬取豆瓣Top250电影的图片,其网址为:https://movie.douban.com/top250, 具体页面如下图所示:
本次爬虫项目将分别不使用多线程和使用多线程来完成,通过两者的对比,显示出多线程在爬虫项目中的巨大优势。本文所使用的多线程用到了concurrent.futures模块,该模块是Python中最广为使用的并发库,它可以非常方便地将任务并行化。在concurrent.futures模块中,共有两种并发模块,分别如下:
多线程模式:ThreadPoolExecutor,适合 IO密集型任务;
多进程模式:ProcessPoolExecutor,适合计算密集型任务。
具体的关于该模块的介绍可以参考其官方网址:https://docs.python.org/3/lib... 。
本次爬虫项目将会用到concurrent.futures模块中的ThreadPoolExecutor类,多线程豆瓣Top250电影图片。下面将会给出本次爬虫项目分别不使用多线程和使用多线程的对比,以此来展示多线程在爬虫中的巨大优势。
首先,我们不使用多线程来下载豆瓣Top250电影图片,其完整的Python代码如下:
import time import requests import urllib.request from bs4 import BeautifulSoup # 该函数用于下载图片 # 传入函数: 网页的网址url def download_picture(url): # 获取网页的源代码 r = requests.get(url) # 利用BeautifulSoup将获取到的文本解析成HTML soup = BeautifulSoup(r.text, "lxml") # 获取网页中的电影图片 content = soup.find("div", class_="article") images = content.find_all("img") # 获取电影图片的名称和下载地址 picture_name_list = [image["alt"] for image in images] picture_link_list = [image["src"] for image in images] # 利用urllib.request..urlretrieve正式下载图片 for picture_name, picture_link in zip(picture_name_list, picture_link_list): urllib.request.urlretrieve(picture_link, "E://douban/%s.jpg" % picture_name) def main(): # 全部10个网页 start_urls = ["https://movie.douban.com/top250"] for i in range(1, 10): start_urls.append("https://movie.douban.com/top250?start=%d&filter=" % (25 * i)) # 统计该爬虫的消耗时间 t1 = time.time() print("*" * 50) for url in start_urls: download_picture(url) t2 = time.time() print("不使用多线程,总共耗时:%s"%(t2-t1)) print("*" * 50) main()
其输出结果如下:
************************************************** 不使用多线程,总共耗时:79.93260931968689 **************************************************
去E盘中的douban文件夹查看,如下图:
我们可以看到,在不使用多线程的情况下,这个爬虫总共耗时约80s,完成了豆瓣Top250电影图片的下载。
使用多线程接下来,我们使用多线程来下载豆瓣Top250电影图片,其完整的Python代码如下:
import time import requests import urllib.request from bs4 import BeautifulSoup from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED # 该函数用于下载图片 # 传入函数: 网页的网址url def download_picture(url): # 获取网页的源代码 r = requests.get(url) # 利用BeautifulSoup将获取到的文本解析成HTML soup = BeautifulSoup(r.text, "lxml") # 获取网页中的电影图片 content = soup.find("div", class_="article") images = content.find_all("img") # 获取电影图片的名称和下载地址 picture_name_list = [image["alt"] for image in images] picture_link_list = [image["src"] for image in images] # 利用urllib.request..urlretrieve正式下载图片 for picture_name, picture_link in zip(picture_name_list, picture_link_list): urllib.request.urlretrieve(picture_link, "E://douban/%s.jpg" % picture_name) def main(): # 全部10个网页 start_urls = ["https://movie.douban.com/top250"] for i in range(1, 10): start_urls.append("https://movie.douban.com/top250?start=%d&filter=" % (25 * i)) # 统计该爬虫的消耗时间 print("*" * 50) t3 = time.time() # 利用并发下载电影图片 executor = ThreadPoolExecutor(max_workers=10) # 可以自己调整max_workers,即线程的个数 # submit()的参数: 第一个为函数, 之后为该函数的传入参数,允许有多个 future_tasks = [executor.submit(download_picture, url) for url in start_urls] # 等待所有的线程完成,才进入后续的执行 wait(future_tasks, return_when=ALL_COMPLETED) t4 = time.time() print("使用多线程,总共耗时:%s" % (t4 - t3)) print("*" * 50) main()
其输出结果如下:
************************************************** 使用多线程,总共耗时:9.361606121063232 **************************************************
再去E盘中的douban文件夹查看,发现同样也下载了250张电影图片。
总结 通过上述两个爬虫程序的对比,我们不难发现,同样是下载豆瓣Top250电影,10个网页中的图片,在没有使用多线程的情况下,总共耗时约80s,而在使用多线程(10个线程)的情况下,总共耗时约9.5秒,效率整整提高了约8倍。这样的效率提升在爬虫中无疑是令人兴奋的。
希望读者在看了本篇博客后,也能尝试着在自己的爬虫中使用多线程,说不定会有意外的惊喜哦~~因为,大名鼎鼎的Python爬虫框架Scrapy,也是使用多线程来提升爬虫速度的哦!
注意:本人现已开通两个微信公众号: 因为Python(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/41878.html
摘要:本次分享将在此基础上,利用多线程,提高程序运行的效率。思路本次分享建立在博客爬虫之下载中电影的图片上,总体的爬虫思路没有变化,只是在此基础上引入多线程。 介绍 在博客:Java爬虫之下载IMDB中Top250电影的图片中我们实现了利用Java爬虫来下载图片,但是效率不算太高。本次分享将在此基础上,利用多线程,提高程序运行的效率。 思路 本次分享建立在博客Java爬虫之下载IMD...
摘要:介绍在博客爬虫爬取豆瓣电影图片中我们利用的爬虫框架,将豆瓣电影图片下载到自己电脑上。那么,在的爬虫的也可以下载图片吗答案当然是肯定的在本次分享中,我们将利用的包和函数来实现图片的下载。 介绍 在博客:Scrapy爬虫(4)爬取豆瓣电影Top250图片中我们利用Python的爬虫框架Scrapy,将豆瓣电影Top250图片下载到自己电脑上。那么,在Java的爬虫的也可以下载图片吗?答...
摘要:前言新接触爬虫,经过一段时间的实践,写了几个简单爬虫,爬取豆瓣电影的爬虫例子网上有很多,但都很简单,大部分只介绍了请求页面和解析部分,对于新手而言,我希望能够有一个比较全面的实例。 0.前言 新接触爬虫,经过一段时间的实践,写了几个简单爬虫,爬取豆瓣电影的爬虫例子网上有很多,但都很简单,大部分只介绍了请求页面和解析部分,对于新手而言,我希望能够有一个比较全面的实例。所以找了很多实例和文...
摘要:注意爬豆爬一定要加入选项,因为只要解析到网站的有,就会自动进行过滤处理,把处理结果分配到相应的类别,但偏偏豆瓣里面的为空不需要分配,所以一定要关掉这个选项。 本课只针对python3环境下的Scrapy版本(即scrapy1.3+) 选取什么网站来爬取呢? 对于歪果人,上手练scrapy爬虫的网站一般是官方练手网站 http://quotes.toscrape.com 我们中国人,当然...
阅读 3095·2023-04-25 18:22
阅读 2293·2021-11-17 09:33
阅读 3242·2021-10-11 10:59
阅读 3223·2021-09-22 15:50
阅读 2782·2021-09-10 10:50
阅读 848·2019-08-30 15:53
阅读 423·2019-08-29 11:21
阅读 2668·2019-08-26 13:58