- 帖子
- 16
- 精华
- 0
- 积分
- 64
- 阅读权限
- 20
- 注册时间
- 2022-9-13
- 最后登录
- 2024-1-19
|
本帖最后由 Danieldepython 于 2022-12-28 12:44 编辑
有时候,我们在找寻素材或者找头像的时候一般都会使用搜索引擎搜索(当然也有专门找头像或素材的)
但是如果觉得整个页面的素材都想要该怎么办呢?当然不可能是自己一个一个右键保存吧
这时候我们就要用到万能的python了
首先,得找到bing图片的url,打开bing,然后搜索想要的然后切换到图片页面,这时,url网址栏会显示页面url,仔细观察,就会找到规律
例如:https://cn.bing.com/images/search?q=bing图片&form=HDRSC2&first=1&tsc=ImageHoverTitle&cw=1177&ch=740
多艘几次就会发现,q参数正是我们想要的
思路就来了,首先用requests爬取页面获取源代码,然后用BeautifulSoup是不是就可以了呢?
再观察一下源代码,我们发现大部分图片的class都是mimg
思路来了,那么就简单了
代码如下:- import requests
- from bs4 import BeautifulSoup
- headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.52"}
- name = input("请输入图片名称:")
- respone = requests.get(f"https://cn.bing.com/images/search?q={name}&form=HDRSC2&first=1&tsc=ImageHoverTitle&cw=1177&ch=740",headers=headers)#请求bing
- respone.encoding = 'utf-8'#更改编码为utf-8
- soup = BeautifulSoup(respone.text,'html.parser')#创建一碗“美味的汤”
- imgs = soup.find_all("img",class_='mimg')
- i = 0
- for img in imgs:
- with open(f'{i}.jpg','wb') as f:
- f.write(requests.get(img['src']).content)#读取图片网址写入文件
复制代码 但是意外出现了,requests居然报错了!(虽然这只是我演示随便写的代码)
在翻下网页源代码,原来,有的img有src有的不是http网址,或https,有的甚至根本就没有src
那么有没有一个只有mimg并且都有src并且都是https或http网址的api呢?答案是有的
首先想到的就是翻页的api,因为bing是个动态页面,那么翻页就肯定会发出翻页请求,这时候抓到了是不是就可以了呢?
打开f12,往下翻,bing果然翻页了,随后,我们成功找到了api
我们看到,https://cn.bing.com/images/async?q=花&first=85&count=35&cw=1177&ch=757&relp=35&apc=0&tsc=ImageHoverTitle&datsrc=I&layout=RowBased_Landscape&mmasync=1&dgState=x*538_y*1134_h*184_c*2_i*71_r*16&IG=368332BF637842CEAAFDB489B6F65E2B&SFX=3&iid=images.5560这一串就是翻页的api
分析后发现,q还是图片搜索,而sfx参数就是重点,这个就是第几页的参数,假设我们要看第5页,直接把sfx改成5就可以了
完整的思路是这样的:用户输入名称和下载到第几页→开始循环,直到爬到用户设定的页面→爬取页面,查看是否为空白页,空白则continue→发现有图片,开始获取src,如果不符合http格式则返回错误并且错误数量加1→如果符合格式则下载保存到img文件夹里→完成数加1,继续循环→提示下载完毕
代码如下:- import requests
- import os
- import re
- from bs4 import BeautifulSoup
- headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.52"}
- while 1:
- os.system("cls")
- name = input("请输入图片名称:")
- sfx = input("下载到第几页(默认1)?:")
- if not sfx:
- sfx = 1
- else:
- sfx = int(sfx)
- i = 0
- error = 0
- if os.path.exists(".\\img\"+name):
- pass
- else:
- os.makedirs(".\\img\"+name)
- ab = "http.*"
- for sfxs in range(sfx):
- bing_image = requests.get(f"https://cn.bing.com/images/async?q={name}&first=124&count=35&cw=1177&ch=757&relp=35&apc=0&tsc=ImageHoverTitle&datsrc=I&layout=RowBased_Landscape&mmasync=1&dgState=x*0_y*0_h*0_c*4_i*106_r*24&IG=C97EC244AD8A4D888841852620EFAA3B&SFX={sfxs}&iid=images.5554",headers=headers)
- bing_image.encoding = 'utf-8'
- text = bing_image.text
- if not text:
- print("无结果!")
- input()
- continue
- soup = BeautifulSoup(text,'html.parser')
- imgs = soup.find_all('img',class_='mimg')
- for img in imgs:
- i += 1
- try:
- img['src']
- except IndexError:
- print("错误:找不到索引")
- error += 1
- continue
- if not re.match(ab,img['src']):
- print("错误:http链接格式不正确,已自动跳过")
- error += 1
- continue
- print("正在下载第"+str(i)+"个图片...")
- jpeg = requests.get(img['src'])
- f = open('.\\img\\'+name+'\\'+str(i)+'.jpg','wb')
- f.write(jpeg.content)
- f.close()
- print(f"第{sfxs+1}页面图片下载完成,实际下载图片数量为{len(imgs)-error}")
复制代码 (我懒得用翻译所以有的变量起的有点随便,凑合着看吧)
代码因为放进来不知道为什么缩进被吃了,可能会有点错误,所以我打算把原代码上传上来
必应图片.zip
(1.21 KB, 下载次数: 2)
开始测试:
测试成功,代码可以跑!
|
|