python自动下载图片的方法示例

近日闲来无事,总有一种无形的力量萦绕在朕身边,让朕精神涣散,昏昏欲睡。

可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。

突然旁边的IOS同事问:‘嘿,兄弟,我发现一个网站的图片很有意思啊,能不能帮我保存下来提升我的开发灵感?'
作为一个坚强的社畜怎么能说自己不行呢,当时朕就不假思索的答应:‘oh, It's simple. Wait for me a few minute.'

点开同事给的图片网站,

网站大概长这样:

在朕翻看了几十页之后,朕突然觉得有点上头。心中一想'不对啊,朕不是来学习的吗?可是看美女图片这个事情怎么才可以和学习关联起来呢‘

冥思苦想一番之后,突然脑中灵光一闪,'要不用python写个爬虫吧,将此网站的图片一网打尽‘。

说干就干,身体力行,要问爬虫哪家强,‘人生苦短,我用python'。

首先找到我的电脑里面半年前下载的python安装包,无情的点击了安装,环境装好之后,略一分析网页结构。先撸一个简易版爬虫

#抓取爱小姐姐网图片保存到本地
import requests
from lxml import etree as et
import os

#请求头
headers = {
  #用户代理
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}

#待抓取网页基地址
base_url = ''
#保存图片基本路径
base_dir = 'D:/python/code/aixjj/'
#保存图片
def savePic(pic_url):
  #如果目录不存在,则新建
  if not os.path.exists(base_dir):
    os.makedirs(base_dir)

  arr = pic_url.split('/')
  file_name = base_dir+arr[-2]+arr[-1]
  print(file_name)
  #获取图片内容
  response = requests.get(pic_url, headers = headers)
  #写入图片
  with open(file_name,'wb') as fp:
    for data in response.iter_content(128):
      fp.write(data)

#观察此网站总共只有62页,所以循环62次
for k in range(1,63):
  #请求页面地址
  url = base_url+str(k)
  response = requests.get(url = url, headers = headers)
  #请求状态码
  code = response.status_code
  if code == 200:
    html = et.HTML(response.text)
    #获取页面所有图片地址
    r = html.xpath('//li/a/img/@src')
    #获取下一页url
    #t = html.xpath('//div[@class="page"]/a[@class="ch"]/@href')[-1]
    for pic_url in r:
      a = 'http:'+pic_url
      savePic(a)
  print('第%d页图片下载完成' % (k))

print('The End!')

尝试运行爬虫,嘿,没想到行了:

过了一会儿,旁边的哥们儿又来:‘嘿 bro 你这个可以是可以,就是速度太慢了啊,我的灵感会被长时间的等待磨灭,你给改进改进?'

怎么提升爬虫的效率呢?略一思索,公司的电脑可是伟大的四核CPU啊,要不撸个多进程版本试试。然后就产生了下面这个多进程版本

#多进程版——抓取爱小姐姐网图片保存到本地

import requests
from lxml import etree as et
import os
import time
from multiprocessing import Pool

#请求头
headers = {
  #用户代理
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}

#待抓取网页基地址
base_url = ''
#保存图片基本路径
base_dir = 'D:/python/code/aixjj1/'

#保存图片
def savePic(pic_url):
  #如果目录不存在,则新建
  if not os.path.exists(base_dir):
    os.makedirs(base_dir)

  arr = pic_url.split('/')
  file_name = base_dir+arr[-2]+arr[-1]
  print(file_name)
  #获取图片内容
  response = requests.get(pic_url, headers = headers)
  #写入图片
  with open(file_name,'wb') as fp:
    for data in response.iter_content(128):
      fp.write(data)

def geturl(url):
  #请求页面地址
  #url = base_url+str(k)
  response = requests.get(url = url, headers = headers)
  #请求状态码
  code = response.status_code
  if code == 200:
    html = et.HTML(response.text)
    #获取页面所有图片地址
    r = html.xpath('//li/a/img/@src')
    #获取下一页url
    #t = html.xpath('//div[@class="page"]/a[@class="ch"]/@href')[-1]
    for pic_url in r:
      a = 'http:'+pic_url
      savePic(a)

if __name__ == '__main__':
  #获取要爬取的链接列表
  url_list = [base_url+format(i) for i in range(1,100)]
  a1 = time.time()
  #利用进程池方式创建进程,默认创建进程数量=电脑核数
  #自己定义进程数量方式 pool = Pool(4)
  pool = Pool()
  pool.map(geturl,url_list)
  pool.close()
  pool.join()
  b1 = time.time()
  print('运行时间:',b1-a1)

抱着试一试的心态,运行了多进程版本爬虫,嘿没想到又行了,在朕伟大的四核CPU的加持下,爬虫速度提升了3~4倍。
又过了一会儿,那哥们儿又偏过头来:‘你这个快是快了不少,但是还不是最理想的状态,能不能一眨眼就能爬取百八十个图片,毕竟我的灵感来的快去的也快'

我:‘…'
悄悄打开Google,搜索如何提升爬虫效率,给出结论:

多进程:密集CPU任务,需要充分使用多核CPU资源(服务器,大量的并行计算)的时候,用多进程。
多线程:密集I/O任务(网络I/O,磁盘I/O,数据库I/O)使用多线程合适。

呵,我这可不就是I/O密集任务吗,赶紧写一个多线程版爬虫先。于是,又诞生了第三款:

import threading # 导入threading模块
from queue import Queue #导入queue模块
import time #导入time模块
import requests
import os
from lxml import etree as et

#请求头
headers = {
  #用户代理
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
#待抓取网页基地址
base_url = ''
#保存图片基本路径
base_dir = 'D:/python/code/aixjj/'

#保存图片
def savePic(pic_url):
  #如果目录不存在,则新建
  if not os.path.exists(base_dir):
    os.makedirs(base_dir)

  arr = pic_url.split('/')
  file_name = base_dir+arr[-2]+arr[-1]
  print(file_name)
  #获取图片内容
  response = requests.get(pic_url, headers = headers)
  #写入图片
  with open(file_name,'wb') as fp:
    for data in response.iter_content(128):
      fp.write(data)

# 爬取文章详情页
def get_detail_html(detail_url_list, id):
  while True:
    url = detail_url_list.get() #Queue队列的get方法用于从队列中提取元素
    response = requests.get(url = url, headers = headers)
    #请求状态码
    code = response.status_code
    if code == 200:
      html = et.HTML(response.text)
      #获取页面所有图片地址
      r = html.xpath('//li/a/img/@src')
      #获取下一页url
      #t = html.xpath('//div[@class="page"]/a[@class="ch"]/@href')[-1]
      for pic_url in r:
        a = 'http:'+pic_url
        savePic(a)

# 爬取文章列表页
def get_detail_url(queue):
  for i in range(1,100):
    #time.sleep(1) # 延时1s,模拟比爬取文章详情要快
    #Queue队列的put方法用于向Queue队列中放置元素,由于Queue是先进先出队列,所以先被Put的URL也就会被先get出来。
    page_url = base_url+format(i)
    queue.put(page_url)
    print("put page url {id} end".format(id = page_url))#打印出得到了哪些文章的url

#主函数
if __name__ == "__main__":
  detail_url_queue = Queue(maxsize=1000) #用Queue构造一个大小为1000的线程安全的先进先出队列
  #A线程负责抓取列表url
  thread = threading.Thread(target=get_detail_url, args=(detail_url_queue,))
  html_thread= []
  #另外创建三个线程负责抓取图片
  for i in range(20):
    thread2 = threading.Thread(target=get_detail_html, args=(detail_url_queue,i))
    html_thread.append(thread2)#B C D 线程抓取文章详情
  start_time = time.time()
  # 启动四个线程
  thread.start()
  for i in range(20):
    html_thread[i].start()
  # 等待所有线程结束,thread.join()函数代表子线程完成之前,其父进程一直处于阻塞状态。
  thread.join()
  for i in range(20):
    html_thread[i].join()
  print("last time: {} s".format(time.time()-start_time))#等ABCD四个线程都结束后,在主进程中计算总爬取时间。

粗略测试一下,得出结论: ‘Oh my god,这也太快了吧'。
将多线程版本爬虫扔到同事QQ头像的脸上,并附文:‘拿去,速滚'

到此这篇关于python自动下载图片的方法示例的文章就介绍到这了,更多相关python 自动下载图片内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-03-23

Python实现115网盘自动下载的方法

本文实例讲述了Python实现115网盘自动下载的方法.分享给大家供大家参考.具体实现方法如下: 实例中的1.txt,是网页http://bbs.pediy.com/showthread.php?t=144788另存为1.txt 通过每3秒钟复制一个下载链接到粘贴板,复制时会自动调用115客户端下载,每下载10个文件会手工输入一个字符,防止一下下载太多,卡死机器 具体代码如下: import re, os, time import webbrowser import urllib if __na

Python实现的远程文件自动打包并下载功能示例

本文实例讲述了Python实现的远程文件自动打包并下载功能.分享给大家供大家参考,具体如下: 一 点睛 在Linux系统集群运营当中,时常需要批量远程执行Linux命令,并且双向同步文件的操作. 本示例通过使用spawn()方法执行ssh.scp 命令的思路来实现. 二 代码 import pexpect import sys ip="192.168.0.104" user="root" passwd="123456" target_file=&

Python爬虫实现百度图片自动下载

制作爬虫的步骤 制作一个爬虫一般分以下几个步骤: 分析需求分析网页源代码,配合开发者工具编写正则表达式或者XPath表达式正式编写 python 爬虫代码 效果预览 运行效果如下: 存放图片的文件夹: 需求分析 我们的爬虫至少要实现两个功能:一是搜索图片,二是自动下载. 搜索图片:最容易想到的是爬百度图片的结果,我们就上百度图片看看: 随便搜索几个关键字,可以看到已经搜索出来很多张图片: 分析网页 我们点击右键,查看源代码: 打开源代码之后,发现一堆源代码比较难找出我们想要的资源. 这个时候,就

使用python采集脚本之家电子书资源并自动下载到本地的实例脚本

jb51上面的资源还比较全,就准备用python来实现自动采集信息,与下载啦. Python具有丰富和强大的库,使用urllib,re等就可以轻松开发出一个网络信息采集器! 下面,是我写的一个实例脚本,用来采集某技术网站的特定栏目的所有电子书资源,并下载到本地保存! 软件运行截图如下: 在脚本运行时期,不但会打印出信息到shell窗口,还会保存日志到txt文件,记录采集到的页面地址,书籍的名称,大小,服务器本地下载地址以及百度网盘的下载地址! 实例采集并下载我们的python栏目电子书资源: #

Python3.x+迅雷x 自动下载高分电影的实现方法

快要过年了,大家都在忙些什么呢?一到年底公司各种抢票,备年货,被这过年的气氛一烘,都归心似箭,哪还有心思上班啊.归心似箭=产出低下=一行代码十个错=无聊.于是想起了以前学过一段时间的Python,自己平时也挺爱看电影的,手动点进去看电影详情然后一部一部的去下载太烦了,何不用Python写个自动下载电影的工具呢?诶,这么一想就不无聊了.以前还没那么多XX会员的时候,想看看电影都是去XX天堂去找电影资源,大部分想看的电影还是有的,就它了,爬它! 话说以前玩Python的时候爬过挺多网站的,都是在公司

Python FTP文件定时自动下载实现过程解析

这篇文章主要介绍了Python FTP文件定时自动下载实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.需求: 某数据公司每日15:00~17:00之间,在其FTP发布当日数据供下载,我方需及时下载当日数据至指定本地目录. 二.分析: 1.需实现FTP登陆.查询.下载功能: 解答:使用内置的ftplib模块中FTP类: 2.需判断文件是否下载: 解答:使用os模块中path.exists方法: 3.需判断在指定时间段内才执行下载任

Python实现FTP文件定时自动下载的步骤

之前遇到技术问题总能在技术博客上得到启发,十分感谢各位的无私分享.而自己却很少发文,固然是水平有限,但也限制了知识积累和总结.今后多总结分享,回馈博客的同时也希望大家多多批评. 一.需求: 某数据公司每日15:00~17:00之间,在其FTP发布当日数据供下载,我方需及时下载当日数据至指定本地目录. 二.分析: 1.需实现FTP登陆.查询.下载功能: 解答:使用内置的ftplib模块中FTP类: 2.需判断文件是否下载: 解答:使用os模块中path.exists方法: 3.需判断在指定时间段内

Python Socketserver实现FTP文件上传下载代码实例

一.Socketserver实现FTP,文件上传.下载 目录结构 1.socketserver实现ftp文件上传下载,可以同时多用户登录.上传.下载 效果图: 二.上面只演示了下载,上传也是一样的,来不及演示了,上代码 1.客户端 import socket,hashlib,os,json,sys,time class Ftpclient(object): def __init__(self): self.client = socket.socket() def connect(self,ip,

详解ftp文件上传下载命令

介绍:从本地以用户wasqry登录的机器1*.1**.21.67上通过ftp远程登录到ftp服务器上,登录用户名是lte****,以下为使用该连接做的实验. 查看远程ftp服务器上用户lte****相应目录下的文件所使用的命令为:ls,登录到ftp后在ftp命令提示符下查看本地机器用户wasqry相应目录下文件的命令是:!ls.查询ftp命令可在提示符下输入:?,然后回车.   1.从远程ftp服务器下载文件的命令格式: get  远程ftp服务器上当前目录下要下载的文件名  [下载到本地机器上

Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题

废话不多说了,直接给大家贴代码了,具体代码如下所示: //文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String path,String filename,InputStream input) { boolean success=false; FTPClient ftp=new FTPClient();//org.apache.commons.net.ftp

Python pygame绘制文字制作滚动文字过程解析

这篇文章主要介绍了Python pygame绘制文字制作滚动文字过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 字体常用的不是很多,在pygame中大多用于提示文字,或者记录分数等事件. 字体绘制基本分为以下几个步骤: 初始化字体模块 pygame.init() 创建一个字体对象 可以从文件或者系统内字体选取 pygame.font.SysFont('幼圆',50) 绘制文本对象. a.render("测试字体",True,(

Python生成个性签名图片获取GUI过程解析

这篇文章主要介绍了Python生成个性签名图片获取GUI过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先来看看程序运行的样子: 所以,程序的原理是 从一个url = ' http://www.uustv.com/ '中爬取个性签名的图片. 在该网页中审查该图片的元素,然后找到该图片的imgur 使用正则表达式直接定位 程序的后面使用到了tkinter的 GUI简易界面,用于和用户的简单交互,非常方便. 整个程序的完整代码如下: (有任

基于jquery ajax的多文件上传进度条过程解析

这篇文章主要介绍了基于jquery ajax的多文件上传进度条过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 效果图 前端代码,基于jquery <!DOCTYPE html> <html> <head> <title>主页</title> <meta name="viewport" content="width=device-width,initia

python实现迭代法求方程组的根过程解析

这篇文章主要介绍了python实现迭代法求方程组的根过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 有方程组如下: 迭代法求解x,python代码如下: import numpy as np import matplotlib.pyplot as plt A = np.array([[8, -3, 2], [4, 11, -1], [6, 3, 12]]) b = np.array([[20, 33, 36]]) # 方法一:消元法求解

Python enumerate函数遍历数据对象组合过程解析

这篇文章主要介绍了Python enumerate函数遍历数据对象组合过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 介绍 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. Python 2.3. 以上版本可用,2.6 添加 start 参数. enumerate(sequence, [start=0]) # sequence 是一个序