爬虫项目介绍

  本次爬虫项目将爬取豆瓣Top250电影的图片,其网址为:https://movie.douban.com/top250, 具体页面如下图所示:

  本次爬虫项目将分别不使用多线程和使用多线程来完成,通过两者的对比,显示出多线程在爬虫项目中的巨大优势。本文所使用的多线程用到了concurrent.futures模块,该模块是Python中最广为使用的并发库,它可以非常方便地将任务并行化。在concurrent.futures模块中,共有两种并发模块,分别如下:

  • 多线程模式:ThreadPoolExecutor,适合 IO密集型任务;
  • 多进程模式:ProcessPoolExecutor,适合计算密集型任务。

具体的关于该模块的介绍可以参考其官方网址:https://docs.python.org/3/library/concurrent.futures.html

  本次爬虫项目将会用到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), 欢迎大家关注哦~~

最新文章

  1. EF执行出错~NotSupportedException
  2. asp.net 无法加载程序集***
  3. 使用nodejs+express(4.x+)实现文件上传
  4. jackson json转实体 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException
  5. [转]source inslght使用指导
  6. KM算法(二分图的最佳完美匹配)
  7. spring+mybatis管理多个数据源(非分布式事务)
  8. 20172310 蓝墨云ASL测试 2018-1938872
  9. 基于Manhattan最小生成树的莫队算法
  10. MySQL误删数据
  11. [leetcode]282. Expression Add Operators 表达式添加运算符
  12. 强大的easygrid V7 ,可联系作者
  13. hadoop 2.2搭建常见错误
  14. Leetcode 22
  15. Qt线程外使用Sleep
  16. Mybatis分页查询与动态SQL
  17. VS2005环境下采用makefile编译、使用libjpeg.lib函数库
  18. powershell 设置环境变量 -- go 单元测试 exit status 3221225781
  19. JSON和list之间的转换
  20. Activity步骤

热门文章

  1. npm Error: Cannot find module './auth.js'
  2. bzoj3237(cdq+并查集)
  3. [转] kaldi中FST的可视化-以yesno为例
  4. Python 爬虫修养-处理动态网页
  5. MySQL Schema与数据类型的优化
  6. Javascript高级编程学习笔记(39)—— DOM(5)Comment
  7. Win10下python不同版本同时安装并解决pip共存问题
  8. 吴恩达机器学习笔记46-K-均值算法(K-Means Algorithm)
  9. 实现简易Promise
  10. CSS3新增伪类--好用的:target