配置:ubuntu20、firefox、pycharm、requests、BeautifulSoup
步骤:
1、bing搜索“风景图”,按F12,点击“网络”,点击“XHR”,按F5刷新,滑轮往下拉,进入如图所示状态。
2、与其他的新弹出的get请求对比可知将前面一致的网址复制,后面的舍去,first每次加35即可。
3、查看单张图片HTML代码,可知src为图片url。
代码:
total:请自己按需选取
headers:请自己填写
url:不一定是风景图,bing其他的应该也可以。
response.encoding:按F12搜charset,按网页编码填写
import requests
from requests.exceptions import ReadTimeout, HTTPError, RequestException
from bs4 import BeautifulSoup
import re
import os
import time
def main():
total = 350 # 因为bing每组缩略图是35张,所以total最好是35的倍数
floop = total // 35 # 缩略图总组数
img_loc = "./img" # 储存图片的文件夹
if total % 35 != 0: # 如果total不是35的倍数,如10,则floop需要加1才能下载图片
floop += 1
if not os.path.exists("./img"):
print("不存在图片存储文件夹,进行新建。")
os.mkdir(img_loc)
# 请求头请自己填写
headers = {"User-Agent": ""}
for i in range(0, floop):
# 第几组缩略图网址
url = "https://cn.bing.com/images/async?q=%E9%A3%8E%E6%99%AF%E5%9B%BE&first={}&count=35&cw=1320&ch=383&relp=35&apc=0&tsc=ImageHoverTitle&datsrc=I&layout=RowBased_Landscape&mmasync=1".format(
i * 35)
response = requests.get(url=url, headers=headers, timeout=5)
# 请自己查看网页编码为多少,不为utf-8则进行修改。
response.encoding = "utf-8"
soup = BeautifulSoup(response.text, features="lxml")
if response.status_code == 200:
for idx, j in enumerate(soup.find_all(class_=re.compile("mimg.*"))):
img_url = j["src"]
img_name = idx + i * 35 + 1 # 以第几张图片为名
if img_name == total + 1: # 当total不是35的倍数时,下载到上一张图片为止
break
try:
img_response = requests.get(url=img_url, headers=headers, timeout=3)
img = img_response.content
# 不知道为什么我直接以img_name建立文件,会有plain后缀的图片,所以才进行的重命名。。。
with open(img_loc + "/%s" % img_url.split("/")[-1], "wb") as f:
f.write(img)
# 我用的ubuntu写的,不用加.png等后缀,windows可能要加上.png等后缀。
os.rename(img_loc + "/%s" % img_url.split("/")[-1], img_loc + "/%d" % img_name)
print("第%d张图片下载成功" % img_name)
except ReadTimeout: # 超时异常
print("timeout")
except HTTPError: # HTTP异常
print("http error")
except RequestException: # 请求异常
print("request error")
finally:
time.sleep(1) # 防止访问频率太高封ip
else:
print("第%d组缩略图状态码:" % i, response.status_code)
print("下载完成!")
if __name__ == "__main__":
main()
ps:若哪里有错误或改进地方,请不吝赐教。