python自动下载图片的方法示例
作者:^_^影 发布时间:2022-01-03 06:32:44
近日闲来无事,总有一种无形的力量萦绕在朕身边,让朕精神涣散,昏昏欲睡。
可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。
突然旁边的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头像的脸上,并附文:‘拿去,速滚'
来源:https://blog.csdn.net/weixin_39815001/article/details/103779788
猜你喜欢
- 介绍Zmail 使得在python3中发送和接受邮件变得更简单。你不需要手动添加服务器地址、端口以及适合的协议,zmail会帮你完成。此外,
- min()方法返回它的参数最小值:最接近负无穷大的值。语法以下是min()方法的语法:min( x, y, z, .... )参
- 随着计算机硬件的不断发展,多核CPU已经成为普及的硬件设备,利用多核CPU的优势可以有效的提高程序的执行效率。而多进程模式可以实现多核CPU
- 这个跟ping那个差不多,ping的那个脚本就是通过这个改了下,大体一致,不过telnet的不需要判断返回的字符串。快一些这里具体需要tel
- 技术背景GPU的加速技术在深度学习、量子计算领域都已经被广泛的应用。其适用的计算模型是小内存的密集型计算场景,如果计算的模型内存较大,则需要
- 想学习Python的同学们,在这里隆重介绍一款 Python 的开发工具 pyCharm IDE。这是我最喜欢的 Python编辑器利器。而
- 背景一直对语音合成系统比较感兴趣,总想能给自己合成一点内容,比如说合成小说,把我下载的电子书播报给我听等等。语音合成系统其实就是一个基于语音
- go-micro是golang的一个微服务框架。这篇文章将介绍使用go-micro最新版本v4开发gRPC服务的方式。1、安装protoc这
- 如下所示:>>> import pandas as pd>>> import numpy as np#
- os即operating system(操作系统),Python 的 os 模块封装了常见的文件和目录操作。os.path模块主要用于文件的
- Python 链接抖音python下载抖音内容的帖子网上有一些,但都比较麻烦,需要通过adb连接安卓手机后,模拟操作。我这么懒,这种事儿玩不
- 1. 需求概述最近接到一份PDF资料需要打印,奈何页面是如图所示的A3格式的,奈何目前条件只支持打印A4。我想要把每页的一个大页面裁成两个小
- 题目:在提示符下使用open打开一个文件刚开始网上看了下打开的方式,结果一直实现不了,报错是没找到这个文件,而且和我输入的文件名不一样。错误
- 代码如下:---这是一个人事系统中的示例,要求记录一下员工的缺勤情况 ---1.要在表中记录一下缺勤计分,是对经常缺勤者的一种处
- 详解python里使用正则表达式的全匹配功能python中很多匹配,比如搜索任意位置的search()函数,搜索边界的match()函数,现
- 本文实例讲述了PHP开发之归档格式phar文件概念与用法。分享给大家供大家参考,具体如下:一个php应用程序往往是由多个文件构成的,如果能把
- 1、说明拼接文件路径,可以有多个参数。2、语法os.path.join(path1,path2,*)path1 初始路径。path2 需要拼
- FTP服务的主动模式和被动模式在开始之前,先聊一下FTP的主动模式和被动模式,两者的区别 , 用两张图来表示可能会更加清晰一些:主动模式:主
- 从百度查到在django中,使用post方法时,需要先生成随机码,以防止CSRF(Cross-site request forgery)跨站
- CSS制作滑动折叠的文字效果,可以用于二级导航菜单的制作,不错的下拉菜单。<!DOCTYPE html PUBLIC "-/