php 抓取网页生成图片(Python批量抓取图片图片(1)--写在前面的话)
优采云 发布时间: 2021-12-06 20:23php 抓取网页生成图片(Python批量抓取图片图片(1)--写在前面的话)
——写在前面的话
相信你一定看过一篇文章的文章,题目是《只因为我写了一个爬虫,公司200多人被抓了!》《公众号文章(文章的描述已经很明显了,大家很清楚)
可以说,因为这次事件的恐慌和哗然,一些三线和二线个体爬虫工程师急于转行。其次,有的朋友对自己学到的爬虫技术感到担忧和恐慌。
其实每个人都会有这种警惕。不过,也没有必要像换个职业那样打一场大仗。我们还是要从业务本身做起,不仅要提升我们的业务能力,还要熟悉互联网的法律法规。虽然我个人没有学过爬虫的技术,但平时喜欢学习爬虫的一些小项目和小工具。虽然我花在学习算法上的时间比例少了很多,但我个人还是喜欢尝试一些新鲜的。技术可以丰富自己的业务水平。从这个角度来说,大多数工程师都会有这种业务倾向。当然,对于那些走在互联网第一线的爬虫工程师和大佬来说,我只是沧海一粟,水滴的数量是不够的。
说到上述事情,归根结底是一些公司和公司员工缺乏足够的法律知识。公司对员工的法制宣传和商业道德未能取得潜移默化的效果,尤其是互联网法律法规相关规定的传达。思想工作也没有及时到位。当然,这些不能总是依赖于公司。主要原因是个人的悟性。既然你已经这样做了,那么你应该对这个行业的法律知识有很好的了解和学习。为此,作为这个时代技术创新和技术研发的一员,我们必须始终遵守互联网法律法规,做好自己的本职工作,为社会做出更多的贡献。
文章内容:
——写在前面的话
1-捕获工件
2-使用Python批量抓取图片
(1) 抓取对象:搜狗画廊
(2) 抢类别:进入搜狗壁纸
(3)使用请求提取图像组件
(4)找到图片的真实url
(5)批量抓取图片成功
开始学习今天的内容吧~~
1-捕获工件
一个我一直很喜欢的谷歌图片捕捉插件叫做ImageAssistant
目前用户数为114,567,可以说是很不错了
和 Python 批量抓图效果完全一样
我不是为谷歌打广告,我只是觉得有用,分享给大家,提高办公效率。当然,本节最重要的是学习Python中批量抓取图片的原理和方法。
下面简单介绍一下插件的使用。安装插件后记得选择存放文件的地方,关闭谷歌设置下的下载查询访问
(不然每次都要按保存,很麻烦。如果有100张图片,肯定要按100次)
安装好插件后,下面通过视频简单演示一下爬取的过程。
例如:去微博拍一下鞠婧祎*敏*感*词*的照片,
进入后可以右键IA工具
2-使用Python批量抓取图片
注:文中抓字意为“攀登”
(1) 抓取对象:搜狗画廊
(2)抓取类别:进入搜狗壁纸,打开网页源码(快捷键是F12)
由于我使用的是 Google chrome 浏览器,所以我需要找到 img 标签
(3)使用请求提取图像组件
抓取思路和使用库文件请求
可以发现img标签下有图片src,所以使用Python requests提取组件获取img src,然后使用库urllib.request.urlretrieve将图片一一下载,达到目的批量获取数据。
开始爬行的第一步:
(注意:Network-->headers,然后用鼠标点击左侧菜单栏(地址栏)中的图片链接,然后在headers中找到图片url)
我们按照上面的思路爬取我们想要的结果:搜索网页代码后,搜狗图片的网址为
%B1%DA%D6%BD
这里的URL来自进入分类后的地址栏(如上图)。
分析源码分析上述URL所指向的网页
import requests #导入库requests
import urllib #导入库requests下面的urllib
from bs4 import BeautifulSoup
#使用BeautifulSoup,关于这个的用法请查看本公众号往期文章
#下面填入url
res = requests.get('http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD')
soup = BeautifulSoup(res.text,'html.parser')
print(soup.select('img')) #图片打印格式
结果
从上面的执行结果来看,打印出来的输出内容并没有我们想要的图片元素,只是分析了tupian130x34_@1x的img(或者网页中的logo),这显然不是我们想要的。也就是说,需要的图片数据不在url下,也就是不在下面的url中
%B1%DA%D6%BD。
因此,我们需要找到图片不在URL中的原因,并在下面进行改进。
开始爬取第二步:
考虑到图片元素可能是动态的,细心的人可能会发现,在网页中向下滑动鼠标滚轮时,图片是动态刷新的。也就是说,网页并不是一次性加载所有资源,而是动态加载资源。这也避免了因为网页过于臃肿而影响加载速度。
(4)找到图片的真实url
要找到所有图片的真实URL,这看起来有点困难,但在本项目中尝试一下也不是不可能。在接下来的学习中,经过不断的研究,我想我会逐渐提高这种业务的能力。
类似于第一步中的“注释”,我们找到位置:
F12——>>网络——>>XHR——>>(点击XHR下的文件)——>>预览
(注:如果在预览中没有找到内容,可以滚动左侧地址栏或点击图片链接)
从上图来看,图中的信息似乎就是我们需要的元素。点击all_items,发现下面是0 1 2 3... 一一看起来像图片元素的数据。
尝试打开一个网址。发现真的是图片地址
我们可以在其中任意选择一张图片的地址来验证是否是图片所在的位置:
把地址粘贴到浏览器中搜索,得到如下结果,说明这个地址的url就是我们要找的
找到上图的目标后,我们点击XHR下的Headers,也就是第二行
请求网址:
%E5%A3%81%E7%BA%B8&tag=%E5%85%A8%E9%83%A8&start=180&len=15&width=1366&height=768
尝试删除一些不需要的部分。去掉以上部分后,访问不会受到影响。
(删除的位置类似同一个地方,切记不要删除后面的长宽高)
例如:删除“=%E5%A3%81%E7%BA%B8&tag”得到
%E5%85%A8%E9%83%A8&start=180&len=15&width=1366&height=768
将网站复制到查看器,得到如下结果:
url中的category为类别,start为起始索引,len为长度,即图片数量。
另外注意imgs下的url内容(不要直接复制url)
替换为“+”
(5)批量抓取图片成功
如果你的电脑没有库文件请求,记得安装cmd命令:
pip 安装请求
最后,不断排序后的源码如下:
import requests
import json #使用json码
import urllib
def getSogouImag(category,length,path):
n = length
cate = category #分类
imgs = requests.get('http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category='+cate+'&tag=%E5%85%A8%E9%83%A8&start=0&len='+str(n))
jd = json.loads(imgs.text)
jd = jd['all_items']
imgs_url = [] #在url获取图片imgs
for j in jd:
imgs_url.append(j['bthumbUrl'])
m = 0
for img_url in imgs_url:
print('***** '+str(m)+'.jpg *****'+' Downloading...')
urllib.request.urlretrieve(img_url,path+str(m)+'.jpg')
m = m + 1
print('Download complete!')
getSogouImag('壁纸',2000,'F:/Py666/抓图/') #抓取后图片存取的本地位置
执行程序:到指定位置找到图片所在的位置,就大功告成了。