python获取百度图片
我又来更新了,因为上次写到了如何获取到图片的地址链接,我想了一下 那个网站的图片太少了,我们既然想要获得更多的头像,当然是去百度里面的图片找呀,所以这次就是更新的就是如何去获取百度里面的图片。
一、安装环境
这个环境的安装我在上篇文章里面说明了如何去安装,这里我就不在去一步一步的讲啦,可以去看看
二、对目标网站的了解
我们这次是要对百度的里面的图片,进行获取,首先我们打开目标网站,这里我们可以看到有很多头像,照常按下F12或者右键检查
在检查里面点击左上角的小箭头,移动到图片上面,会发现这里出现了一个地址链接,但是我们在源代码里面却找不到,相关的代码。这是因为百度的这个是通过调用js去调用图片,可以大大减少加载时的缓存,那我们该怎么办呢?点开network
我们点开Network后,选择HXR,然后将滚动栏往下滚动几下,这个时候后面的图片才会出来,我们点击acjson
这个时候我们点开data发现是不是有大约30个文件,我们点开其中一个,发现里面有一些相关信息和名字,这个时候我们找到thumbURL
这个链接找到后,我们将这个链接复制到网页去打开,来证实一些是不是我们找对了
发现我们是不是可以看到这个图片了,那我们就是找对了,百度这个头像它不是全部放在页面,是通过js调用每次是30张,这个时候我们要去找找规律,看他后面的规律是什么样的。
打开Headers,像下滚动,注意我箭头指的那一个,下面两个是做的一个比较,除了这个加30外其他的,大致没什么改变,当然细心的也发现了下面那个GSM也发生了变化,我当时也以为这个变化会影响数据的获取,找了很多解决办法,也没找到规律,就想着要不我先试试,后来发现没有定义这个他也没报错。
现在我们已经基本了解到了结构,那我们现在就去写代码啦。
三、 去伪装请求网址
引入模块
import urllib.request
import requests //请求模块
这里我们给我们需要搜索的名称定义一个变量keyword,这个能理解吗,就是我们在搜索时,输入的是头像,就会从头像全部里面下载,要是定义情侣头像就会从情侣头像里面下载,所以我们给它定义了一个变量,然后我们还需要在pn定义变量,这样给他定义一个循环,后面每次加30,代码就在下面了,有人问这么一长下面的一个代码那里来的,有没有发现上面的那个图和这个很像,没错就是上面的那个图里面的代码。
def getDatas(keyword, pages):
params = []
for i in range(30,30*pages+30,30):
params.append({
'tn': 'resultjson_com',
'ipn': 'rj',
'ct': 201326592,
'is': '',
'fp': 'result',
'queryWord': keyword,
'cl': 2,
'lm': -1,
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': -1,
'z': '',
'ic': 0,
'word': keyword,
's': '',
'se': '',
'tab': '',
'width': '',
'height': '',
'face': 0,
'istype': 2,
'qc': '',
'nc': 1,
'fr': '',
'pn': i,
'rn': 30,
'gsm': '1e',
'1575080574755': ''
})
像这类的大网站都会有反爬的机制,就需要加请求头来伪装浏览器访问
headers = {
‘user-Agent’:'这个里面填写自己的设备信息',
‘Referer’:'这个里面填写自己的获取的网站的信息'
}
四、对需要的图片下载保存
url = "http://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=%CD%B7%CF%F1&fr=ala&oriquery=%E5%A4%B4%E5%83%8F&ala=1&alatpl=portait&pos=0" urls.append(requests.get(url,params=i,headers=headers,proxies=proxy).json().get("data"))
return urls
def getImg(datalist, path):
x = 0
for list in datalist:
for i in list:
if i.get('thumbURL') != None:
print('%s' % i.get('thumbURL'))
urllib.request.urlretrieve(i.get('thumbURL'), path + '%d.jpg' % x)
x += 1
#else:
print('图片链接不存在')
if __name__ == '__main__':
datalist = getDatas('头像', 1) #这个里面头像就是我要搜的名称 数字是我需要获取多少个30
getImg(datalist, 'D:/python/qqimage/images/纹身/')
#这个daralist 里面是我要保存的文件的文件夹,我创建的是一个纹身的文件夹
这样不出意外应该就是可以下载到图片了,我这里是手动创建的文件夹,有可能没有那么高级,大佬忽视,我这个获取到了大概5000千左右图片后就被百度给IP封了,再去请求就会报错,这个我是在开始请求时忘了去用代理IP了,我这两天研究代理IP,一直弄的不是很懂,希望大佬能沟通沟通,交流一下,好啦,今天的就到这啦,有问题或者有不足的希望能指出来,欢迎交流啊!