Python pyquery 获取千图网部分VIP 无水印原图
在工作时可能会需要很多的素材,千图网为我们提供了一个很好的平台,但多数图片需要开通VIP,今天分享一个可以绕过多数 VIP 才能够下载的方法
由于第一次写博客,会有语言不通或用词不专业等情况,还望多加斧正。
所需库: urllib.request pyquery urllib.parse
分析网页源码
打开千图网中的一个素材图片
右键打开抓包工具,审查元素,
可以看到图示中的素材url在 id = show-area-height 标签下的img scr中
因此得到素材的 url: //preview.qiantucdn.com/58pic/35/76/35/auto_04f58PICt4IeBt75fhbbf_PIC2018.jpg!w1024_new_0
将得到的url复制到地址栏中,看到高清的素材图片展现在眼前。
但是发现并不是我们想要的高清、无水印、下载后免扣图便可直接使用的图片,因此产生一个问题,如何拿到素材真正的地址,而并非是网站用来向用户展示的图片?难道再去学一个PS?难道退而求其次只用这些残次品吗?
不,人向来追求美好,绝不能作罢。
接下来查看网页源代码。
首先进入眼帘的是网页的编码格式为 " gbk ",在后续会用到。
其次,可以看到素材的 url 在 meta 中 content 也有出现。
这些有什么用处我们暂且不谈,先来根据 meta 中的content 中的url,再打开另外的一些素材图片:
//preview.qiantucdn.com/58pic/35/76/35/auto_04f58PICt4IeBt75fhbbf_PIC2018.jpg!w1024//preview.qiantucdn.com/58pic/35/76/35/auto_04f58PICt4IeBt75fhbbf_PIC2018.jpg!w1024_water
//preview.qiantucdn.com/58pic/35/74/79/auto_17658PIC9b2iMREdv697d_PIC2018.jpg!w1024_water
//preview.qiantucdn.com/58pic/35/74/86/png_auto_81X58PIC888fefc2s9GJK_PIC2018.jpg!w1024_water
//preview.qiantucdn.com/original_origin_pic/19/03/17/auto_709be0eaf77adfa23d73936042ac6290_PIC2018.jpg!w1024_water
在这些素材url中,我们可以观察到前两个 url 格式较为统一,而后两者则各有不同。因为第一次写博客,所以这次之讲述其中一种格式的下载方式。
有兴趣的可以自己找一找后两者的下载方式,当然也可以扫描文章末尾的二维码获取所有格式完整的代码。
接下来,继续讨论如何找到无水印的素材地址,以第一种格式为例:
//preview.qiantucdn.com/58pic/35/76/35/auto_04f58PICt4IeBt75fhbbf_PIC2018.jpg!w1024_water
//preview.qiantucdn.com/58pic/35/74/79/auto_17658PIC9b2iMREdv697d_PIC2018.jpg!w1024_water
观察到这种格式的 url 均以//preview.qiantucdn.com/ 开头,不一样是后方的地址。
这时候我们是否想到可以将其后的内容理解为服务器储存该素材的一个编号。像是每位员工都有唯一工号。
但是只有工号,没有部门,岂不是很难管理?
千图网的网址是什么?
https://www.58pic.com/ 像不像一个部门?
俗话说,撑死胆大的,我们不如大胆的来猜想一下,部门,加工号,确定一个员工的工作地点。
所以,https://www.58pic.com/ + 58pic/35/74/79/auto_17658PIC9b2iMREdv697d_PIC2018.jpg!w1024_water
得到一个?没错,崭新的url。
新生儿url:https://www.58pic.com/58pic/35/74/79/auto_17658PIC9b2iMREdv697d_PIC2018.jpg!w1024_water
满怀激动的心情复制到地址栏打开。竟是 …… 404失联
这是什么原因呢?难道是大胆,穷有大胆?出生牛犊不怕虎吗?
有没有听说过这样一则笑话?
一位小学生写到:我的妈妈是一位不到40岁的中年妇女?
“都中年妇女了,还40,40多余的”
“哦,我的妈妈是一位不到40岁多余的中年妇女”
听完笑话了,继续我们的探讨。在这里,就不卖关子了。第一次写博客还挺紧张的。直接奉上真正的下载地址,我们来观察一下。
正宗url: http://apifont.58pic.com/index.php?c=Download&a=downPng&im=//58pic/35/76/35/04f58PICt4IeBt75fhbbf_PIC2018.png
打开后,惊讶??? 直接下载?但是怎么没有自动命名呢?
不管了,我们先来下载看看是否是无水印的素材。
高清,无水印?可以直接使用?实现了?
没错的,这样我们就拿到了真正的下载地址。
来分析一下这个 url:
http://apifont.58pic.com/index.php?c=Download&a=downPng&im=//58pic/35/76/35/04f58PICt4IeBt75fhbbf_PIC2018.png
再来对比我们拼凑的 url:
https://www.58pic.com/58pic/35/74/79/auto_17658PIC9b2iMREdv697d_PIC2018.jpg!w1024_water
我们发现,原来是我们部门错了,部门应该是:http://apifont.58pic.com/index.php?c=Download&a=downPng&im=//
但是,这一部分是如何得到呢?还是那句话,第一次写博客,很紧张,扫描文章末二维码,获得详细解释资料。
再有不同就是 url 中的 auto_ 消失,以及 jpg!w1024_water 被 png 所取代。
所以我们得到真正的下载地址组合方式 http://apifont.58pic.com/index.php?c=Download&a=downPng&im=// + 编号 + .png
对于这个编号,还是上文中提到的工号。按照这个思路,我们来试一试下面的素材url:
//preview.qiantucdn.com/58pic/35/74/79/auto_17658PIC9b2iMREdv697d_PIC2018.jpg!w1024_water
取编号:58pic/35/74/79/auto_17658PIC9b2iMREdv697d_PIC2018
去除auto_:58pic/35/74/79/17658PIC9b2iMREdv697d_PIC2018
组合:又是一个新的url:(http://apifont.58pic.com/index.php?c=Download&a=downPng&im=//58pic/35/74/79/17658PIC9b2iMREdv697d_PIC2018.png)
先来试一试,复制粘贴后
又是一个不自动命名的文件,讨厌。
先下载看一看
我们手动将其后缀改为图片的格式 .png 或者 .jpg
两个素材均无水印,可以直接使用。
按照此思路,我们用代码实现抓取,以及未自动命明的情况在代码中会实现。
import urllib.request as ut
from urllib.parse import unquote,quote
from pyquery import PyQuery as pq
def get_imageurl(url = None):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
url = url
base_url = 'https://apifont.58pic.com/index.php?c=Download&a=downPng&im=/'
# 在分析中提到的部门,如有疑问,请到分析中回顾
req = ut.Request(url = url,headers = headers)
response = ut.urlopen(req).read().decode('gbk')
#分析中有提到网页格式为 gbk 格式所以要解码
data = pq(response)
#基本操作,不用多解释吧?
image_url = data('meta').items()
# 获取分析中的 content 中的 url
name = data('title').text()
# 同分析中的content中的意思,获取 title 中的图片名称
url_1 = base_url_2 + j[23:39] + j[44:73] + ".png&title=" + quote(name)
'''
首先来解释一下 &title + quote(name)
添加title的目的是实现自动命名,而命名的内容便是 name
而 name 为中文格式,可能会出错,所以要转为 url 编码格式
'''
print(url_1)
#至此,实现找出真正的下载地址
if __name__ == '__main__': # 程序入口
url = 'https://www.58pic.com/newpic/35747917.html' #要下载的素材网址
get_imageurl(url) # 在函数中实现功能
在上文中提到,这只是其中的一种解析格式,还有另外的4、5 种解析格式。
在此篇博客中只叙述了格式为:
//preview.qiantucdn.com/xxxxxx/auto_xxxxxxxx.jpg!w1024_water