python爬取网站的图片

python爬取网站的图片

本次爬取图片所需要用到的库:Requests库,BeautifulSoup库,正则表达式,os库。

思路:先爬一张图片,再爬一个网站的图片

先爬一张图片:

首先要得到这张图片的地址,可以直接找到图片然后复制地址,还可以在网站中右击然后检查(谷歌浏览器快捷键是F12)中找到,这里用后种方式方便后面的理解,如图:

在这里插入图片描述

然后就可以把地址复制到代码中去,代码如下:

import requests
import os								#这是一个和路径相关的库
#图片所在的网址,jpg,png等格式
url="https://files.yande.re/image/f312298021cf93355d185e3e28e5b52c/yande.re%20535947%20berserker_of_black_%28fate_apocrypha%29%20breast_hold%20cleavage%20dress%20fate_apocrypha%20fate_grand_order%20fate_stay_night%20horns%20samsafe%20wedding_dress.jpg"root="F://pic//"  					 	#需要存储的根目录
path=root+url.split('/')[-1]  			#需要存储的路径以及文件名,若要自定义文件名则只需将改为path=root+"文件名.jpgtry:									#处理异常用if not os.path.exists(root):  		#判断根目录是否存在,不存在就创建os.mkdir(root)if not os.path.exists(path):		#查看文件(文件路径)是否存在r=requests.get(url)				#浏览器向服务器发出请求print(r.status_code)			#查看状态码,结果为200则获取成功 with open(path,'wb') as f:f.write(r.content)			#把获取到的内容以二进制形式写入文件(图片等文件都是二进制存储的)f.close()					#写完后好像with自己会关,这行代码可要可不要print("文件保存成功")else:print("文件已存在")
except:print("爬取失败")

代码的详细注释都在上面,执行之后的图片如下:
在这里插入图片描述
在这里插入图片描述
这张图片有2.11M的大小花了71秒,接下来,爬取一个网站的图片。

思路:先爬取网站所有图片的网址,再利用循环像刚刚那样就可以爬整个网站的图片了。代码如下:
#图片等文件爬取全代码
import requests
import os
import re
from bs4 import BeautifulSouphtml="https://yande.re/post?tags=fate%2Fstay_night"  	
res=requests.get(html)					#有了网站地址后向服务器发出请求
bs=BeautifulSoup(res.text,'lxml')		#运用解析库解析获取的内容#通过正则表达式和beautifulsoup的find_all函数获取所有图片的地址,并且以列表形式返回给images
images=bs.find_all("a",{"class":"directlink largeimg","href":re.compile(r"\.jpg")})for image in images:					#在列表中循环url=image["href"]					root="F://pic//"   					#需要存储的根目录path=root+url.split('/')[-1]  		#需要存储的路径以及文件名,若要自定义文件名则只需将改为path=root+"文件名.jpg"try:if not os.path.exists(root):  	#查看根目录是否存在,不存在就创建os.mkdir(root)if not os.path.exists(path):	#查看文件(文件路径)是否存在r=requests.get(url)			#浏览器向服务器发出请求		with open(path,'wb') as f:f.write(r.content)		#把获取到的内容以二进制形式写入文件(图片等文件都是二进制存储的)f.close()				#写完后好像with自己会关,这行代码可要可不要print("文件保存成功")		else:print("文件已存在")except:print("爬取失败")
然后执行就可以了,在写博客的时候发现存在一个问题,整个代码向服务器发送了两次请求,一次请求网站地址的内容,一次请求图片网址的内容,降低了运行速度,不知道其他算法写的代码需不需要请求两次,刚开始学爬虫,不懂的还有很多,有意见或者建议请在评论里发言。下面更新后的完整代码,增加了对付反爬虫机制以及计数的代码。
#图片等文件爬取全代码
import requests
import os
import re
from bs4 import BeautifulSoup
import random
import timei=0	#用来计数
#代理ip,针对反爬虫机制
proxylist=[{"http":"http://182.88.122.115:9797"},{"http":"http://183.49.87.142:9000"},{"http":"http://125.32.81.197:8080"}
]
proxy=random.choice(proxylist)
#请求头,针对反爬虫机制
agent1="Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"  #谷歌
agent2="Mozilla/5.0 (Windows NT 6.1; WOW64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36"	#360
agent3="Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1;\WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5\.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; \.NET4.0E; QQBrowser/7.0.3698.400)"											#qq
agent4="Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 \
(KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0"		#搜狗
agent5="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36"	#UC
list1=[agent1,agent2,agent3,agent4,agent5]for x in range(0,10):agent=random.choice(list1)  	#随机选一个ip地址header={"User-Agent":agent}		#随机选一个user-agenthtml="https://anime-pictures.net/pictures/view_posts/"+str(x)+"?search_tag=katou%20megumi&order_by=date&ldate=0&lang=en" res=requests.get(html,proxies=proxy,headers=header)time.sleep(1)					#有了网站地址后向服务器发出请求bs=BeautifulSoup(res.text,'lxml')		#运用解析库解析获取的内容#通过正则表达式和beautifulsoup的find_all函数获取所有图片的地址,并且以列表形式返回给imagesimages=bs.find_all("img",{"src":re.compile(r"\.jpg")})for image in images:					#在列表中循环url="http:"+image["src"]					root="F://路人女主1//"   					#需要存储的根目录path=root+url.split('/')[-1]  		#需要存储的路径以及文件名,若要自定义文件名则只需将改为path=root+"文件名.jpg"try:if not os.path.exists(root):  	#查看根目录是否存在,不存在就创建os.mkdir(root)if not os.path.exists(path):	#查看文件(文件路径)是否存在r=requests.get(url,proxies=proxy,headers=header)			#浏览器向服务器发出请求time.sleep(1)	with open(path,'wb') as f:f.write(r.content)		#把获取到的内容以二进制形式写入文件(图片等文件都是二进制存储的)f.close()				#写完后好像with自己会关,这行代码可要可不要print("文件保存成功"+str(i))	i=i+1	else:print("文件已存在"+str(i))i=i+1except:print("爬取失败"+str(i))i=i+1
print(i)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring 定时器注释_带注释的控制器– Spring Web / Webflux和测试

spring 定时器注释Spring Webflux和Spring Web是两个完全不同的Web堆栈。 但是, Spring Webflux继续支持基于注释的编程模型 使用这两个堆栈定义的端点可能看起来很相似,但是测试这种端点的方式却完全不同,并且编写这种端点的用户必须知道哪…

python计算方位角_实例讲解:用python 计算方位角(根据两点的坐标计算)记得收藏哦...

今天为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起来看看吧!知道两点坐标,怎么计算两点方向的方位角?答:首先计算坐标增量dx,dy(两个…

Java 中的自举类,到底是什么?

欲知详情,猛戳:https://www.zhihu.com/question/447748200

数据库考研SQL操作

SQL的动词 SQL功能动词数据查询SELECT数据定义CREATE, DROP, ALTER数据操纵INSERT, UPDATE, DELETE数据控制GRANT, REVOKE 注:以下[ ]表示方括号的内容可要可不要,|表示或,//表示注释。 一、数据定义 1.CREATE 定义模式 CREATE SCHEMA &…

objects jdk8_JDK 9:NotNullOrElse方法已添加到Objects类

objects jdk8JDK 9向Objects类添加了一些新方法&#xff0c;包括本文中突出显示的两个static方法&#xff1a; requireNonNullElse&#xff08;T&#xff0c;T&#xff09;和requireNonNullElseGet&#xff08;T obj&#xff0c;Supplier <&#xff1f;extended T>供应商…

用户登陆_华为路由器AAA用户密码登陆你了解吗?

AAA Authentication&#xff08;认证&#xff09;、Authorization&#xff08;授权&#xff09;、Accounting&#xff08;&#xff09;它提供了认证、授权、计费三种安全功能,可以验证用户帐户是否合法&#xff0c;授权用户可以访问的服务&#xff0c;并记录用户使用网络资源的…

Java API 文档中的接口方法和抽象方法,有什么区别?

欲知详情&#xff0c;猛戳&#xff1a;https://www.zhihu.com/question/445956288

java程序设置jvm_Java程序员应在2018年学习的3种JVM语言

java程序设置jvm如果您是Java程序员&#xff0c;并且想学习更多的编程语言以扩展您的知识和技能&#xff0c;但是不确定选择哪种编程语言&#xff0c;那么您来对地方了。 在本文中&#xff0c;我将分享Java程序员可以在2018年学习的3种JVM语言以及为什么要学习它们。 成为多语种…

word域变成正常文本_【Word小技巧】不学会后悔哦~

工作中使用Word早已成了习惯&#xff0c;因此&#xff0c;今天小编将为大家分享几个实用的的Word小技巧。重叠字快速录入文字录入是word最基本操作&#xff0c;过程中我们难免要输入重叠字&#xff0c;例如&#xff1a;热热闹闹&#xff0c;卿卿我我等……你知道如何快速录入吗…

Java 中把声明变量的语句如果写在循环体内,每次执行时栈内存中的变量和数据是如何变化的?

问题一&#xff1a;如下面的代码示例 1&#xff0c;JVM 是不是会反复回收旧的变量 a 再重新创建新的变量 a 呢&#xff1f;还是旧的变量 a 一直保留在栈内&#xff0c;只是反复赋值 0 而已呢&#xff1f; 代码示例 1&#xff1a; while (true) { int a 0; a 5; }问题二&…

使用Speedment 3.0.17及更高版本简化了事务

交易次数 有时我们想确保我们的数据库操作是原子执行的&#xff0c;并且与其他操作分开。 这是交易起作用的地方。 交易是一组操作 数据库可能接受或不接受作为原子操作的建议。 因此&#xff0c;要么接受交易中的所有操作&#xff0c;要么不接受交易中的所有操作。 事务的另一…

python中常用的方法

python常用方法 字符串&#xff1a; name.title() #字符串的每个单词首字母大写 name.upper() #字符串的字母全部大写 name.lower() #字符串的字母全部小写 name.rstrip() #删除字符串结尾的空白 name.lstrip() #删除字符串开头的空白 name.strip() #删除…

sql server 2008 年累计数_Windows Server 2008 和 SQL Server 2008将终止支持 迁移至Azure 微软提供3年免费技术支持...

点击上方蓝色字关注我们~迁移至 Azure 并利用免费扩展安全更新。了解有关支持终止建议的更多信息&#xff0c;请使用浏览器访问&#xff1a;https://www.microsoft.com/zh-cn/sql-server/sql-server-2008.对您意味着什么1 2017年基于风险的安全报告; 思科 2017 年度网络安全报告…

递归调用方法时栈内存是如何变化的?(使用内存图演示递归调用过程)

文章目录 什么是栈内存演示方法递归调用过程什么是栈内存 在学习递归实现原理之前,我们先了解一下栈内存。 栈内存是计算机中的一种数据存储方式,是 Java 进程启动时候在内存中开辟的存储空间。 栈内存的利用方式遵循 LIFO(后迚先出)原则Java 所有局部变量都在栈中分配(压入…

旧版Requests库

requests库基本使用Requests解析库方法response对象response对象的属性**r.encoding**属性与**r.apparent_encoding**属性的区别requests库的异常举例Requests解析库 方法 最常用的两个方法: request.get() request.post() 作用&#xff1a;都是从服务器获取网页信息 区别&…

运行单个源文件_使用一个命令执行单个Java源文件

运行单个源文件JDK增强提案 &#xff08; JEP &#xff09; 草案于2017年末创建&#xff0c;名为“ 启动单文件源代码程序 ”&#xff08;其相关的JDK问题为JDK-8192920 &#xff09;。 顾名思义&#xff0c;该JEP草案旨在“增强Java启动器以支持运行作为Java源代码的单个文件提…

夸克浏览器怎么安装脚本_iOS 第一浏览器发布安卓版,除了真香我还能说什么...

如果不算 Safari 的话&#xff0c;iOS 平台公认最好的浏览器是 Alook。无推送无新闻无广告、日常售价 12 元、工具类排行第三、7.8 万个评分足以证明其优秀。以至于很多双持或对 Alook 有所了解的用户都希望 Alook 能推出安卓端。现在安卓端真的来了。(安卓端免费)假如这个时候…

Windows 10 笔记本如何使用外接显示器

文章目录如何连接外接显示屏如何设置显示模式如何设置不同显示屏各自的分辨率如何设置主显示器通过显卡来设置显示器如何连接外接显示屏 VGA 线或者 HDMI 线连接好电脑和显示器&#xff0c;以 HDMI 线为例简单讲下吧。 显示器可能会有多个 HDMI 接口&#xff0c;假设你插入 H…

蓝牙信号强度检测app_基于蓝牙技术的智能插座方案

有这样一句话“科技时代&#xff0c;生活轻快”。随着社会现代化程度越来越高&#xff0c;科技的应用为人们的生活带来便捷&#xff0c;大大提高了工作效率。纵观市场上“智能家居”产品很多&#xff0c;功能各异&#xff0c;各有千秋&#xff0c;但是针对家电控制的智能插座还…

图片清晰度,分辨率,像素总结

像素 像素是一个个小方块&#xff0c;是构成位图的基本单位。将图片放大即可看出来&#xff0c;如图&#xff1a; 分辨率 显示分辨率是指像素的总数量&#xff0c;如上图的22001400&#xff0c;也就是宽有2200个像素&#xff0c;高有1400个像素。 图像分辨率是指每英寸所包含…