Python 通过关键词下载百度图片
原创
©著作权归作者所有:来自51CTO博客作者Python爬虫案例的原创作品,请联系作者获取转载授权,否则将追究法律责任
打开百度图片后,输入相关关键词,根据分析,发现百度图片初始只会渲染部分图像到页面上,随着滚轮下滚,就会请求新的数据,因此我们可以判断页面是经过ajax请求数据后,渲染至页面。百度图片网址:
打开”网络“,可以发现请求的数据非常非常多,而我们只想找刚刚请求的图像数据。通过分析后,发现了如下图所示的链接返回的就是对应的图像数据,因此我们查看参数构建对应的请求即可。
关于图片分页数据是如何构成的呢,通过查看构建的请求参数,可以发现pn,pn是按30、60、90进行排列的。由此判断是 n*30即可,关于queryWord,是关键词编码后的数据,因URL只支持一部分ASCII编码,而中文内容需要进行编码,使用parse.quote()即可。
示例代码如下:
import re
from urllib import parse
import os
import requests
class BaiPic(object):
def download_img(self, index, url, foldername):
if not os.path.exists(f'./{foldername}'):
print(f'{foldername}文件夹不存在,即将创建')
os.mkdir(f'{foldername}')
print('创建成功')
name = f'./{foldername}/{index}.jpg'
content = requests.get(url)
with open(name, 'wb') as f:
f.write(content.content)
def gain_img_url(self, url):
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
" (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36"
}
content = requests.get(url, headers=header)
rule = r'"thumbURL":"(.*?)"'
url_list = re.findall(rule, content.text)
return url_list
def create_url(self, page, name):
urls_list = []
for i in range(1, page + 1):
url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&logid=8641423673525825447' \
'&ipn=rj&ct=201326592&is=&fp=result&fr=&word={}&queryWord={}cl=2&lm=-1&ie=utf-8&oe=utf-8' \
'&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1' \
'&expermode=&nojc=&isAsync=&pn={}&rn=30&gsm=3c&1648349652108='
url = url.format(name, name, i * 30)
urls_list.append(url)
return urls_list
def main_mtd(self):
page = int(input('请输入下载的页数'))
name = input('请输入你要下载的内容')
all_img_urls_list = []
name_ascii = parse.quote(name)
index_url_list = self.create_url(page, name_ascii)
for url in index_url_list:
img_url_list = self.gain_img_url(url)
all_img_urls_list.extend(img_url_list)
for index, url in enumerate(all_img_urls_list):
self.download_img(index, url, name)
if __name__ == '__main__':
baiPic = BaiPic()
baiPic.main_mtd()